* Bell Telephone Laboratories
/* ======== character handling for command lines ========*/
REG CHAR
*argp
=locstak()+BYTESPERWORD
;
WHILE (c
=nextc(0), space(c
)) DONE
WHILE (c
=readc()) ANDF c
!=LITERAL
DO
*argp
++=(c
|QUOTE
); chkpr(c
) OD
IF c
=='=' THEN wdset
|= alpha FI
IF
!alphanum(c
) THEN alpha
=0 FI
WHILE (*argp
++=(c
=nextc(d
))) ANDF c
!=d
PER (c
=nextc(0), !eofmeta(c
)) DONE
IF
!letter(argp
->argval
[0]) THEN wdset
=0 FI
IF argp
->argval
[1]==0 ANDF (d
=argp
->argval
[0], digit(d
)) ANDF (c
=='>' ORF c
=='<')
THEN
word(); wdnum
=d
-'0';
ELSE
/*check for reserved words*/
IF reserv
==FALSE
ORF (wdval
=syslook(argp
->argval
,reserved
))==0
THEN wdarg
=argp
; wdval
=0;
ELSE peekc
= d
|MARK
; wdval
= c
;
IF iopend ANDF
eolchar(c
)
THEN
copy(iopend
); iopend
=0;
THEN
chkpr(NL
); d
=nextc(quote
);
ELIF quote ANDF c
!=quote ANDF
!escchar(c
)
ELIF (f
=standin
, f
->fnxt
!=f
->fend
)
THEN
IF (c
= *f
->fnxt
++)==0
THEN IF
estabf(*f
->feval
++)
ELSE
goto retry
; /* = c=readc(); */
IF flags
&readpr ANDF standin
->fstak
==0 THEN
prc(c
) FI
IF c
==NL THEN f
->flin
++ FI
ELIF f
->feof ORF f
->fdes
<0
THEN
close(f
->fdes
); f
->fdes
= -1; c
=EOF
; f
->feof
++;
ELSE f
->fend
= (f
->fnxt
= f
->fbuf
)+len
;
REP IF trapnote
&SIGSET THEN
newline(); sigchk() FI
PER (len
=read(f
->fdes
,f
->fbuf
,f
->fsiz
))<0 ANDF trapnote DONE