home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 223_01 / cc32.c < prev    next >
Encoding:
Text File  |  1979-12-31  |  6.8 KB  |  246 lines

  1. hier13(lval)  int lval[];  {
  2.   int k;
  3.   char *ptr;
  4.   if(match("++")) {                   /* ++lval */
  5.     if(hier13(lval)==0) {
  6.       needlval();
  7.       return 0;
  8.       }
  9.     step(inc, lval);
  10.     return 0;
  11.     }
  12.   else if(match("--")) {              /* --lval */
  13.     if(hier13(lval)==0) {
  14.       needlval();
  15.       return 0;
  16.       }
  17.     step(dec, lval);
  18.     return 0;
  19.     }
  20.   else if (match("~")) {              /* ~ */
  21.     if(hier13(lval)) rvalue(lval);
  22.     com();
  23.     lval[4] = ~lval[4];
  24.     return (lval[7]=0);
  25.     }
  26.   else if (match("!")) {              /* ! */
  27.     if(hier13(lval)) rvalue(lval);
  28.     lneg();
  29.     lval[4] = !lval[4];
  30.     return (lval[7]=0);
  31.     }
  32.   else if (match("-")) {              /* unary - */
  33.     if(hier13(lval)) rvalue(lval);
  34.     neg();
  35.     lval[4] = -lval[4];
  36.     return (lval[7]=0);
  37.     }
  38.   else if(match("*")) {               /* unary * */
  39.     if(hier13(lval)) rvalue(lval);
  40.     if(ptr=lval[0])lval[1]=ptr[TYPE];
  41.     else lval[1]=CINT;
  42.     lval[2]=0;  /* flag as not pointer or array */
  43.     lval[3]=0;  /* flag as not constant */
  44.     lval[4]=1;  /* omit rvalue() on func call */ /*50*/
  45.     return 1;
  46.     }
  47.   else if(match("&")) {               /* unary & */
  48.     if(hier13(lval)==0) {
  49.       error("illegal address");
  50.       return 0;
  51.       }
  52.     ptr=lval[0];
  53.     lval[2]=ptr[TYPE];
  54.     if(lval[1]) return 0;
  55.     /* global & non-array */
  56.     address(ptr);
  57.     lval[1]=ptr[TYPE];
  58.     return 0;
  59.     }
  60.   else {
  61.     k=hier14(lval);
  62.     if(match("++")) {                 /* lval++ */
  63.       if(k==0) {
  64.         needlval();
  65.         return 0;
  66.         }
  67.       step(inc, lval);
  68.       dec(lval[2]>>2);
  69.       return 0;
  70.       }
  71.     else if(match("--")) {            /* lval-- */
  72.       if(k==0) {
  73.         needlval();
  74.         return 0;
  75.         }
  76.       step(dec, lval);
  77.       inc(lval[2]>>2);
  78.       return 0;
  79.       }
  80.     else return k;
  81.     }
  82.   }
  83.  
  84. hier14(lval)  int *lval; {
  85.   int k, const, val, lval2[8], mdval;            /* fas 2.6 */
  86.   char *ptr, *before, *start;
  87.   k=primary(lval);
  88.   ptr=lval[0];
  89.   blanks();
  90.   if((ch=='[')|(ch=='(')) {
  91.     lval[5]=1;    /* secondary register will be used */
  92.     while(1) {
  93.       if(match("[")) {                /* [subscript] */
  94.         if(ptr==0) {
  95.           error("can't subscript");
  96.           junk();
  97.           needtoken("]");
  98.           return 0;
  99.           }
  100.         else if(ptr[IDENT]==POINTER) rvalue(lval);
  101.         else if(ptr[IDENT]!=ARRAY) {
  102.           error("can't subscript");
  103.           k=0;
  104.           }
  105.         if(arrptr = (ptr[AINDEX] * ARRINDEX * BPW)){    /* fas 2.6 */
  106.           arrptr += sarrptr;                /* fas 2.6 */
  107.           arrcount = 0;                    /* fas 2.6 */
  108.         }else{                        /* fas 2.6 */
  109.           arrptr = sarrptr;                /* fas 2.6 */
  110.         }
  111.         do{                        /* fas 2.6 */
  112.           setstage(&before, &start);
  113.           lval2[3]=0;
  114.           plnge2(0, 0, hier1, lval2, lval2); /* lval2 deadend */
  115.           needtoken("]");
  116.           if(lval2[3]) {
  117.             clearstage(before, 0);
  118.             if(lval2[4]) {
  119.               if(ptr[TYPE]==CINT) const2(lval2[4]<<LBPW);
  120.               else                const2(lval2[4]);
  121.               if(mdval = arrptr[arrcount])        /* fas 2.6 */
  122.                  getmd(mdval);                /* fas 2.6 */
  123.               ffadd();
  124.               }
  125.             }
  126.           else {
  127.             if(ptr[TYPE]==CINT) doublereg();
  128.             if(mdval = arrptr[arrcount]){        /* fas 2.6 */
  129.                swap2();                    /* fas 2.6 */
  130.                getmd(mdval);                /* fas 2.6 */
  131.                }
  132.             ffadd();
  133.             }
  134.         ++arrcount;                    /* fas 2.6 */
  135.       }while(match("["));                /* fas 2.6 */
  136.         lval[2]=0;                                 /*15*/
  137.         lval[1]=ptr[TYPE];
  138.         k=1;
  139.         }
  140.       else if(match("(")) {           /* function(...) */
  141.         if(ptr==0) callfunction(0);
  142.         else if(ptr[IDENT]!=FUNCTION) {
  143.           if(k && !lval[4]) rvalue(lval);  /*13*//*14*//*50*/
  144.           callfunction(0);
  145.           }
  146.         else callfunction(ptr);
  147.         k=lval[0]=lval[3]=lval[4]=0;       /*50*/
  148.         }
  149.       else return k;
  150.       }
  151.     }
  152.   if(ptr==0) return k;
  153.   if(ptr[IDENT]==FUNCTION) {
  154.     address(ptr);
  155.     lval[0]=0;                              /*14*/
  156.     return 0;
  157.     }
  158.   return k;
  159.   }
  160.  
  161. primary(lval)  int *lval; {
  162.   char *ptr, sname[NAMESIZE];           /*19*/
  163.   int k;
  164.   if(match("(")) {          /* (expression,...) */
  165.     do k=hier1(lval); while(match(","));    /*26*/
  166.     needtoken(")");
  167.     return k;
  168.     }
  169.   putint(0, lval, 8<<LBPW); /* clear lval array */
  170.   if(symname(sname, YES)) {             /*19*/
  171.     if(ptr=findloc(sname)) {            /*19*/
  172. #ifdef STGOTO
  173.       if(ptr[IDENT]==LABEL) {
  174.         experr();
  175.         return 0;
  176.         }
  177. #endif
  178.       getloc(ptr);
  179.       lval[0]=ptr;
  180.       lval[1]=ptr[TYPE];
  181.       if(ptr[IDENT]==POINTER) {
  182.         lval[1]=CINT;
  183.         lval[2]=ptr[TYPE];
  184.         }
  185.       if(ptr[IDENT]==ARRAY) {
  186.         lval[2]=ptr[TYPE];
  187.         return 0;
  188.         }
  189.       else return 1;
  190.       }
  191.     if(ptr=findglb(sname))               /*19*/
  192.       if(ptr[IDENT]!=FUNCTION) {
  193.         lval[0]=ptr;
  194.         lval[1]=0;
  195.         if(ptr[IDENT]!=ARRAY) {
  196.           if(ptr[IDENT]==POINTER) lval[2]=ptr[TYPE];
  197.           return 1;
  198.           }
  199.         address(ptr);
  200.         lval[1]=lval[2]=ptr[TYPE];
  201.         return 0;
  202.         }
  203.     ptr=addsym(sname, FUNCTION, CINT, 0, 0, 0, 0, &glbptr, AUTOEXT);
  204.                         /* fas 2.3 2.6 */
  205.                                            /*19*//*37*/
  206.     lval[0]=ptr;
  207.     lval[1]=0;
  208.     return 0;
  209.     }
  210.   if(constant(lval)==0) experr();
  211.   return 0;
  212.   }
  213.  
  214. experr() {
  215.   error("invalid expression");
  216.   const(0);
  217.   junk();
  218.   }
  219.  
  220. callfunction(ptr)  char *ptr; { /* symbol table entry or 0 */
  221.   int nargs, const, val;
  222.   nargs=0;
  223.   blanks();               /* already saw open paren */
  224.                                      /*36*/
  225.   while(streq(lptr,")")==0) {
  226.     if(endst()) break;
  227.     if(ptr) {                        /*36*/
  228.       expression(&const, &val);      /*36*/
  229.       push();                        /*36*/
  230.       }                              /*36*/
  231.     else {                           /*36*/
  232.       push();                        /*36*/
  233.       expression(&const, &val);      /*36*/
  234.       swapstk();                     /*36*/
  235.       }                              /*36*/
  236.     nargs=nargs+BPW;      /* count args*BPW */
  237.     if (match(",")==0) break;
  238.     }
  239.   needtoken(")");
  240.   if(streq(ptr+NAME, "CCARGC")==0) loadargc(nargs>>LBPW);
  241.   if(ptr) ffcall(ptr+NAME);
  242.   else callstk();
  243.   csp=modstk(csp+nargs, YES);
  244.   }
  245.  
  246.