git-svn-id: https://spexeah.com:8443/svn/Asuro@681 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c

This commit is contained in:
kieron
2018-05-10 09:12:34 +00:00
parent 80e373f871
commit b050773dda
16 changed files with 113 additions and 91 deletions

View File

@ -9,14 +9,14 @@ const
VERSION_SUB = '1';
REVISION = '677';
RELEASE = 'ia';
LINE_COUNT = 27661;
LINE_COUNT = 27683;
FILE_COUNT = 89;
DRIVER_COUNT = 32;
FPC_VERSION = '2.6.4';
NASM_VERSION = '2.10.09';
MAKE_VERSION = '3.81';
COMPILE_DATE = '10/05/18';
COMPILE_TIME = '09:07:10';
COMPILE_TIME = '10:07:09';
implementation

View File

@ -6,7 +6,8 @@ uses
console,
lmemorymanager,
util,
strings;
strings,
tracer;
type
{ Managed Linked List }
@ -25,17 +26,27 @@ type
ElementSize : uint32;
end;
{ String Linked List }
procedure STRLL_Add(LinkedList : PLinkedListBase; str : pchar);
function STRLL_Get(LinkedList : PLinkedListBase; idx : uint32) : pchar;
function STRLL_New : PLinkedListBase;
function STRLL_Size(LinkedList : PLinkedListBase) : uint32;
procedure STRLL_Delete(LinkedList : PLinkedListBase; idx : uint32);
procedure STRLL_Free(LinkedList : PLinkedListBase);
procedure STRLL_Clear(LinkedList : PLinkedListBase);
function STRLL_FromString(str : pchar; delimter : char) : PLinkedListBase;
{ Managed Linked List }
function LL_New(ElementSize : uint32) : PLinkedListBase;
function LL_Add(LinkedList : PLinkedListBase) : Void;
function LL_Delete(LinkedList : PLinkedListBase; idx : uint32) : boolean;
function LL_Size(LinkedList : PLinkedListBase) : uint32;
function LL_Insert(LinkedList : PLinkedListBase; idx : uint32) : Void;
function LL_Get(LinkedList : PLinkedListBase; idx : uint32) : Void;
function LL_New(ElementSize : uint32) : PLinkedListBase;
function LL_Add(LinkedList : PLinkedListBase) : Void;
function LL_Delete(LinkedList : PLinkedListBase; idx : uint32) : boolean;
function LL_Size(LinkedList : PLinkedListBase) : uint32;
function LL_Insert(LinkedList : PLinkedListBase; idx : uint32) : Void;
function LL_Get(LinkedList : PLinkedListBase; idx : uint32) : Void;
procedure LL_Free(LinkedList : PLinkedListBase);
function LL_FromString(str : pchar; delimter : char) : PLinkedListBase;
procedure LL_TEST();
function LL_FromString(str : pchar; delimter : char) : PLinkedListBase;
implementation
@ -194,86 +205,7 @@ begin
kfree(void(LinkedList));
end;
{function LL_FromString(str : pchar; delimter : char) : PLinkedListBase; //todo implment function for freeing pointer lists
var
list : PLinkedListBase;
i : uint32 = 0;
out_str : pchar;
elm : puint32;
head : pchar;
base : pchar;
size : uint32;
null_delim : boolean;
begin
list := LL_New(sizeof(uint32));
stringToLL:= list;
head:= str;
base:= head;
null_delim:= false;
while not null_delim do begin
i:=0;
while (head[i] <> delimter) and (head[i] <> char(0)) do begin
inc(i);
end;
if head[i] = char(0) then null_delim:= true;
size:= (uint32(@head[i]) - uint32(base)) + 1;
out_str:= stringNew(size);
memset(uint32(out_str), 0, size);
memcpy(uint32(base), uint32(out_str), size-1);
elm:= puint32(LL_Add(list));
elm
end;
end;}
procedure LL_Test();
var
i : uint32;
LList : PLinkedListBase;
Elem : Void;
Str : PChar;
begin
console.writestringln('Add 3 Elements: ');
LList:= LL_New(10);
Elem:= LL_Add(LList);
Str:= PChar(Elem);
Str[0]:= 'H';
Str[1]:= 'E';
Str[2]:= 'L';
Str[3]:= 'L';
Str[4]:= 'O';
Elem:= LL_Add(LList);
Str:= PChar(Elem);
Str[0]:= 'W';
Str[1]:= 'O';
Str[2]:= 'R';
Str[3]:= 'L';
Str[4]:= 'D';
Elem:= LL_Add(LList);
Str:= PChar(Elem);
Str[0]:= 'T';
Str[1]:= 'E';
Str[2]:= 'S';
Str[3]:= 'T';
for i:=0 to LL_Size(LList)-1 do begin
console.writestringln(PChar(LL_Get(LList, i)));
end;
console.writestringln(' ');
console.writestringln('Remove Element 1:');
LL_Delete(LList, 1);
for i:=0 to LL_Size(LList)-1 do begin
console.writestringln(PChar(LL_Get(LList, i)));
end;
LL_Free(LList);
end;
function LL_FromString(str : pchar; delimter : char) : PLinkedListBase; //todo implment function for freeing pointer lists
function LL_FromString(str : pchar; delimter : char) : PLinkedListBase;
var
list : PLinkedListBase;
i : uint32 = 0;
@ -308,4 +240,94 @@ begin
end;
end;
{ String Linked List }
procedure STRLL_Add(LinkedList : PLinkedListBase; str : pchar);
var
ptr : puint32;
begin
ptr:= puint32(LL_Add(LinkedList));
ptr^:= uint32(str);
end;
function STRLL_Get(LinkedList : PLinkedListBase; idx : uint32) : pchar;
var
ptr : puint32;
begin
ptr:= puint32(LL_Get(LinkedList, idx));
STRLL_Get:= nil;
if ptr <> nil then begin
STRLL_Get:= pchar(ptr^);
end;
end;
function STRLL_New : PLinkedListBase;
begin
STRLL_New:= LL_New(sizeof(uint32));
end;
function STRLL_Size(LinkedList : PLinkedListBase) : uint32;
begin
STRLL_Size:= LL_Size(LinkedList);
end;
procedure STRLL_Delete(LinkedList : PLinkedListBase; idx : uint32);
var
ptr : pchar;
begin
tracer.push_trace('lists.STRLL_Delete (Don''t add static strings)');
ptr:= STRLL_get(LinkedList, idx);
kfree(void(ptr));
LL_Delete(LinkedList, idx);
end;
procedure STRLL_Free(LinkedList : PLinkedListBase);
begin
STRLL_Clear(LinkedList);
LL_Free(LinkedList);
end;
procedure STRLL_Clear(LinkedList : PLinkedListBase);
begin
while STRLL_Size(LinkedList) > 0 do STRLL_Delete(LinkedList, 0);
end;
function STRLL_FromString(str : pchar; delimter : char) : PLinkedListBase;
var
list : PLinkedListBase;
i : uint32 = 0;
out_str : pchar;
elm : puint32;
head : pchar;
tail : pchar;
size : uint32;
null_delim : boolean;
begin
list := LL_New(sizeof(uint32));
STRLL_FromString:= list;
head:= str;
tail:= head;
null_delim:= false;
while not null_delim do begin
if (head^ = delimter) or (head^ = char(0)) then begin
if head^ = char(0) then null_delim:= true;
size:= uint32(head) - uint32(tail);
if size > 0 then begin
elm:= puint32(LL_Add(list));
out_str:= stringNew(size + 1); //maybe
memcpy(uint32(tail), uint32(out_str), size);
elm^:= uint32(out_str);
end;
tail:= head+1;
end;
inc(head);
end;
end;
end.