Теперь можно составить функцию, которая
const
special:array [0..5] of char = (' ', #9, '&', ';', #$a, #0);
function inarg(c:char):boolean;
var
wrk:pchar;
begin
wrk := special;
while wrk^<>#0 do
begin
if c = wrk^ then
begin
inarg:=false;
exit;
end;
inc(wrk);
end;
inarg:=true;
end;
Теперь можно составить функцию, которая будет выполнять главную работу нашего интерпретатора. Функция procline будет разбирать командную строку, используя процедуру gettok, создавая тем самым список аргументов процесса. Если встретится символ перевода строки или точка с запятой, то она вызывает для выполнения команды процедуру runcommand. При этом она предполагает, что командная строка уже была считана при помощи функции userin.
{$i smallsh.inc}
function procline:integer; (* обработка строки ввода *)
var
arg:array [0..MAXARG] of pchar; (* массив указателей для runcommand *)
toktype:integer; (* тип лексемы в команде *)
narg:integer; (* число аргументов *)
_type:integer; (* на переднем плане или в фоне *)
begin
narg := 0;
while true do (* бесконечный цикл *)
begin
(* Выполнить действия в зависимости от типа лексемы *)
toktype := gettok (@arg[narg]);
case toktype of
2://ARG
if narg < MAXARG then
inc(narg);
1,3,4://EOL,SEMICOLON, AMPERSAND:
begin
if toktype = AMPERSAND then
_type := BACKGROUND
else
_type := FOREGROUND;
if narg <> 0 then
begin
arg[narg] := nil;
runcommand (arg, _type);
end;
if toktype = EOL then
exit;
narg := 0;
end;
end;
end;
end;
Следующий этап состоит в определении процедуры
runcommand, которая в действительности запускает командные процессы. Процедура runcommand в сущности, является переделанной процедурой docommand, с которой встречались раньше. Она имеет еще один целочисленный параметр
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий