#include "defs.h" #define ARGMAX 32 #define ARGLEN 512 STATIC STRING arglist[ARGMAX]; STATIC CHAR argchar[ARGLEN]; STATIC CHAR *argc; /* * io library * * S. R. Bourne * Bell Telephone Laboratories * */ INT word() { REG STRING argp=argc; REG INT c; /* ignore initial white space */ WHILE (c=readc())!=EOF ANDF space(c) DO ; OD IF idchar(c) THEN REP *argp++=(c); PER (c=readc())!=EOF ANDF idchar(c) DONE IF c!=',' THEN backspace(standin); FI c=','; ELIF c=='%' THEN WHILE (c=readc())!=NL ANDF c!=EOF DONE ELIF c!=',' ANDF c!=NL ANDF c!=';' ANDF c!=EOF THEN *argp++=c; FI *argp++=0; argc=argp; return(c); } INT args() { REG INT c; REG STRING argp; REG STRING *argl; argc=argp=argchar; argl=arglist; WHILE (c=word())!=EOF ANDF c!=NL ANDF c!=';' DO *argl++ = argp; IF argl-arglist >= ARGMAX THEN argl--; FI argp=argc; OD *argl = nil(STRING); return(c); } INT cmdtyp; STRING *chknxt(src) REG STRING *src; { REG STRING s; /* make sure .c precedes .ch etc */ IF (s = *src) ANDF s[0]=='.' THEN IF s[2]==0 THEN cmdtyp=s[1]; ELIF s[1]!=cmdtyp THEN src = PARSERR; FI FI return(src); } STRING *parse(chk) { REG INT a; REG STRING *src; WHILE (a=args())!=EOF ANDF arglist[0]==nil(STRING) DONE src = (a!=EOF)?arglist:nil(STRING*); if(chk && src) src=chknxt(src); return(src); }