home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / C / SMALL_C / CC33.C < prev    next >
Text File  |  1987-10-04  |  5KB  |  201 lines

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