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




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


toktype := gettok(@tptr);

Целочисленная переменная toktype будет содержать значение, обозначающее тип лексемы. Диапазон возможных значений берется из файла smallsh.inc и включает символы EOL (конец строки),

SEMICOLON и так далее. Переменная tptr является символьным указателем, который будет указывать на саму лексему после вызова gettok. Так как процедура gettok сама выделяет пространство под строки лексем, нужно передать адрес переменной tptr, а не ее значение.

Исходный код процедуры gettok приведен ниже. Обратите внимание, что поскольку она ссылается на символьные указатели tok и ptr, то должна быть включена в тот же исходный файл, что и userin. (Теперь должно быть понятно, зачем была нужна инициализация переменных tok и ptr в начале функции userin.)

 (* Получить лексему и поместить ее в буфер tokbuf *)

function gettok (outptr:ppchar):integer;

var

  _type:integer;

begin

  (* Присвоить указателю на строку outptr значение tok *)

  outptr^ := tok;

  (* Удалить пробелы из буфера, содержащего лексемы *)

  while (ptr^ = ' ') or (ptr^ = #9) do

    inc(ptr);

  (* Установить указатель на первую лексему в буфере *)

  tok^ := ptr^;

  inc(tok);

  (* Установить значение переменной type в соответствии

   * с типом лексемы в буфере *)

  case ptr^ of

    #$a:

    begin

      _type := EOL;

      inc(ptr);

    end;

    '&':

    begin

      _type := AMPERSAND;

      inc(ptr);

    end;

    ';':

    begin

      _type := SEMICOLON;

      inc(ptr);

    end;

    else

    begin

      _type := ARG;

      inc(ptr);

      (* Продолжить чтение обычных символов *)

      while inarg (ptr^) do

      begin

        tok^ := ptr^;

        inc(tok);

        inc(ptr);

      end;

    end;

  end;

  tok^ := #0;

  inc(tok);

  gettok:=_type;

end;

Функция inarg используется для определения того, может ли символ быть частью «обычного» аргумента. Пока можно просто проверять, является ли символ особым для командного интерпретатора команд smallsh или нет:




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