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

  1. /*
  2. ** true if val1 -> int pointer or int array and val2 not ptr or array
  3. */
  4. dbltest(oper, val1, val2) int (*oper)(), val1[], val2[]; { /*34*/
  5.   if((oper!=ffadd) && (oper!=ffsub)) return 0;             /*34*/
  6.   if(val1[2]!=CINT) return 0;
  7.   if(val2[2]) return 0;
  8.   return 1;
  9.   }
  10.  
  11. /*
  12. ** determine type of binary operation
  13. */
  14. result(lval, lval2) int lval[], lval2[]; {
  15.   if((lval[2]!=0)&(lval2[2]!=0)) {
  16.     lval[2]=0;
  17.     }
  18.   else if(lval2[2]) {
  19.     lval[0]=lval2[0];
  20.     lval[1]=lval2[1];
  21.     lval[2]=lval2[2];
  22.     }
  23.   }
  24.  
  25. step(oper, lval) int (*oper)(), lval[]; {               /*13*/
  26.   if(lval[1]) {
  27.     if(lval[5]) {
  28.       push();
  29.       rvalue(lval);
  30.       (*oper)(lval[2]>>2);                              /*13*/
  31.       pop();
  32.       store(lval);
  33.       return;
  34.       }
  35.     else {
  36.       move();
  37.       lval[5]=1;
  38.       }
  39.     }
  40.   rvalue(lval);
  41.   (*oper)(lval[2]>>2);                                  /*13*/
  42.   store(lval);
  43.   }
  44.  
  45. store(lval)  int lval[]; {
  46.   if(lval[1]) putstk(lval);
  47.   else        putmem(lval);
  48.   }
  49.  
  50. rvalue(lval) int lval[]; {
  51.   if ((lval[0]!=0)&(lval[1]==0)) getmem(lval);
  52.   else                         indirect(lval);
  53.   }
  54.  
  55. test(label, parens)  int label, parens;  {
  56.   int lval[8];
  57.   char *before, *start;
  58.   if(parens) needtoken("(");
  59.   while(1) {
  60.     setstage(&before, &start);
  61.     if(hier1(lval)) rvalue(lval);
  62.     if(match(",")) clearstage(before, start);
  63.     else break;
  64.     }
  65.   if(parens) needtoken(")");
  66.   if(lval[3]) {  /* constant expression */
  67.     clearstage(before, 0);
  68.     if(lval[4]) return;
  69.     jump(label);
  70.     return;
  71.     }
  72.   if(lval[7]) {  /* stage address of "oper 0" code */
  73.     oper=lval[6];/* operator function address */
  74.          if((oper==ffeq)|
  75.             (oper==ule)) zerojump(eq0, label, lval);
  76.     else if((oper==ffne)|
  77.             (oper==ugt)) zerojump(ne0, label, lval);
  78.     else if (oper==ffgt) zerojump(gt0, label, lval);
  79.     else if (oper==ffge) zerojump(ge0, label, lval);
  80.     else if (oper==uge)  clearstage(lval[7],0);
  81.     else if (oper==fflt) zerojump(lt0, label, lval);
  82.     else if (oper==ult)  zerojump(ult0, label, lval);
  83.     else if (oper==ffle) zerojump(le0, label, lval);
  84.     else                 testjump(label);
  85.     }
  86.   else testjump(label);
  87.   clearstage(before, start);
  88.   }
  89.  
  90. constexpr(val) int *val; {
  91.   int const;
  92.   char *before, *start;
  93.   setstage(&before, &start);
  94.   expression(&const, val);
  95.   clearstage(before, 0);  /* scratch generated code */
  96.   if(const==0) error("must be constant expression");
  97.   return const;
  98.   }
  99.  
  100. const(val) int val; {
  101.   immed();
  102.   outdec(val);
  103.   nl();
  104.   }
  105.  
  106. const2(val) int val; {
  107.   immed2();
  108.   outdec(val);
  109.   nl();
  110.   }
  111.  
  112. constant(lval)  int lval[]; {
  113.   lval=lval+3;
  114.   *lval=1;       /* assume it will be a constant */
  115.   if (number(++lval)) immed();
  116.   else if (pstr(lval)) immed();
  117.   else if (qstr(lval)) {
  118.     *(lval-1)=0; /* nope, it's a string address */
  119.     immed();
  120.     printlabel(litlab);
  121.     outbyte('+');
  122.     }
  123.   else return 0;
  124.   outdec(*lval);
  125.   nl();
  126.   return 1;
  127.   }
  128.  
  129. number(val)  int val[]; {
  130.   int i, k, minus;                    /* fas 2.5 */
  131.   k=minus=0;
  132.   while(1) {
  133.     if(match("+")) ;
  134.     else if(match("-")) minus=1;
  135.     else break;
  136.     }
  137.   if(isdigit(ch)==0)return 0;
  138.  
  139.   if(match("0")){                    /* fas 2.5 */
  140.     if(match("X") | match("x")){            /* fas 2.5 */
  141.       if((i = xtoi(lptr,&k)) > 0) bump(i);        /* fas 2.5 */
  142.       }else{                        /* fas 2.5 */
  143.       while (isdigit(ch)) k= k*8+(inbyte()-'0');    /* fas 2.5 */
  144.       }                            /* fas 2.5 */
  145.     }else{
  146.       while (isdigit(ch)) k=k*10+(inbyte()-'0');
  147.     }                            /* fas 2.5 */
  148.  
  149.   if (minus) k=(-k);
  150.   val[0]=k;
  151.   return 1;
  152.   }
  153.  
  154. address(ptr) char *ptr; {
  155.   immed();
  156.   outstr(ptr+NAME);
  157.   nl();
  158.   }
  159.  
  160. pstr(val)  int val[]; {
  161.   int k;
  162.   k=0;
  163.   if (match("'")==0) return 0;
  164.   while(ch!=39)    k=(k&255)*256 + (litchar()&255);
  165.   gch();                                            /*24*/
  166.   val[0]=k;
  167.   return 1;
  168.   }
  169.  
  170. qstr(val)  int val[]; {
  171.   char c;
  172.   if (match(quote)==0) return 0;
  173.   val[0]=litptr;
  174.   while (ch!='"') {
  175.     if(ch==0) break;
  176.     stowlit(litchar(), 1);
  177.     }
  178.   gch();
  179.   litq[litptr++]=0;
  180.   return 1;
  181.   }
  182.  
  183. stowlit(value, size) int value, size; {
  184.   if((litptr+size) >= LITMAX) {
  185.     error("literal queue overflow"); abort(ERRCODE);
  186.     }
  187.   putint(value, litq+litptr, size);
  188.   litptr=litptr+size;
  189.   }
  190.  
  191. /*
  192. ** return current literal char & bump lptr
  193. */
  194. litchar() {
  195.   int i, oct;
  196.   if((ch!=92)|(nch==0)) return gch();
  197.   gch();
  198.   if(ch=='n') {gch(); return 13;} /* CR */
  199.   if(ch=='t') {gch(); return  9;} /* HT */
  200.   if(ch=='b') {gch(); return  8;} /* BS */
  201.   if(ch=='f') {gch(); return 12;} /* FF */
  202.   i=3; oct=0;
  203.   while(((i--)>0)&(ch>='0')&(ch<='7')) oct=(oct<<3)+gch()-'0';
  204.   if(i==2) return gch(); else return oct;
  205.   }
  206.  
  207.