Asuro/src/include/strings.pas

219 lines
4.9 KiB
ObjectPascal

{ ************************************************
* Asuro
* Unit: Strings
* Description: Collection of function for string manipulation.
************************************************
* Author: K Morris
* Contributors:
************************************************ }
unit strings;
interface
uses
util,
lmemorymanager,
lists;
function stringToUpper(str : pchar) : pchar;
function stringToLower(str : pchar) : pchar;
function stringEquals(str1, str2 : pchar) : boolean;
function stringCopy(str : pchar) : pchar;
function stringNew(size : uint32) : pchar;
function stringSize(str : pchar) : uint32;
function stringConcat(str1, str2 : pchar) : pchar;
function stringContains(str : pchar; sub : pchar) : boolean;
function stringToInt(str : pchar) : uint32;
function intToString(i : uint32) : pchar;
function boolToString(b : boolean; ext : boolean) : pchar;
function stringToLL(str : pchar; delimter : char) : PLinkedListBase;
implementation
uses
console;
function stringToUpper(str : pchar) : pchar;
var
result : pchar;
i : uint32;
begin
result:= stringCopy(str);
for i:=0 to stringSize(result) do begin
if (byte(result[i]) >= 97) and (byte(result[i]) <= 122) then result[i]:= char(byte(result[i]) - 32);
end;
stringToUpper:= result;
end;
function stringToLower(str : pchar) : pchar;
var
result : pchar;
i : uint32;
begin
result:= stringCopy(str);
for i:=0 to stringSize(result) do begin
if (byte(result[i]) >= 65) and (byte(result[i]) <= 90) then result[i]:= char(byte(result[i]) + 32);
end;
stringToLower:= result;
end;
function stringEquals(str1, str2 : pchar) : boolean;
var
i : uint32;
begin
stringEquals:= true;
if stringSize(str1) <> stringSize(str2) then begin
stringEquals:= false;
exit;
end else begin
for i:=0 to stringSize(str1)-1 do begin
if str1[i] <> str2[i] then begin
stringEquals:= false;
exit;
end;
end;
end;
end;
function stringCopy(str : pchar) : pchar;
var
result : pchar;
size : uint32;
begin
size:= stringSize(str);
result:= stringNew(size);
memcpy(uint32(str), uint32(result), size);
stringCopy:= result;
end;
function stringNew(size : uint32) : pchar;
var
result : pchar;
begin
result:= pchar(kalloc(size + 1));
memset(uint32(result), 0, size + 1);
stringNew:= result;
end;
function stringSize(str : pchar) : uint32;
var
i : uint32;
begin
i:=0;
while byte(str[i]) <> 0 do begin
inc(i);
end;
stringSize:=i;
end;
function stringConcat(str1, str2 : pchar) : pchar;
var
size : uint32;
result : pchar;
begin
result:= stringNew(stringSize(str1)+stringSize(str2));
memcpy(uint32(str1), uint32(result), stringSize(str1));
memcpy(uint32(str2), uint32(result+stringSize(str1)), stringSize(str2));
stringConcat:= result;
end;
function stringContains(str : pchar; sub : pchar) : boolean;
begin
stringContains:= false;
end;
function stringToInt(str : pchar) : uint32;
var
i : uint32;
x : uint32;
v : uint32;
r : uint32;
begin
stringToInt:= 0;
x:= 1;
r:= 0;
for i:=stringSize(str)-1 downto 0 do begin
v:= byte(str[i]) - 48;
if (v >= 0) and (v <= 9) then begin
r:= r + (v * x);
end;
x:= x * 10;
end;
stringToInt:= r;
end;
function intToString(i : uint32) : pchar;
begin
intToString:= ' ';
end;
function boolToString(b : boolean; ext : boolean) : pchar;
var
t : pchar;
f : pchar;
begin
if ext then begin
t:= stringCopy('true');
f:= stringCopy('false');
end else begin
t:= stringCopy('1');
f:= stringCopy('0');
end;
if b then begin
kfree(void(f));
boolToString:= t;
end else begin
kfree(void(t));
boolToString:= f;
end;
end;
function stringToLL(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;
tail : pchar;
size : uint32;
null_delim : boolean;
begin
list := LL_New(sizeof(uint32));
stringToLL:= 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);
console.writeintln(size);
if size > 0 then begin
elm:= puint32(LL_Add(list));
out_str:= stringNew(size);
memcpy(uint32(tail), uint32(out_str), size);
elm^:= uint32(out_str);
end;
tail:= head+1;
end else begin
console.writecharln(head^);
end;
inc(head);
end;
end;
end.