home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / SMC21SRC.LZH / CC32.C < prev    next >
Text File  |  2000-06-30  |  6KB  |  235 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.     lval[4] = ~lval[4];
  25.     return 0;
  26.     }
  27.   else if (match("!")) {              /* ! */
  28.     if(heir13(lval)) rvalue(lval);
  29.     lneg();
  30.     lval[4] = !lval[4];
  31.     return 0;
  32.     }
  33.   else if (match("-")) {              /* unary - */
  34.     if(heir13(lval)) rvalue(lval);
  35.     neg();
  36.     lval[4] = -lval[4];
  37.     return 0;
  38.     }
  39.   else if(match("*")) {               /* unary * */
  40.     if(heir13(lval)) rvalue(lval);
  41.     if(ptr=lval[0])lval[1]=ptr[TYPE];
  42.     else lval[1]=CINT;
  43.     lval[2]=0;  /* flag as not pointer or array */
  44.     lval[3]=0;  /* flag as not constant */
  45.     return 1;
  46.     }
  47.   else if(match("&")) {               /* unary & */
  48.     if(heir13(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=heir14(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. heir14(lval)  int *lval; {
  85.   int k, const, val, lval2[8];
  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.         setstage(&before, &start);
  106.         lval2[3]=0;
  107.         plnge2(0, 0, heir1, lval2, lval2); /* lval2 deadend */
  108.         needtoken("]");
  109.         if(lval2[3]) {
  110.           clearstage(before, 0);
  111.           if(lval2[4]) {
  112.             if(ptr[TYPE]==CINT) const2(lval2[4]<<LBPW);
  113.             else                const2(lval2[4]);
  114.             ffadd();
  115.             }
  116.           }
  117.         else {
  118.           if(ptr[TYPE]==CINT) doublereg();
  119.           ffadd();
  120.           }
  121.         lval[2]=0;                                      /*15*/
  122.         lval[1]=ptr[TYPE];
  123.         k=1;
  124.         }
  125.       else if(match("(")) {           /* function(...) */
  126.         if(ptr==0) callfunction(0);
  127.         else if(ptr[IDENT]!=FUNCTION) {
  128.           if(k && lval[2]) rvalue(lval);    /*13*/ /*14*/
  129.           callfunction(0);
  130.           }
  131.         else callfunction(ptr);
  132.         k=lval[0]=lval[3]=0;
  133.         }
  134.       else return k;
  135.       }
  136.     }
  137.   if(ptr==0) return k;
  138.   if(ptr[IDENT]==FUNCTION) {
  139.     address(ptr);
  140.     lval[0]=0;                                  /*14*/
  141.     return 0;
  142.     }
  143.   return k;
  144.   }
  145.  
  146. primary(lval)  int *lval; {
  147.   char *ptr, sname[NAMESIZE];           /*19*/
  148.   int k;
  149.   if(match("(")) {                    /* (expression) */
  150.     k=heir1(lval);  while(match(","));                  /*26*/
  151.     needtoken(")");
  152.     return k;
  153.     }
  154.   putint(0, lval, 8<<LBPW); /* clear lval array */
  155.   if(symname(sname, YES)) {       
  156.                         /*19*/
  157.     if(ptr=findloc(sname)) {                              /*19*/
  158.  
  159. #ifdef STGOTO
  160.  
  161.       if(ptr[IDENT]==LABEL) {
  162.         experr();
  163.         return 0;
  164.         }
  165.  
  166. #endif /* STGOTO */
  167.  
  168.       getloc(ptr);
  169.       lval[0]=ptr;
  170.       lval[1]=ptr[TYPE];
  171.       if(ptr[IDENT]==POINTER) {
  172.         lval[1]=CINT;
  173.         lval[2]=ptr[TYPE];
  174.         }
  175.       if(ptr[IDENT]==ARRAY) {
  176.         lval[2]=ptr[TYPE];
  177.         return 0;
  178.         }
  179.       else return 1;
  180.       }
  181.     if(ptr=findglb(sname))                      /*19*/
  182.       if(ptr[IDENT]!=FUNCTION) {
  183.         lval[0]=ptr;
  184.         lval[1]=0;
  185.         if(ptr[IDENT]!=ARRAY) {
  186.           if(ptr[IDENT]==POINTER) lval[2]=ptr[TYPE];
  187.           return 1;
  188.           }
  189.         address(ptr);
  190.         lval[1]=lval[2]=ptr[TYPE];
  191.         return 0;
  192.         }
  193.  
  194.     ptr=addsym(sname, FUNCTION, CINT, 0, &glbptr, AUTOEXT);
  195.                                                     /*19*/ /*37*/
  196.     lval[0]=ptr;
  197.     lval[1]=0;
  198.     return 0;
  199.     }
  200.   if(constant(lval)==0) experr();
  201.   return 0;
  202.   }
  203.  
  204. experr() {
  205.   error("invalid expression");
  206.   const(0);
  207.   junk();
  208.   }
  209.  
  210. callfunction(ptr)  char *ptr; { /* symbol table entry or 0 */
  211.   int nargs, const, val;
  212.   nargs=0;
  213.   blanks();               /* already saw open paren */
  214.                                         /*36*/
  215.   while(streq(lptr,")")==0) {
  216.     if(endst()) break;
  217.     if(ptr) {                           /*36*/
  218.       expression(&const, &val);         /*36*/
  219.       push();                           /*36*/
  220.       }                                 /*36*/
  221.     else {                              /*36*/
  222.       push();                           /*36*/
  223.       expression(&const, &val);         /*36*/
  224.       swapstk();                        /*36*/
  225.       }
  226.     nargs=nargs+BPW;      /* count args*BPW */
  227.     if (match(",")==0) break;
  228.     }
  229.   needtoken(")");
  230.   if(streq(ptr+NAME, "CCARGC")==0) loadargc(nargs>>LBPW);
  231.   if(ptr) ffcall(ptr+NAME);
  232.   else callstk();
  233.   csp=modstk(csp+nargs, YES);
  234.   }
  235.