uses linux,stdio;

const
  TIMEOUT=5;		(* время в секундах *)
  MAXTRIES=5;		(* число попыток *)
  LINESIZE=100;		(* длина строки *)
  CTRL_G=#7;		(* ASCII символ звукового сигнала *)

var
  (* Флаг, определяющий, истекло ли заданное время *)
  timed_out:boolean;
  (* Переменная, которая будет содержать введенную строку *)
  answer:array [0..LINESIZE-1] of char;

(* Выполняется при получении сигнала SIGALRM *)
procedure catch (sig:integer);cdecl;
begin
  (* Установить флаг timed_out *)
  timed_out := TRUE;
  (* Подать звуковой сигнал *)
  write(CTRL_G);
end;


function quickreply(prompt:pchar):pchar;
var
  ntries:integer;
  act, oact:sigactionrec;
begin
  (* Перехватить сигнал SIGALRM и сохранить старый обработчик *)
  act.handler.sh := @catch;
  sigaction (SIGALRM, @act, @oact);
  for ntries:=1 to MAXTRIES do
  begin
    timed_out := FALSE;
    writeln;
    write(prompt, ' > ');
    (* Установить таймер *)
    alarm (TIMEOUT);
    (* Получить введенную строку *)
    gets (answer);
    (* Выключить таймер *)
    alarm (0);
    (* Если флаг timed_out равен TRUE, завершить работу *)
    if not timed_out then
      break;
  end;
  (* Восстановить старый обработчик *)
  sigaction (SIGALRM, @oact, nil);
  (* Вернуть соответствующее значение *)
  if ntries = MAXTRIES then 
    quickreply:=nil
  else quickreply:=answer;
end;


begin
  writeln;
  writeln(quickreply ('Reply'));
end.
