home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / rat / r1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  4.4 KB  |  260 lines

  1. #include "r.h"
  2.  
  3. char    scrat[500];
  4.  
  5. int    brkptr    -1;
  6. int    brkstk[10];
  7. int    forptr    0;
  8. int    forstk[10];
  9.  
  10. repcode() {
  11.     outcont(0);
  12.     yyval = genlab();
  13.     outcont(yyval);
  14.     brkstk[++brkptr] = yyval+1;
  15.     genlab();
  16.     genlab();
  17. }
  18.  
  19. untils(p1) int p1; {
  20.     outnum(p1+1);
  21.     outcode("\tif(.not.");
  22.     balpar(scrat);
  23.     outcode(scrat);
  24.     outcode(")");
  25.     outgoto(p1);
  26.     outcont(p1+2);
  27.     brkptr--;
  28. }
  29.  
  30. ifcode(p1) int p1; {
  31.     outcode("\tif(.not.");
  32.     balpar(scrat);
  33.     outcode(scrat);
  34.     outcode(")");
  35.     outgoto(yyval=genlab()); genlab();
  36. }
  37.  
  38. whilecode(p1) int p1; {
  39.     outcont(0);
  40.     brkstk[++brkptr] = yyval = genlab(); genlab();
  41.     outnum(yyval);
  42.     outcode("\tif(.not.");
  43.     balpar(scrat);
  44.     outcode(scrat);
  45.     outcode(")");
  46.     outgoto(yyval+1);
  47. }
  48.  
  49. whilestat(p1) int p1; {
  50.     outgoto(p1);
  51.     outcont(p1+1);
  52.     brkptr--;
  53. }
  54.  
  55. balpar(bp) char *bp; {
  56.     int  i, c, lpar;
  57.     extern int peek;
  58.     while( (c=getc()) == ' ' || c == '\t' || c=='\n' );
  59.     peek = c;
  60.     if( c != '(' ){
  61.         error("missing left paren");
  62.         bp[0] = '\0';
  63.         return(bp);
  64.     }
  65.     for( lpar=i=0; (bp[i++]=c=getc())!='\0'; ){
  66.         if( c=='\'' || c=='"' )
  67.             while( (bp[i++]=getc()) != c );
  68.         if( i>=499 || c=='{' || c=='}' ){
  69.             error("missing right parenthesis at %.20s", bp);
  70.             break;
  71.         }
  72.         if( c=='(' )
  73.             lpar++;
  74.         else if( c==')' )
  75.             lpar--;
  76.         if( lpar == 0 )
  77.             break;
  78.     }
  79.     bp[i] = '\0';
  80.     return(bp);
  81. }
  82.  
  83. int    labval    23000;
  84.  
  85. genlab(){
  86.     return(++labval);
  87. }
  88.  
  89. gokcode(p1) char *p1; {
  90.     outcode("\t");
  91.     outcode(p1);
  92.     eatup(p1,scrat);
  93.     outcode(scrat);
  94.     outcode(0);
  95. }
  96.  
  97. eatup(p1,bp) char *p1, *bp; {
  98.     extern int peek;
  99.     int i,c,lnb,lpar;
  100.     lnb = '\n';
  101.     while( c = *p1++ )
  102.         if( c!=' ' )
  103.             lnb = c;
  104.     i = lpar = 0;
  105.   more:
  106.     for( ; (bp[i++]=c=getc())!=';' && c!='{' && c!='\n' && c!='}'; ){
  107.         if( i>=499 ){
  108.             error("statement too long at %.20s", bp);
  109.             break;
  110.         }
  111.         if( c != ' ' && c != '\t' )
  112.             lnb = c;
  113.         if( c=='\'' || c=='"' )
  114.             while( (bp[i++]=getc()) != c );
  115.         if( c=='(' )
  116.             lpar++;
  117.         else if( c==')' ) {
  118.             lpar--;
  119.             if( lpar < 0 )
  120.                 error("missing left paren at %.20s",bp);
  121.         }
  122.     }
  123.     if( c == '\n' ){
  124.         if( lnb=='\n' || lnb=='+' || lnb=='-' || lnb=='*' || lnb=='('
  125.             || lnb=='/' || lnb==',' || lnb=='&'  || lnb=='|'
  126.             || lnb=='=' )
  127.                 goto more;
  128.         c = ';';
  129.     }
  130.     if( c!=';' )
  131.         peek = c;
  132.     bp[i-1] = '\0';
  133.     if( lpar > 0 )
  134.         error("missing right paren at %.20s",bp);
  135.     return(bp);
  136. }
  137.  
  138. forcode(){
  139.     extern int peek;
  140.     int i,j,c;
  141.     char *bp, *getvec();
  142.     outcont(0);
  143.     balpar(scrat);
  144.     yyval = genlab(); genlab(); genlab();
  145.     brkstk[++brkptr] = yyval+1;
  146.     if( scrat[0] == '\0' ){
  147.         forstk[forptr++] = bp = getvec(1);
  148.         *bp = '\0';
  149.         return;
  150.     }
  151.     scrat[0] = '\t';
  152.     for( i=1; (c=scrat[i++])!=';' && c!='\0' ; )
  153.         if( c=='\'' || c=='"' )
  154.             while( scrat[i++] != c );
  155.     scrat[i-1] = '\0';
  156.     if( nonblank(scrat) ){
  157.         outcode(scrat);
  158.         outcode(0);
  159.     }
  160.     for( j=i; (c=scrat[i++])!=';' && c!='\0' ; )
  161.         if( c=='\'' || c=='"' )
  162.             while( scrat[i++] != c );
  163.     scrat[i-1] = '\0';
  164.     if( nonblank(&scrat[j]) ){
  165.         outnum(yyval);
  166.         outcode("\tif(.not.(");
  167.         outcode(&scrat[j]);
  168.         outcode("))");
  169.         outgoto(yyval+2);
  170.     }
  171.     else
  172.         outcont(yyval);
  173.     for( j=0; scrat[i+1]!='\0'; )
  174.         scrat[j++] = scrat[i++];
  175.     scrat[j] = '\0';
  176.     forstk[forptr++] = bp = getvec(j+1);
  177.     for(i=0; *bp++ = scrat[i++]; );
  178. }
  179.  
  180. forstat(p1) int p1; {
  181.     char *bp, *q;
  182.     int i;
  183.     bp = forstk[--forptr];
  184.     outnum(p1+1);
  185.     if( nonblank(bp) ){
  186.         outcode("\t");
  187.         outcode(bp);
  188.         outcode(0);
  189.     }
  190.     outgoto(p1);
  191.     outcont(p1+2);
  192.     for( q=bp; *q++; );
  193.     relvec(bp, q-bp);
  194.     brkptr--;
  195. }
  196.  
  197. docode(new,p1) int new; char *p1; {
  198.     outcode("\t");
  199.     outcode(p1);
  200.     eatup(p1,scrat);
  201.     yyval = 0;
  202.     if(new){
  203.         yyval = genlab(); genlab();
  204.         brkstk[++brkptr] = yyval;
  205.         outnum(yyval);
  206.     }
  207.     outcode(scrat);
  208.     outcode(0);
  209. }
  210.  
  211. dostat(p1) int p1; {
  212.     if( p1==0 )
  213.         return;
  214.     outcont(p1);
  215.     outcont(p1+1);
  216.     brkptr--;
  217. }
  218.  
  219. breakcode(p1) int p1; {
  220.     if(brkptr<0){
  221.         error("illegal BREAK");
  222.         return;
  223.     }
  224.     outgoto(brkstk[brkptr]+1);
  225. }
  226.  
  227. nextcode(p1) int p1; {
  228.     if(brkptr<0){
  229.         error("illegal NEXT");
  230.         return;
  231.     }
  232.     outgoto(brkstk[brkptr]);
  233. }
  234.  
  235. nonblank(s) char *s; {
  236.     int c;
  237.     while( c = *s++ )
  238.         if( c!=' ' && c!='\t' && c!='\n' )
  239.             return(1);
  240.     return(0);
  241. }
  242.  
  243. error(s1, s2) char *s1, *s2; {
  244.     extern int linect[],ninclude,infile;
  245.     printf( 2, "error at line %d, file %d: ",linect[ninclude],infile);
  246.     printf( 2, s1,s2);
  247.     printf( 2, "\n");
  248.     errorflag = 1;
  249. }
  250.  
  251. errcode(p1) char *p1; {
  252.     int c;
  253.     extern int yychar;
  254.     extern int linect[],ninclude,infile;
  255.     printf( 2, "\nsyntax error, line %d, file %d\n", linect[ninclude],infile);
  256.     while( (c=getc()) != ';' && c != '}' && c != '\n' && c != '\0' );
  257.     yychar = -1;
  258.     errorflag = 1;
  259. }
  260.