home *** CD-ROM | disk | FTP | other *** search
- # include "r.h"
-
- char *keyword []{
- "do", "DO", /* have to be first */
- "if", "IF",
- "else", "ELSE",
- "for", "FOR",
- "repeat", "REPEAT",
- "until", "UNTIL",
- "while", "WHILE",
- "break", "BREAK",
- "next", "NEXT",
- "define", "DEFINE",
- "include", "INCLUDE",
- 0};
-
- #include "y.tab.c"
-
- int keytran[]{
- 0, 0,
- XIF, XIF,
- XELSE, XELSE,
- XFOR, XFOR,
- REPEAT, REPEAT,
- UNTIL, UNTIL,
- XWHILE, XWHILE,
- XBREAK, XBREAK,
- NEXT, NEXT,
- XDEFINE, XDEFINE,
- XINCLUDE, XINCLUDE,
- 0};
-
- int svargc;
- char **svargv;
- int infile 0;
- int fd 0;
- int ninclude 0;
- int filestack[10];
- int linect[10];
-
- main(argc,argv) int argc; char **argv; {
- contfld = errorflag = 0;
- if(argc>1 && argv[1][0]=='-'){
- if(argv[1][1]=='6')
- contfld=6;
- argc--;
- argv++;
- }
- svargc = argc;
- svargv = argv;
- filestack[0] = infile = fd = ninclude = linect[0] = 0;
- if(--svargc>0)
- if( (fd = filestack[0] = copen(svargv[++infile],'r')) < 0 ) {
- error("can't open %s", svargv[infile]);
- cexit(1);
- }
- yyparse();
- cexit(errorflag);
- }
-
- int peek -1;
- int nextchar '\n';
-
- getc(){
- nextchar = (peek<0) ? gchar(): peek;
- peek = -1;
- return(nextchar);
- }
-
- int gcp 0;
- char gcbuf[300];
- int apos -1;
-
- gchar(){
- extern int linect[], nnames;
- extern char *names[], *nameptr[];
- int c,i,atype,t;
- if( c=gcbuf[gcp++] )
- return(c);
- loop:
- for(gcp=0; (c=gcbuf[gcp]=cgetc(fd))!='\0' ; gcp++ ){
- if( gcbuf[0]== '%' ){
- while(putchar(cgetc(fd))!='\n');
- gcp = -1;
- ++linect[ninclude];
- continue;
- }
- if( (atype=alphanum(c)) && apos < 0 ){
- apos = gcp;
- continue;
- }
- if( !atype )
- if( apos >= 0 ){
- gcbuf[gcp] = '\0';
- if( nnames>0 && (t=lookup(&gcbuf[apos],names))>=0){
- for(i=0;gcbuf[apos++]=nameptr[t][i];i++);
- gcp = apos-1;
- }
- apos = -1;
- gcbuf[gcp] = c;
- }
- if( c < ' ' && (c!='\n' && c!='\t') ) /* strip crap */
- c = gcbuf[gcp] = ' ';
- if( c=='#' ){
- gcbuf[gcp] = '\n';
- while( (c=cgetc(fd))!='\n' && c!='\0');
- }
- if( c=='"' || c=='\'' ){
- while( (gcbuf[++gcp]=t=cgetc(fd)) != c )
- if( t=='\n' ) {
- error("unbalanced quote");
- gcbuf[gcp] = c;
- gcbuf[++gcp] = c = '\n';
- goto newline;
- }
- continue;
- }
- newline:
- if( c=='\n' ){
- gcbuf[gcp+1] = '\0';
- gcp = 1;
- ++linect[ninclude];
- return(gcbuf[0]);
- }
- }
- if(ninclude){
- cclose(filestack[ninclude--]);
- fd = filestack[ninclude];
- goto loop;
- }
- cclose(filestack[ninclude]);
- if(--svargc>0){
- if( (fd = filestack[ninclude] = copen(svargv[++infile],'r')) < 0) {
- error("can't open %s", svargv[infile]);
- cexit(1);
- }
- linect[0] = 0;
- goto loop;
- }
- return(0);
- }
-
- inclstat(){
- int i,c;
- char fname[100];
- while( (c=getc())==' ' || c=='\t' );
- peek = c;
- for(i=0; (fname[i]=c=getc())!='\n' && c!=';' && c!=' ' && c!='\t'; i++);
- fname[i] = '\0';
- if( (fd = copen(fname,'r')) < 0 ) {
- error("can't open %s", fname);
- cexit(1);
- }
- else {
- filestack[++ninclude] = fd;
- linect[ninclude] = 0;
- }
- }
-
- lookup(string,tbl) char *string; char *tbl[]; {
- register i,j, r;
- for(i=0; tbl[i]!=0; i++){
- for( j=0; (r=tbl[i][j])==string[j] && r!='\0'; j++);
- if( r == string[j] )
- return(i);
- }
- return( -1 );
- }
-
- char str[200];
- int strp;
- int nstr;
-
- yylex(){
- int c, type;
- top:
- while( (c=getc())==' ' || c=='\n' || c=='\t' );
- yylval = c;
- switch(c){
-
- case '\0':
- return('\0');
- case ';':
- return(SCOL);
- case'{':
- return(LCURL);
- case '}':
- return(RCURL);
- }
- peek = c;
- nstr = getstr(str);
- yylval = &str[0];
- if( alldigits(str) )
- return(DIGITS);
- type = lookup(str,keyword);
- if( keytran[type]==XDEFINE ) {
- defstat();
- goto top;
- } else if( keytran[type]==XINCLUDE ) {
- inclstat();
- goto top;
- } else if( type > 1 )
- return(keytran[type]);
- else if( type < 0 )
- return(XGOK);
- while( (c=getc())==' ' || c=='\t' || c=='\n' );
- peek = c;
- if( c>='a' && c<='z' || c>='A' && c<='Z' )
- return(NEWDO);
- else
- return(OLDDO);
- }
-
- getstr(s) char *s; {
- int c, sp;
- for (sp=0; (c=s[sp++]=getc())!=' ' && c!='\t' && c!='\n' && c!='{' && c!='}'
- && c!=';' && c!='(' && c!=')' ; )
- if( c=='\'' || c=='"' )
- while( (s[sp++]=getc())!=c );
- peek = c;
- s[--sp]='\0';
- return(sp);
- }
-
- alldigits(s) char *s; {
- int c;
- if( *s == '\0' )
- return(0);
- while( (c = *s++) != '\0' )
- if( c<'0' || c>'9' )
- return(0);
- return(1);
- }
-
- int dbg 0;
-
- yyerror(){;}
-
- alphanum(c) int c; {
- if(c>='0' && c<='9') return(1);
- if(c>='a' && c<='z') return(1);
- if(c>='A' && c<='Z') return(1);
- return(0);
- }
-
- #define MAXNAMES 100
-
- char *names[MAXNAMES];
- char *nameptr[MAXNAMES];
- int nnames 0;
-
- defstat(){
- int c,i,index;
- extern int peek,nstr;
- extern char str[];
- char *getvec();
- while( (c=getc())==' ' || c=='\t' );
- peek = c;
- for(nstr=0; c=getc(); nstr++ ){
- if(c==' ' || c=='\t' || c=='\n') break;
- str[nstr] = c;
- }
- peek = c;
- str[nstr] = '\0';
- if( (index=lookup(str,names)) >= 0 )
- nameptr[index] = 0;
- else if( (index = nnames++)>=MAXNAMES-1 ){
- error("too many defined names");
- cexit(1);
- }
- names[index] = getvec(nstr+1);
- for( i=0; names[index][i]=str[i]; i++ );
- while( (c=getc())==' ' || c=='\t' );
- peek = c;
- for( i=0; (c=getc())!='\n' && c!='\0'; i++ )
- str[i] = c;
- str[i] = '\0';
- nameptr[index] = getvec(i+1);
- for( i=0; nameptr[index][i]=str[i]; i++ );
- }
-
-