home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 221_01 / cc71.c < prev    next >
Text File  |  1979-12-31  |  6KB  |  269 lines

  1. /* >>>>>> start of cc7 <<<<<< */
  2. heir11(lval)
  3.  int *lval;
  4. { int k;char *ptr;
  5.  k=primary(lval);
  6.  ptr=lval[0];
  7.  blanks();
  8.  if((ch()=='[')||(ch()=='('))
  9.  while(1)
  10.   {if(match("["))
  11.    {if(ptr==0)
  12.     {errrpt("can't subscript");
  13.     junk();
  14.     needbrack("]");
  15.     return (0);
  16.     }
  17.    else if(ptr[ident]==pointer)rvalue(lval);
  18.    else if(ptr[ident]!=array)
  19.     {errrpt("can't subscript");
  20.     k=0;
  21.     }
  22.    push();
  23.    expression();
  24.    needbrack("]");
  25.    if(ptr[type]==cint)doublereg();
  26. /*   pop();  */
  27.    add();
  28.    lval[1]=ptr[type];
  29.    k=1;
  30.    }
  31.   else if(match("("))
  32.    {if(ptr==0)
  33.     {callfunction(0);
  34.     }
  35.    else if(ptr[ident]!=function)
  36.     {rvalue(lval);
  37.     callfunction(0);
  38.     }
  39.    else callfunction(ptr);
  40.    k=lval[0]=0;
  41.    }
  42.   else return (k);
  43.   }
  44.  if(ptr==0)return (k);
  45.  if(ptr[ident]==function)
  46.   {immed();
  47.   outstr(ptr);
  48.   nl();
  49.   return (0);
  50.   }
  51.  return (k);
  52. }
  53. /*
  54. **  change for fully implementation of 
  55. **  komma operator DDJ bound volume 8 page 345
  56. */
  57. primary(lval)
  58.  int *lval;
  59. { char *ptr, *savptr, sname[namesize];int num[1];
  60.  int k;
  61.  if(match("(")) {
  62.   while(1) {
  63.     k=heir1(lval);
  64.     if(match(",")==0) break;
  65.     }
  66.   needbrack(")");
  67.   return (k);
  68.   }
  69.  if(symname(sname)) {
  70.    if(savptr=findloc(sname)) {
  71.      if(ptr=findstat(sname)) {  /* 29-oct-86 */
  72.        lval[0]=ptr;
  73.        lval[1]=0;
  74.        if(ptr[ident]!=array)return (1);
  75.        immed();
  76.        outstr(ptr+symsiz);outbyte('B');nl();
  77.        lval[1]=ptr[type];
  78.        return (0);
  79.      }
  80.      else {
  81.        ptr=savptr;
  82.        getloc(ptr);
  83.        lval[0]=ptr;
  84.        lval[1]=ptr[type];
  85.        if(ptr[ident]==pointer)lval[1]=cint;
  86.        if(ptr[ident]==array)return (0);
  87.        else return (1);
  88.      }
  89.    }
  90.    if(ptr=findglb(sname))
  91.      if(ptr[ident]!=function) {
  92.       lval[0]=ptr;
  93.       lval[1]=0;
  94.       if(ptr[ident]!=array)return (1);
  95.       immed();
  96.       outstr(ptr);nl();
  97.       lval[1]=ptr[type];
  98.       return (0);
  99.      }
  100.      ptr=addglb(sname,function,cint,0,statik);
  101.      lval[0]=ptr;
  102.      lval[1]=0;
  103.      return (0);
  104.    }
  105.  if(constant(num)) {
  106.   constval[0]=1;
  107.   constval[1]=num[0];
  108.   return(lval[0]=lval[1]=0);
  109.   }
  110.  else
  111.   {errrpt("invalid expression");
  112.   immed();outdec(0);nl();
  113.   junk();
  114.   return (0);
  115.   }
  116.  }
  117.  
  118. store(lval)
  119.  int *lval;
  120. { if (lval[1]==0)putmem(lval[0]);
  121.  else putstk(lval[1]);
  122. }
  123.  
  124. rvalue(lval)
  125.  int *lval;
  126. { if ((lval[0])==0)return;
  127.  if (lval[1]==0)getmem(lval[0]);
  128.  else indirect(lval[1]);
  129. }
  130.  
  131. test(label, bracket) int label, bracket; {
  132.  char *before, *start;
  133.  int lval[8];
  134.  if(bracket) needbrack("(");
  135.  while(1) {
  136.   setstage(&before, &start);
  137.   if(heir1(lval)) rvalue(lval);
  138.   if(match(",")) clearstage(before, start);
  139.   else break;
  140.  }
  141.  if(bracket) needbrack(")");
  142.  testjump(label);
  143.  clearstage(before, start);
  144. }
  145.  
  146. constexpr(val) int *val; {
  147.   int const;
  148.   char *before, *start;
  149.   setstage(&before, &start);
  150.   constval[0]=constval[1]=0;
  151.   expression();
  152.   const=constval[0];
  153.   *val=constval[1];
  154.   clearstage(before, 0);  /* scratch generated code */
  155.   if(const==0) errrpt("must be constant expression");
  156.   return(const);
  157.   }
  158.  
  159. constant(lval)
  160.  int lval[];
  161. { if (number(lval))
  162.   immed();
  163.  else if (pstr(lval))
  164.   immed();
  165.  else if (qstr(lval))
  166.   {immed();printlabel(litlab);outbyte('+');}
  167.  else return (0); 
  168.  outdec(lval[0]);
  169.  nl();
  170.  return (1);
  171. }
  172.  
  173. number(val)
  174.  int val[];
  175. { int k,minus;char c;
  176.  k=minus=1;
  177.  while(k)
  178.   {k=0;
  179.   if (match("+")) k=1;
  180.   if (match("-")) {minus=(-minus);k=1;}
  181.   }
  182.  if(numeric(ch())==0)return (0);
  183.  if(match("0"))   /* octal or hex number */
  184.    if(match("x") | match("X"))    /* hex */
  185.      while(numeric(c=upper(ch())) || (c>='A' && c<='F')) {
  186.        if(numeric(c)) c=c-'0';
  187.        else c=c-55;
  188.      k=(k<<4)+c;
  189.      inbyte();
  190.      }
  191.    else  /* octal */
  192.      while(ch()>='0' && ch()<='7') {
  193.        c=inbyte();
  194.        k=(k<<3)+c-'0';
  195.      }
  196.  else
  197.    while (numeric(ch()))
  198.      {c=inbyte();
  199.      k=k*10+(c-'0');
  200.  }
  201.  if (minus<0) k=(-k);
  202.  val[0]=k;
  203.  return (1);
  204. }
  205.  
  206. upper(c) char c; {
  207.   if(c>='a' && c<='z') return(c-32);
  208.   return c;
  209. }
  210.  
  211. pstr(val)
  212.  int val[];
  213. { int k;char c;
  214.  k=0;
  215.  if (match("'")==0) return (0);
  216.  while((ch())!=39)
  217.   k=(k&255)*256 + (litchar()&255);
  218.  val[0]=k;
  219.  gch();
  220.  return (1);
  221. }
  222.  
  223. qstr(val)
  224.  int val[];
  225. { char c;
  226.  if (match(quote)==0) return (0);
  227.  val[0]=litptr;
  228.  while (ch()!='"')
  229.   {if(ch()==0)break;
  230.   if(litptr>=litmax)
  231.    {errrpt("string space exhausted");
  232.    while(match(quote)==0)
  233.     if(gch()==0)break;
  234.    return (1);
  235.    }
  236.   litq[litptr++]=litchar();
  237.   }
  238.  gch();
  239.  litq[litptr++]=0;
  240.  return (1);
  241. }
  242.  
  243. stowlit(value, siz) int value, siz; {
  244.   if((litptr+siz) >= litmax) {
  245.     errrpt("literal que overflow"); exit(ERRCODE);
  246.     }
  247.   putint(value, litq+litptr, siz);
  248.   litptr=litptr+siz;
  249.   }
  250.  
  251. /*
  252. ** return current literal char & bump lptr
  253. */
  254. litchar() {
  255.   int i, oct;
  256.   if((ch()!=92)|(nch()==0)) return gch();
  257.   gch();
  258.   if(ch()=='n') {gch(); return 13;} /* NL(LF) same as CR for FLEX*/
  259.   if(ch()=='t') {gch(); return  9;} /* HT */
  260.   if(ch()=='b') {gch(); return  8;} /* BS */
  261.   if(ch()=='f') {gch(); return 12;} /* FF */
  262.   if(ch()==92)  {gch(); return 92;} /* \  */
  263.   if(ch()==39)  {gch(); return 39;} /* '  */
  264.   if(ch()=='r') {gch(); return 13;} /* CR */
  265.   i=3; oct=0;
  266.   while(((i--)>0)&&(ch()>='0')&&(ch()<='7')) oct=(oct<<3)+gch()-'0';
  267.   if(i==2) return gch(); else return oct;
  268.   }
  269.