git-svn-id: https://spexeah.com:8443/svn/Asuro@259 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
kieron 2017-10-26 03:42:34 +00:00
parent 60c5febc60
commit 38a2363051
7 changed files with 111 additions and 48 deletions

BIN
Asuro.iso

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -23,6 +23,8 @@ 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;
implementation
@ -122,4 +124,30 @@ 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;
end.

View File

@ -15,7 +15,8 @@ uses
console,
keyboard,
util,
lmemorymanager;
lmemorymanager,
strings;
type
PParamList = ^TParamList;
@ -50,6 +51,21 @@ function getParams(buf : TCommandBuffer) : PParamList;
implementation
function paramCount(params : PParamList) : uint32;
var
current : PParamList;
i : uint32;
begin
current:= params;
i:= 0;
while current^.param <> nil do begin
inc(i);
current:= current^.next;
end;
paramCount:= i-1;
end;
function getParams(buf : TCommandBuffer) : PParamList;
var
start, finish : uint32;
@ -86,6 +102,36 @@ begin
getParams:= root;
end;
function getParam(index : uint32; params : PParamList) : pchar;
var
result : pchar;
search : PParamList;
begin
result:= nil;
search:= params;
for i:=0 to index do begin
search:= search^.next;
end;
result:= search^.param;
end;
procedure freeParams(params : PParamList);
var
p : PParamList;
next : PParamList;
begin
p:= params;
next:= p^.next;
while p^.next <> nil do begin
if p^.param <> nil then kfree(void(p^.param));
kfree(void(p));
p:= next;
next:= p^.next;
end;
end;
procedure testParams(params : PParamList);
begin
while params^.Param <> nil do begin
@ -133,6 +179,15 @@ begin
end;
end;
procedure test(params : PParamList);
begin
if paramCount(params) > 0 then begin
console.writeintln(stringToInt(params^.next^.param));
end else begin
console.writestringln('Invalid number of params');
end;
end;
procedure registerCommand(command : pchar; method : TCommandMethod; description : pchar);
var
index : uint32;
@ -146,68 +201,47 @@ begin
Commands[index].description:= description;
end;
procedure upper;
var
i : uint32;
begin
for i:=0 to bIndex do begin
if char(buffer[i]) = ' ' then exit;
if (buffer[i] >= 97) and (buffer[i] <= 122) then begin
buffer[i]:= buffer[i] - 32;
end;
end;
end;
function isCommand(command : pchar) : boolean;
var
i : uint32;
begin
isCommand:= true;
for i:=0 to bIndex do begin
if char(buffer[i]) = ' ' then begin
if i = 0 then isCommand:= false;
exit;
end;
if char(buffer[i]) <> char(command[i]) then begin
isCommand:= false;
exit;
end;
end;
end;
procedure process_command;
var
fallthrough : boolean;
params : PParamList;
i : uint32;
next : PParamList;
uppera, upperb : pchar;
begin
{ Start a new line. }
console.writecharln(' ');
{ Enable fallthrough/Unrecognized command }
fallthrough:= true;
upper;
for i:=0 to 65534 do begin
if Commands[i].registered then begin
if isCommand(Commands[i].command) then begin
params:= getParams(buffer);
Commands[i].method(params);
params:= params;
next:= params^.next;
while params^.next <> nil do begin
if params^.param <> nil then kfree(void(params^.param));
kfree(void(params));
params:= next;
next:= params^.next;
{ Get all params and check params[0] (the command) to see if it's registered }
params:= getParams(buffer);
if params^.param <> nil then begin
uppera:= stringToUpper(params^.param);
for i:=0 to 65534 do begin
if Commands[i].registered then begin
upperb:= stringToUpper(Commands[i].command);
if stringEquals(uppera, upperb) then begin
Commands[i].method(params);
fallthrough:= false;
end;
fallthrough:= false;
kfree(void(upperb));
end;
end;
kfree(void(uppera));
end;
{ Free the params }
freeParams(params);
{ Display message if command is unknown AKA fallthrough is active }
if fallthrough then begin
console.writestringln('Unknown Command.');
end;
{ Reset the terminal ready for the next command }
console.writestring('Asuro#> ');
bIndex:= 0;
memset(uint32(@buffer[0]), 0, 1024);
@ -243,6 +277,7 @@ begin
registerCommand('HELP', @help, 'Lists all registered commands and their description.');
registerCommand('ECHO', @echo, 'Echo''s text to the terminal.');
registerCommand('TESTPARAMS', @testParams, 'Tests param parsing.');
registerCommand('TEST', @test, 'Command for testing.')
end;
procedure run;