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

  1. /*
  2. HEADER:        Small-C source part 6;
  3. FILENAME:    CC6.C;
  4. AUTHORS:    Dieter H. Flunkert;
  5. COMPILERS:Turbo C V2.0 Medium Memory Model;
  6. SYSTEM: MSDOS (Brian Brown, Nov 1989)
  7. */
  8.  
  9. #include <stdio.h>
  10. #include "ccdef.c"
  11.  
  12. /* external function declaration */
  13. extern int add(), asl(), asr(), blanks(), ch(), com(), dec(), div(),
  14.   doublereg(), errrpt(), heir11(), immed(), inc(), lognot(), match(),
  15.   mod(), mult(),needlval(), neg(), nl(), outstr(), pop(), push(),
  16.   rvalue(), store(), streq(), sub();
  17.  
  18. /* external variables declaration */
  19. extern int lptr;
  20.  
  21. extern char *cptr, line[linesize];
  22.  
  23. heir7(lval)
  24.  int lval[];
  25. {
  26.  int k,lval2[8];
  27.  char *off_set;
  28.  k=heir8(lval);
  29.  blanks();
  30.  off_set=line+lptr;
  31.  if(streq(off_set,">>=")) return k;
  32.  if(streq(off_set,"<<=")) return k;
  33.  if((streq(off_set,">>")==0)&&
  34.   (streq(off_set,"<<")==0))return (k);
  35.  if(k)rvalue(lval);
  36.  while(1)
  37.   {if (match(">>"))
  38.    {push();
  39.    if(heir8(lval2))rvalue(lval2);
  40.    asr();
  41.    }
  42.   else if (match("<<"))
  43.    {push();
  44.    if(heir8(lval2))rvalue(lval2);
  45.    asl();
  46.    }
  47.   else return (0);
  48.   }
  49. }
  50.  
  51. heir8(lval)
  52.  int lval[];
  53. {
  54.  int k,lval2[8];
  55.  char *off_set;
  56.  k=heir9(lval);
  57.  blanks();
  58.  off_set=line+lptr;
  59.  if((ch()!='+')&&(ch()!='-'))return (k);
  60.  if(streq(off_set,"+=")) return k;
  61.  if(streq(off_set,"-=")) return k;
  62.  if(k)rvalue(lval);
  63.  while(1)
  64.   {if (match("+"))
  65.    {push();
  66.    if(heir9(lval2))rvalue(lval2);
  67.    if(cptr=lval[0])
  68.     if((cptr[ident]==pointer)&&(cptr[type]==cint)&&lval[2])
  69.       doublereg();
  70.    add();
  71.    }
  72.   else if (match("-"))
  73.    {push();
  74.    if(heir9(lval2))rvalue(lval2);
  75.    if(cptr=lval[0])
  76.     if((cptr[ident]==pointer)&&(cptr[type]==cint)&&lval[2])
  77.       doublereg();
  78.    sub();
  79.    }
  80.   else return (0);
  81.   }
  82. }
  83.  
  84. heir9(lval)
  85.  int lval[];
  86. {
  87.  int k,lval2[8];
  88.  char *off_set;
  89.  k=heir10(lval);
  90.  blanks();
  91.  off_set=line+lptr;
  92.  if((ch()!='*')&&(ch()!='/')&&
  93.   (ch()!='%'))return (k);
  94.  if(streq(off_set,"*=")) return k;
  95.  if(streq(off_set,"/=")) return k;
  96.  if(streq(off_set,"%=")) return k;
  97.  if(k)rvalue(lval);
  98.  while(1)
  99.   {if (match("*"))
  100.    {push();
  101.    if(heir9(lval2))rvalue(lval2);
  102.    pop();
  103.    mult();
  104.    }
  105.   else if (match("/"))
  106.    {push();
  107.    if(heir10(lval2))rvalue(lval2);
  108.    pop();
  109.    div();
  110.    }
  111.   else if (match("%"))
  112.    {push();
  113.    if(heir10(lval2))rvalue(lval2);
  114.    pop();
  115.    mod();
  116.    }
  117.   else return (0);
  118.   }
  119. }
  120.  
  121. /* ! and ~ operators implemented  13-jul-86 Dieter H. Flunkert */
  122. heir10(lval)
  123. int lval[];
  124. {
  125.  int k;
  126.  char *ptr;
  127.  if(match("!")) {
  128.   k=heir10(lval);
  129.   if(k) rvalue(lval);
  130.   lognot();
  131.   return 0;
  132.  }
  133.  else if(match("~")) {
  134.   k=heir10(lval);
  135.   if(k) rvalue(lval);
  136.   com();
  137.   return 0;
  138.  }
  139.  else if(match("++"))
  140.   {if((k=heir10(lval))==0)
  141.    {needlval();
  142.    return (0);
  143.    }
  144.   if(lval[1])push();
  145.   rvalue(lval);
  146.   inc();
  147.   ptr=lval[0];
  148.   if((ptr[ident]==pointer)&&(ptr[type]==cint)&&lval[2])
  149.     inc();
  150.   store(lval);
  151.   return (0);
  152.   }
  153.  else if(match("--"))
  154.   {if((k=heir10(lval))==0)
  155.    {needlval();
  156.    return (0);
  157.    }
  158.   if(lval[1])push();
  159.   rvalue(lval);
  160.   dec();
  161.   ptr=lval[0];
  162.   if((ptr[ident]==pointer)&&(ptr[type]==cint)&&lval[2])
  163.     dec();
  164.   store(lval);
  165.   return (0);
  166.   }
  167.  else if(streq(line+lptr,"-=")) return k;
  168.  else if (match("-"))
  169.   {k=heir10(lval);
  170.   if (k) rvalue(lval);
  171.   neg();
  172.   return (0);
  173.   }
  174.  else if(streq(line+lptr,"*=")) return k;
  175.  else if(match("*"))
  176.   {k=heir10(lval);
  177.   if(k)rvalue(lval);
  178.   lval[1]=cint;
  179.   if(ptr=lval[0])lval[1]=ptr[type];
  180.   lval[2]=0;  /* flag as no pointer or array */
  181.   lval[3]=0;  /* and no constant */
  182.   return (1);
  183.   }
  184.  else if(streq(line+lptr,"&=")) return k;
  185.  else if(match("&"))
  186.   {k=heir10(lval);
  187.   if(k==0)
  188.    {errrpt("illegal address");
  189.    return (0);
  190.    }
  191.   else if(lval[1])return (0);
  192.   else
  193.    {immed();
  194.    outstr(ptr=lval[0]);
  195.    nl();
  196.    lval[1]=ptr[type];
  197.    return (0);
  198.    }
  199.   }
  200.  else 
  201.   {k=heir11(lval);
  202.   if(match("++"))
  203.    {if(k==0)
  204.     {needlval();
  205.     return (0);
  206.     }
  207.    if(lval[1])push();
  208.    rvalue(lval);
  209.    inc();
  210.    ptr=lval[0];
  211.    if((ptr[ident]==pointer)&&(ptr[type]==cint)&&lval[2])
  212.      inc();
  213.    store(lval);
  214.    dec();
  215.    if((ptr[ident]==pointer)&&(ptr[type]==cint)&&lval[2])
  216.     dec();
  217.    return (0);
  218.    }
  219.   else if(match("--"))
  220.    {if(k==0)
  221.     {needlval();
  222.     return (0);
  223.     }
  224.    if(lval[1])push();
  225.    rvalue(lval);
  226.    dec();
  227.    ptr=lval[0];
  228.    if((ptr[ident]==pointer)&&(ptr[type]==cint)&&lval[2])
  229.      dec();
  230.    store(lval);
  231.    inc();
  232.    if((ptr[ident]==pointer)&&(ptr[type]==cint)&&lval[2])
  233.     inc();
  234.    return (0);
  235.    }
  236.   else return (k);
  237.   }
  238. }
  239.