Annotation of researchv9/cmd/bc.y, revision 1.1.1.1

1.1       root        1: %{
                      2:        int *getout();
                      3:        int *bundle();
                      4: %}
                      5: %union {
                      6:        int *iptr;
                      7:        char *cptr;
                      8:        int cc;
                      9:        }
                     10: %start start;
                     11: %type <iptr> stat, def, slist, dlets, e
                     12: %type <iptr> slist, re, fprefix, cargs, eora, cons, constant, lora
                     13: %right '='
                     14: %left '+' '-'
                     15: %left '*' '/' '%'
                     16: %right '^'
                     17: %left UMINUS
                     18: 
                     19: %token <cptr> LETTER
                     20: %type <cptr> EQOP, CRS
                     21: %token <cc> DIGIT, SQRT, LENGTH, _IF, FFF, EQ
                     22: %token <cc> _WHILE _FOR NE LE GE INCR DECR
                     23: %token <cc> _RETURN _BREAK _DEFINE BASE OBASE SCALE
                     24: %token <cc> EQPL EQMI EQMUL EQDIV EQREM EQEXP
                     25: %token <cptr> _AUTO DOT
                     26: %token <cc> QSTR
                     27: 
                     28: %{
                     29: #include <stdio.h>
                     30: FILE *in;
                     31: char cary[1000], *cp = { cary };
                     32: char string[1000], *str = {string};
                     33: int crs = '0';
                     34: int rcrs = '0';  /* reset crs */
                     35: int bindx = 0;
                     36: int lev = 0;
                     37: int ln;
                     38: int *ttp;
                     39: char *ss;
                     40: int bstack[10] = { 0 };
                     41: char *numb[15] = {
                     42:   " 0", " 1", " 2", " 3", " 4", " 5",
                     43:   " 6", " 7", " 8", " 9", " 10", " 11",
                     44:   " 12", " 13", " 14" };
                     45: int *pre, *post;
                     46: %}
                     47: %%
                     48: start  : 
                     49:        |  start stat tail
                     50:                ={
                     51:                        output( $2 );
                     52:                }
                     53:        |  start def dargs ')' '{' dlist slist '}'
                     54:                ={      ttp=bundle( 6,pre, $7, post ,"0",numb[lev],"Q");
                     55:                        conout( ttp, $2 );
                     56:                        rcrs = crs;
                     57:                        output( "" );
                     58:                        lev = bindx = 0;
                     59:                        }
                     60:        ;
                     61: 
                     62: dlist  :  tail
                     63:        | dlist _AUTO dlets tail
                     64:        ;
                     65: 
                     66: stat   :  e 
                     67:                ={ bundle(2, $1, "ps." ); }
                     68:        | 
                     69:                ={ bundle(1, "" ); }
                     70:        |  QSTR
                     71:                ={ bundle(3,"[",$1,"]P");}
                     72:        |  LETTER '=' e
                     73:                ={ bundle(3, $3, "s", $1 ); }
                     74:        |  LETTER '[' e ']' '=' e
                     75:                ={ bundle(4, $6, $3, ":", geta($1)); }
                     76:        |  LETTER EQOP e
                     77:                ={ bundle(6, "l", $1, $3, $2, "s", $1 ); }
                     78:        |  LETTER '[' e ']' EQOP e
                     79:                ={ bundle(8,$3, ";", geta($1), $6, $5, $3, ":", geta($1));}
                     80:        |  _BREAK
                     81:                ={ bundle(2, numb[lev-bstack[bindx-1]], "Q" ); }
                     82:        |  _RETURN '(' e ')'
                     83:                = bundle(4, $3, post, numb[lev], "Q" );
                     84:        |  _RETURN '(' ')'
                     85:                = bundle(4, "0", post, numb[lev], "Q" );
                     86:        | _RETURN
                     87:                = bundle(4,"0",post,numb[lev],"Q");
                     88:        | SCALE '=' e
                     89:                = bundle(2, $3, "k");
                     90:        | SCALE EQOP e
                     91:                = bundle(4,"K",$3,$2,"k");
                     92:        | BASE '=' e
                     93:                = bundle(2,$3, "i");
                     94:        | BASE EQOP e
                     95:                = bundle(4,"I",$3,$2,"i");
                     96:        | OBASE '=' e
                     97:                = bundle(2,$3,"o");
                     98:        | OBASE EQOP e
                     99:                = bundle(4,"O",$3,$2,"o");
                    100:        |  '{' slist '}'
                    101:                ={ $$ = $2; }
                    102:        |  FFF
                    103:                ={ bundle(1,"fY"); }
                    104:        |  error
                    105:                ={ bundle(1,"c"); }
                    106:        |  _IF CRS BLEV '(' re ')' stat
                    107:                ={      conout( $7, $2 );
                    108:                        bundle(3, $5, $2, " " );
                    109:                        }
                    110:        |  _WHILE CRS '(' re ')' stat BLEV
                    111:                ={      bundle(3, $6, $4, $2 );
                    112:                        conout( $$, $2 );
                    113:                        bundle(3, $4, $2, " " );
                    114:                        }
                    115:        |  fprefix CRS re ';' e ')' stat BLEV
                    116:                ={      bundle(5, $7, $5, "s.", $3, $2 );
                    117:                        conout( $$, $2 );
                    118:                        bundle(5, $1, "s.", $3, $2, " " );
                    119:                        }
                    120:        |  '~' LETTER '=' e
                    121:                ={      bundle(3,$4,"S",$2); }
                    122:        ;
                    123: 
                    124: EQOP   :  EQPL
                    125:                ={ $$ = "+"; }
                    126:        |  EQMI
                    127:                ={ $$ = "-"; }
                    128:        |  EQMUL
                    129:                ={ $$ = "*"; }
                    130:        |  EQDIV
                    131:                ={ $$ = "/"; }
                    132:        |  EQREM
                    133:                ={ $$ = "%%"; }
                    134:        |  EQEXP
                    135:                ={ $$ = "^"; }
                    136:        ;
                    137: 
                    138: fprefix        :  _FOR '(' e ';'
                    139:                ={ $$ = $3; }
                    140:        ;
                    141: 
                    142: BLEV   :
                    143:                ={ --bindx; }
                    144:        ;
                    145: 
                    146: slist  :  stat
                    147:        |  slist tail stat
                    148:                ={ bundle(2, $1, $3 ); }
                    149:        ;
                    150: 
                    151: tail   :  '\n'
                    152:                ={ln++;}
                    153:        |  ';'
                    154:        ;
                    155: 
                    156: re     :  e EQ e
                    157:                ={ $$ = bundle(3, $1, $3, "=" ); }
                    158:        |  e '<' e
                    159:                = bundle(3, $1, $3, ">" );
                    160:        |  e '>' e
                    161:                = bundle(3, $1, $3, "<" );
                    162:        |  e NE e
                    163:                = bundle(3, $1, $3, "!=" );
                    164:        |  e GE e
                    165:                = bundle(3, $1, $3, "!>" );
                    166:        |  e LE e
                    167:                = bundle(3, $1, $3, "!<" );
                    168:        |  e
                    169:                = bundle(2, $1, " 0!=" );
                    170:        ;
                    171: 
                    172: e      :  e '+' e
                    173:                = bundle(3, $1, $3, "+" );
                    174:        |  e '-' e
                    175:                = bundle(3, $1, $3, "-" );
                    176:        | '-' e         %prec UMINUS
                    177:                = bundle(3, " 0", $2, "-" );
                    178:        |  e '*' e
                    179:                = bundle(3, $1, $3, "*" );
                    180:        |  e '/' e
                    181:                = bundle(3, $1, $3, "/" );
                    182:        |  e '%' e
                    183:                = bundle(3, $1, $3, "%%" );
                    184:        |  e '^' e
                    185:                = bundle(3, $1, $3, "^" );
                    186:        |  LETTER '[' e ']'
                    187:                ={ bundle(3,$3, ";", geta($1)); }
                    188:        |  LETTER INCR
                    189:                = bundle(4, "l", $1, "d1+s", $1 );
                    190:        |  INCR LETTER
                    191:                = bundle(4, "l", $2, "1+ds", $2 );
                    192:        |  DECR LETTER
                    193:                = bundle(4, "l", $2, "1-ds", $2 );
                    194:        |  LETTER DECR
                    195:                = bundle(4, "l", $1, "d1-s", $1 );
                    196:        | LETTER '[' e ']' INCR
                    197:                = bundle(7,$3,";",geta($1),"d1+",$3,":",geta($1));
                    198:        | INCR LETTER '[' e ']'
                    199:                = bundle(7,$4,";",geta($2),"1+d",$4,":",geta($2));
                    200:        | LETTER '[' e ']' DECR
                    201:                = bundle(7,$3,";",geta($1),"d1-",$3,":",geta($1));
                    202:        | DECR LETTER '[' e ']'
                    203:                = bundle(7,$4,";",geta($2),"1-d",$4,":",geta($2));
                    204:        | SCALE INCR
                    205:                = bundle(1,"Kd1+k");
                    206:        | INCR SCALE
                    207:                = bundle(1,"K1+dk");
                    208:        | SCALE DECR
                    209:                = bundle(1,"Kd1-k");
                    210:        | DECR SCALE
                    211:                = bundle(1,"K1-dk");
                    212:        | BASE INCR
                    213:                = bundle(1,"Id1+i");
                    214:        | INCR BASE
                    215:                = bundle(1,"I1+di");
                    216:        | BASE DECR
                    217:                = bundle(1,"Id1-i");
                    218:        | DECR BASE
                    219:                = bundle(1,"I1-di");
                    220:        | OBASE INCR
                    221:                = bundle(1,"Od1+o");
                    222:        | INCR OBASE
                    223:                = bundle(1,"O1+do");
                    224:        | OBASE DECR
                    225:                = bundle(1,"Od1-o");
                    226:        | DECR OBASE
                    227:                = bundle(1,"O1-do");
                    228:        |  LETTER '(' cargs ')'
                    229:                = bundle(4, $3, "l", getf($1), "x" );
                    230:        |  LETTER '(' ')'
                    231:                = bundle(3, "l", getf($1), "x" );
                    232:        |  cons
                    233:                ={ bundle(2, " ", $1 ); }
                    234:        |  DOT cons
                    235:                ={ bundle(2, " .", $2 ); }
                    236:        |  cons DOT cons
                    237:                ={ bundle(4, " ", $1, ".", $3 ); }
                    238:        |  cons DOT
                    239:                ={ bundle(3, " ", $1, "." ); }
                    240:        |  DOT
                    241:                ={ $<cptr>$ = "l."; }
                    242:        |  LETTER
                    243:                = { bundle(2, "l", $1 ); }
                    244:        |  LETTER '=' e
                    245:                ={ bundle(3, $3, "ds", $1 ); }
                    246:        |  LETTER EQOP e        %prec '='
                    247:                ={ bundle(6, "l", $1, $3, $2, "ds", $1 ); }
                    248:        | LETTER '[' e ']' '=' e
                    249:                = { bundle(5,$6,"d",$3,":",geta($1)); }
                    250:        | LETTER '[' e ']' EQOP e
                    251:                = { bundle(9,$3,";",geta($1),$6,$5,"d",$3,":",geta($1)); }
                    252:        | LENGTH '(' e ')'
                    253:                = bundle(2,$3,"Z");
                    254:        | SCALE '(' e ')'
                    255:                = bundle(2,$3,"X");     /* must be before '(' e ')' */
                    256:        |  '(' e ')'
                    257:                = { $$ = $2; }
                    258:        |  '?'
                    259:                ={ bundle(1, "?" ); }
                    260:        |  SQRT '(' e ')'
                    261:                ={ bundle(2, $3, "v" ); }
                    262:        | '~' LETTER
                    263:                ={ bundle(2,"L",$2); }
                    264:        | SCALE '=' e
                    265:                = bundle(2,$3,"dk");
                    266:        | SCALE EQOP e          %prec '='
                    267:                = bundle(4,"K",$3,$2,"dk");
                    268:        | BASE '=' e
                    269:                = bundle(2,$3,"di");
                    270:        | BASE EQOP e           %prec '='
                    271:                = bundle(4,"I",$3,$2,"di");
                    272:        | OBASE '=' e
                    273:                = bundle(2,$3,"do");
                    274:        | OBASE EQOP e          %prec '='
                    275:                = bundle(4,"O",$3,$2,"do");
                    276:        | SCALE
                    277:                = bundle(1,"K");
                    278:        | BASE
                    279:                = bundle(1,"I");
                    280:        | OBASE
                    281:                = bundle(1,"O");
                    282:        ;
                    283: 
                    284: cargs  :  eora
                    285:        |  cargs ',' eora
                    286:                = bundle(2, $1, $3 );
                    287:        ;
                    288: eora:    e
                    289:        | LETTER '[' ']'
                    290:                =bundle(2,"l",geta($1));
                    291:        ;
                    292: 
                    293: cons   :  constant
                    294:                ={ *cp++ = '\0'; }
                    295: 
                    296: constant:
                    297:          '_'
                    298:                ={ $<cptr>$ = cp; *cp++ = '_'; }
                    299:        |  DIGIT
                    300:                ={ $<cptr>$ = cp; *cp++ = $1; }
                    301:        |  constant DIGIT
                    302:                ={ *cp++ = $2; }
                    303:        ;
                    304: 
                    305: CRS    :
                    306:                ={ $$ = cp; *cp++ = crs++; *cp++ = '\0';
                    307:                        if(crs == '[')crs+= 3;
                    308:                        if(crs == 'a')crs='{';
                    309:                        if(crs >= 0241){yyerror("program too big");
                    310:                                getout();
                    311:                        }
                    312:                        bstack[bindx++] = lev++; }
                    313:        ;
                    314: 
                    315: def    :  _DEFINE LETTER '('
                    316:                ={      $$ = getf($2);
                    317:                        pre = (int *)"";
                    318:                        post = (int *)"";
                    319:                        lev = 1;
                    320:                        bstack[bindx=0] = 0;
                    321:                        }
                    322:        ;
                    323: 
                    324: dargs  :               /*empty*/
                    325:        |  lora
                    326:                ={ pp( $1 ); }
                    327:        |  dargs ',' lora
                    328:                ={ pp( $3 ); }
                    329:        ;
                    330: 
                    331: dlets  :  lora
                    332:                ={ tp($1); }
                    333:        |  dlets ',' lora
                    334:                ={ tp($3); }
                    335:        ;
                    336: lora   :  LETTER
                    337:        ={ $<cptr>$=$1; }
                    338:        |  LETTER '[' ']'
                    339:                ={ $$ = geta($1); }
                    340:        ;
                    341: 
                    342: %%
                    343: # define error 256
                    344: 
                    345: int peekc = -1;
                    346: int sargc;
                    347: int ifile;
                    348: char **sargv;
                    349: 
                    350: char funtab[52] = {
                    351:        01,0,02,0,03,0,04,0,05,0,06,0,07,0,010,0,011,0,012,0,013,0,014,0,015,0,016,0,017,0,
                    352:        020,0,021,0,022,0,023,0,024,0,025,0,026,0,027,0,030,0,031,0,032,0 };
                    353: char atab[52] = {
                    354:        0241,0,0242,0,0243,0,0244,0,0245,0,0246,0,0247,0,0250,0,0251,0,0252,0,0253,0,
                    355:        0254,0,0255,0,0256,0,0257,0,0260,0,0261,0,0262,0,0263,0,0264,0,0265,0,0266,0,
                    356:        0267,0,0270,0,0271,0,0272,0};
                    357: char *letr[26] = {
                    358:   "a","b","c","d","e","f","g","h","i","j",
                    359:   "k","l","m","n","o","p","q","r","s","t",
                    360:   "u","v","w","x","y","z" } ;
                    361: char *dot = { "." };
                    362: yylex(){
                    363:        int c, ch;
                    364: restart:
                    365:        c = getch();
                    366:        peekc = -1;
                    367:        while( c == ' ' || c == '\t' ) c = getch();
                    368:        if(c == '\\'){
                    369:                getch();
                    370:                goto restart;
                    371:        }
                    372:        if( c<= 'z' && c >= 'a' ) {
                    373:                /* look ahead to look for reserved words */
                    374:                peekc = getch();
                    375:                if( peekc >= 'a' && peekc <= 'z' ){ /* must be reserved word */
                    376:                        if( c=='i' && peekc=='f' ){ c=_IF; goto skip; }
                    377:                        if( c=='w' && peekc=='h' ){ c=_WHILE; goto skip; }
                    378:                        if( c=='f' && peekc=='o' ){ c=_FOR; goto skip; }
                    379:                        if( c=='s' && peekc=='q' ){ c=SQRT; goto skip; }
                    380:                        if( c=='r' && peekc=='e' ){ c=_RETURN; goto skip; }
                    381:                        if( c=='b' && peekc=='r' ){ c=_BREAK; goto skip; }
                    382:                        if( c=='d' && peekc=='e' ){ c=_DEFINE; goto skip; }
                    383:                        if( c=='s' && peekc=='c' ){ c= SCALE; goto skip; }
                    384:                        if( c=='b' && peekc=='a' ){ c=BASE; goto skip; }
                    385:                        if( c=='i' && peekc == 'b'){ c=BASE; goto skip; }
                    386:                        if( c=='o' && peekc=='b' ){ c=OBASE; goto skip; }
                    387:                        if( c=='d' && peekc=='i' ){ c=FFF; goto skip; }
                    388:                        if( c=='a' && peekc=='u' ){ c=_AUTO; goto skip; }
                    389:                        if( c == 'l' && peekc=='e'){ c=LENGTH; goto skip; }
                    390:                        if( c == 'q' && peekc == 'u'){getout();}
                    391:                        /* could not be found */
                    392:                        return( error );
                    393:                skip:   /* skip over rest of word */
                    394:                        peekc = -1;
                    395:                        while( (ch = getch()) >= 'a' && ch <= 'z' );
                    396:                        peekc = ch;
                    397:                        return( c );
                    398:                }
                    399: 
                    400:                /* usual case; just one single letter */
                    401: 
                    402:                yylval.cptr = letr[c-'a'];
                    403:                return( LETTER );
                    404:        }
                    405:        if( c>= '0' && c <= '9' || c>= 'A' && c<= 'F' ){
                    406:                yylval.cc = c;
                    407:                return( DIGIT );
                    408:        }
                    409:        switch( c ){
                    410:        case '.':       return( DOT );
                    411:        case '=':
                    412:                switch( (peekc=getch())  ){
                    413:                case '=': c=EQ; goto gotit;
                    414:                case '+': c=EQPL; goto gotit;
                    415:                case '-': c=EQMI; goto gotit;
                    416:                case '*': c=EQMUL; goto gotit;
                    417:                case '/': c=EQDIV; goto gotit;
                    418:                case '%': c=EQREM; goto gotit;
                    419:                case '^': c=EQEXP; goto gotit;
                    420:                default:   return( '=' );
                    421:                          gotit:     peekc = -1; return(c);
                    422:                  }
                    423:        case '+':       return( cpeek( '+', INCR, '=',EQPL, '+' ) );
                    424:        case '-':       return( cpeek( '-', DECR,'=',EQMI, '-' ) );
                    425:        case '*':       return(cpeek( '=', EQMUL,'\0',0,'*'));
                    426:        case '%':       return(cpeek('=', EQREM,'\0',0,'%'));
                    427:        case '^':       return(cpeek('=',EQEXP,'\0',0,'^'));
                    428:        case '<':       return( cpeek( '=', LE,'\0',0, '<' ) );
                    429:        case '>':       return( cpeek( '=', GE,'\0',0, '>' ) );
                    430:        case '!':       return( cpeek( '=', NE,'\0',0, '!' ) );
                    431:        case '/':
                    432:                        if((peekc=getch()) == '='){
                    433:                                peekc = -1;
                    434:                                return(EQDIV);
                    435:                        }
                    436:                if(peekc  == '*'){
                    437:                        peekc = -1;
                    438:                        while((getch() != '*') || ((peekc = getch()) != '/'));
                    439:                        peekc = -1;
                    440:                        goto restart;
                    441:                }
                    442:                else return(c);
                    443:        case '"':       
                    444:                yylval.cptr = str;
                    445:                 while((c=getch()) != '"'){*str++ = c;
                    446:                        if(str >= &string[999]){yyerror("string space exceeded");
                    447:                        getout();
                    448:                }
                    449:        }
                    450:         *str++ = '\0';
                    451:        return(QSTR);
                    452:        default:         return( c );
                    453:        }
                    454: }
                    455: 
                    456: cpeek(c1,yes1,c2,yes2,none)
                    457: char c1,c2,none;
                    458: {
                    459:        int r;
                    460:        peekc = getch();
                    461:        if(peekc == c1)r=yes1;
                    462:        else if(peekc == c2)r=yes2;
                    463:        else
                    464:                return(none);
                    465:        peekc = -1;
                    466:        return(r);
                    467: }
                    468: 
                    469: getch(){
                    470:        int ch;
                    471: loop:
                    472:        ch = (peekc < 0) ? getc(in) : peekc;
                    473:        peekc = -1;
                    474:        if(ch != EOF)return(ch);
                    475:        if(++ifile > sargc){
                    476:                if(ifile >= sargc+2)getout();
                    477:                in = stdin;
                    478:                ln = 0;
                    479:                goto loop;
                    480:        }
                    481:        fclose(in);
                    482:        if((in = fopen(sargv[ifile],"r")) != NULL){
                    483:                ln = 0;
                    484:                ss = sargv[ifile];
                    485:                goto loop;
                    486:        }
                    487:        yyerror("cannot open input file");
                    488: }
                    489: # define b_sp_max 5000
                    490: int b_space [ b_sp_max ];
                    491: int * b_sp_nxt = { b_space };
                    492: 
                    493: int    bdebug = 0;
                    494: int *
                    495: bundle(a){
                    496:        int i, *p, *q;
                    497: 
                    498:        p = &a;
                    499:        i = *p++;
                    500:        q = b_sp_nxt;
                    501:        if( bdebug ) printf("bundle %d elements at %o\n",i,  q );
                    502:        while(i-- > 0){
                    503:                if( b_sp_nxt >= & b_space[b_sp_max] ) yyerror( "bundling space exceeded" );
                    504:                * b_sp_nxt++ = *p++;
                    505:        }
                    506:        * b_sp_nxt++ = 0;
                    507:        yyval.iptr = q;
                    508:        return( q );
                    509: }
                    510: 
                    511: routput(p) int *p; {
                    512:        if( bdebug ) printf("routput(%o)\n", p );
                    513:        if( p >= &b_space[0] && p < &b_space[b_sp_max]){
                    514:                /* part of a bundle */
                    515:                while( *p != 0 ) routput( *p++ );
                    516:        }
                    517:        else printf( p );        /* character string */
                    518: }
                    519: 
                    520: output( p ) int *p; {
                    521:        routput( p );
                    522:        b_sp_nxt = & b_space[0];
                    523:        printf( "\n" );
                    524:        fflush(stdout);
                    525:        cp = cary;
                    526:        crs = rcrs;
                    527: }
                    528: 
                    529: conout( p, s ) int *p; char *s; {
                    530:        printf("[");
                    531:        routput( p );
                    532:        printf("]s%s\n", s );
                    533:        fflush(stdout);
                    534:        lev--;
                    535: }
                    536: 
                    537: yyerror( s ) char *s; {
                    538:        if(ifile > sargc)ss="teletype";
                    539:        printf("c[%s on line %d, %s]pc\n", s ,ln+1,ss);
                    540:        fflush(stdout);
                    541:        cp = cary;
                    542:        crs = rcrs;
                    543:        bindx = 0;
                    544:        lev = 0;
                    545:        b_sp_nxt = &b_space[0];
                    546: }
                    547: 
                    548: pp( s ) char *s; {
                    549:        /* puts the relevant stuff on pre and post for the letter s */
                    550: 
                    551:        bundle(3, "S", s, pre );
                    552:        pre = yyval.iptr;
                    553:        bundle(4, post, "L", s, "s." );
                    554:        post = yyval.iptr;
                    555: }
                    556: 
                    557: tp( s ) char *s; { /* same as pp, but for temps */
                    558:        bundle(3, "0S", s, pre );
                    559:        pre = yyval.iptr;
                    560:        bundle(4, post, "L", s, "s." );
                    561:        post = yyval.iptr;
                    562: }
                    563: 
                    564: yyinit(argc,argv) int argc; char *argv[];{
                    565:        signal( 2, (int(*)())1 );       /* ignore all interrupts */
                    566:        sargv=argv;
                    567:        sargc= -- argc;
                    568:        if(sargc == 0)in=stdin;
                    569:        else if((in = fopen(sargv[1],"r")) == NULL)
                    570:                yyerror("cannot open input file");
                    571:        ifile = 1;
                    572:        ln = 0;
                    573:        ss = sargv[1];
                    574: }
                    575: int *getout(){
                    576:        printf("q");
                    577:        fflush(stdout);
                    578:        exit();
                    579: }
                    580: 
                    581: int *
                    582: getf(p) char *p;{
                    583:        return(&funtab[2*(*p -0141)]);
                    584: }
                    585: int *
                    586: geta(p) char *p;{
                    587:        return(&atab[2*(*p - 0141)]);
                    588: }
                    589: 
                    590: main(argc, argv)
                    591: char **argv;
                    592: {
                    593:        int p[2];
                    594: 
                    595: 
                    596:        if (argc > 1 && *argv[1] == '-') {
                    597:                if((argv[1][1] == 'd')||(argv[1][1] == 'c')){
                    598:                        yyinit(--argc, ++argv);
                    599:                        yyparse();
                    600:                        exit();
                    601:                }
                    602:                if(argv[1][1] != 'l'){
                    603:                        printf("unrecognizable argument\n");
                    604:                        fflush(stdout);
                    605:                        exit();
                    606:                }
                    607:                argv[1] = "/usr/lib/lib.b";
                    608:        }
                    609:        pipe(p);
                    610:        if (fork()==0) {
                    611:                close(1);
                    612:                dup(p[1]);
                    613:                close(p[0]);
                    614:                close(p[1]);
                    615:                yyinit(argc, argv);
                    616:                yyparse();
                    617:                exit();
                    618:        }
                    619:        close(0);
                    620:        dup(p[0]);
                    621:        close(p[0]);
                    622:        close(p[1]);
                    623:        execl("/bin/dc", "dc", "-", 0);
                    624:        execl("/usr/bin/dc", "dc", "-", 0);
                    625: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.