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

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