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

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