home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / misc / smc203.ark / CC32.C < prev    next >
Encoding:
Text File  |  1983-07-28  |  5.5 KB  |  232 lines

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