Системное программирование в UNIX средствами Free Pascal



Командный интерпретатор smallsh - часть 2


      userin:=count;

      exit;

    end;

    (* Если строка слишком длинная, начать снова *)

    if c = $a then

    begin

      writeln ('smallsh: слишком длинная входная строка');

      count := 0;

      write (p);

    end;

  end;

end;

Некоторые детали инициализации можно пока не рассматривать. Главное, что функция userin вначале выводит приглашение ввода команды (передаваемое в качестве параметра), а затем считывает ввод пользователя по одному символу до тех пор, пока не встретится символ перевода строки или конец файла (последний случай обозначается символом

EOF).

Функция getchar содержится в стандартной библиотеке ввода/вывода. Она считывает один символ из стандартного ввода программы, который обычно соответствует клавиатуре. Функция userin помещает каждый новый символ (если это возможно) в массив символов inpbuf. После своего завершения функция userin возвращает либо число считанных символов, либо EOF, обозначающий конец файла. Обратите внимание, что символы перевода строки не отбрасываются, а добавляются в массив inpbuf.

Заголовочный файл smallsh.inc, упоминаемый в функции userin, содержит определения для некоторых полезных постоянных (например,

MAXBUF). В действительности файл содержит следующее:

(* smallsh.inc - определения для интерпретатора smallsh *)

{ifndef SMALL_H}

{define SMALL_H}

 

const

  EOL=1;         (* конец строки *)

  ARG=2;         (* обычные аргументы *)

  AMPERSAND=3;         (* символ '&' *)

  SEMICOLON=4;         (* точка с запятой *)

  MAXARG=512;          (* макс. число аргументов *)

  MAXBUF=512;          (* макс. длина строки ввода *)

  FOREGROUND=0;        (* выполнение на переднем плане *)

  BACKGROUND=1;        (* фоновое выполнение *)

 

{endif} (* SMALL_H *)

Другие постоянные, не упомянутые в функции userin, встретятся в следующих процедурах.

Рассмотрим следующую процедуру, gettok. Она выделяет лексемы (tokens) из командной строки, созданной функцией userin. (Лексема является минимальной единицей языка, например, имя или аргумент команды.) Процедура gettok вызывается следующим образом:




Содержание  Назад  Вперед