123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- module inter; % Functions for interactive support.
- % Author: Anthony C. Hearn.
- % Copyright (c) 1993 RAND. All rights reserved.
- fluid '(!*echo !*int);
- global '(!$eof!$
- !$eol!$
- !*lessspace
- cloc!*
- contl!*
- curline!*
- edit!*
- eof!*
- erfg!*
- flg!*
- ifl!*
- ipl!*
- key!*
- ofl!*
- opl!*
- techo!*);
- symbolic procedure pause;
- %Must appear at the top-most level;
- if null !*int then nil
- else if key!* eq 'pause then pause1 nil
- else %typerr('pause,"lower level command");
- pause1 nil; % Allow at lower level for now.
- symbolic procedure pause1 bool;
- begin scalar x;
- if bool then
- if getd 'edit1 and erfg!* and cloc!* and yesp "Edit?"
- then return <<contl!* := nil;
- if ofl!* then <<lprim list(car ofl!*,'shut);
- close cdr ofl!*;
- opl!* := delete(ofl!*,opl!*);
- ofl!* := nil>>;
- edit1(cloc!*,nil)>>
- else if flg!* then return (edit!* := nil);
- if null ifl!* or yesp "Cont?" then return nil;
- ifl!* := list(car ifl!*,cadr ifl!*,curline!*);
- if x := assoccar(car ifl!*,contl!*)
- then <<contl!* := delete(x,contl!*); close cadar x>>;
- contl!* := (ifl!* . cdr ipl!* . !*echo) . contl!*;
- ifl!* := ipl!* := nil;
- rds nil;
- !*echo := techo!*
- end;
- symbolic procedure assoccar(u,v);
- % Returns element of v in which caar of that element = u.
- if null v then nil
- else if u=caaar v then car v
- else assoccar(u,cdr v);
- symbolic procedure yesp u;
- begin scalar ifl,ofl,x,y;
- if ifl!*
- then <<ifl := ifl!* := list(car ifl!*,cadr ifl!*,curline!*);
- rds nil>>;
- if ofl!* then <<ofl:= ofl!*; wrs nil>>;
- if null !*lessspace then terpri();
- if atom u then prin2 u else lpri u;
- prin2t " (Y or N)";
- if null !*lessspace then terpri();
- y := setpchar '!?;
- x := yesp1();
- setpchar y;
- if ofl then wrs cdr ofl;
- if ifl then rds cadr ifl;
- cursym!* := '!*semicol!*;
- return x
- end;
- symbolic procedure yesp1;
- % Basic loop for reading response.
- begin scalar bool,x,y;
- a: x := readch();
- if x eq !$eol!$ then go to a
- % Assume an end-of-file means lost control and exit.
- else if x eq !$eof!$ then eval '(bye)
- %% else if (y := x eq 'y) or x eq 'n then return y
- else if (y := x memq '(!y !Y)) or x memq '(!n !N)
- then return y % F.J. Wright.
- else if null bool then <<prin2t "Type Y or N"; bool := t>>;
- go to a
- end;
- symbolic procedure cont;
- begin scalar fl,techo;
- if ifl!* then return nil % CONT only active from terminal.
- else if null contl!* then rerror(rlisp,28,"No file open");
- fl := caar contl!*;
- ipl!* := fl . cadar contl!*;
- techo := cddar contl!*;
- contl!* := cdr contl!*;
- if car fl=caar ipl!* and cadr fl=cadar ipl!*
- then <<ifl!* := fl;
- if fl then <<rds cadr fl; curline!* := caddr fl>>
- else rds nil;
- !*echo := techo>>
- else <<eof!* := 1; lprim list(fl,"not open"); error1()>>
- end;
- deflist ('((cont endstat) (pause endstat) (retry endstat)),'stat);
- flag ('(cont),'ignore);
- endmodule;
- end;
|