home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 309_01 / cc7.c < prev    next >
Text File  |  1990-03-20  |  6KB  |  294 lines

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