home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume2 / basic / part2 / newbs / operat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  8.5 KB  |  363 lines

  1. /* operat.c -- operations, as opposed to actions.  FOR is an action,
  2.  *    '+' is an operation.
  3.  *
  4.  * More operators can be found in the machine generated file "operat2.c".
  5.  */
  6.  
  7. #include "bsdefs.h"
  8.  
  9.  
  10. /*    BINARY OPERATORS    */
  11.  
  12. /* Common description for the binary ops.
  13.  *  also applies to all ops in operat2.c
  14.  *
  15.  * M_COMPILE:
  16.  *    x op x   --to--   x,_op,x
  17.  * M_EXECUTE:
  18.  *    stack: ar2,ar1,x   --to--   (ar1 op ar2),x
  19.  */
  20.  
  21.  
  22. _comma(l,p) int (*l[])(),p;
  23. {
  24.     union value s1,s2,s3;
  25.     if((status&XMODE) == M_FIXUP) return(p);
  26.     if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
  27.     if((status&XMODE) == M_EXECUTE) {
  28. EXEC:
  29.         s1 = pop();
  30.         s2 = pop();
  31.         s3.sval = myalloc(strlen(s1.sval)+strlen(s2.sval)+3);
  32.         strcpy(s3.sval,s2.sval);
  33.         strcat(s3.sval,"\t");
  34.         strcat(s3.sval,s1.sval);
  35.         if(s1.sval != 0) free(s1.sval);
  36.         if(s2.sval != 0) free(s2.sval);
  37.         push(s3);
  38.     }
  39.         return(p);
  40. }
  41. _scolon(l,p) int(*l[])(),p;
  42. {
  43.     union value s1,s2,s3;
  44.     if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
  45.     if((status&XMODE) == M_EXECUTE) {
  46. EXEC:
  47.         s1 = pop();
  48.         s2 = pop();
  49.         s3.sval = myalloc(strlen(s1.sval)+strlen(s2.sval)+2);
  50.         strcpy(s3.sval,s2.sval);
  51.         strcat(s3.sval,s1.sval);
  52.         push(s3);
  53.         if(s1.sval != 0) free(s1.sval);
  54.         if(s2.sval != 0) free(s2.sval);
  55.     }
  56.     return(p);
  57. }
  58. /* last of binary operators */
  59.  
  60. /* ---And now for something completely different: a Unary Operator.
  61.  *
  62.  * M_COMPILE:
  63.  *    x not x    --to--    x,_not,x
  64.  * M_EXECUTE:
  65.  *    stack: bool,x    --to--     !(bool),x
  66.  */
  67. _not(l,p) int (*l[])(),p;
  68. {
  69.     union value val;
  70.  
  71.     if((status&XMODE) == M_EXECUTE) {
  72.     val = pop();
  73.     val.ival = ! val.ival;
  74.     push(val);
  75.     }
  76.     return(p);
  77. }
  78.  
  79. /* M_COMPILE:
  80.  *    x itoa x   --to--   x,_itoa,x
  81.  * M_EXECUTE:
  82.  *    stack: int,x   --to--   string,x
  83.  */
  84. _itoa(l,p)
  85. int (*l[])(),p;
  86. {
  87.     union value val;
  88.     char s2[30];
  89.  
  90.     if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
  91.     if((status&XMODE) == M_EXECUTE) {
  92. EXEC:
  93.         val=pop();
  94.         sprintf(s2,"%D",val.ival);    /* optimize later */
  95. if(dbg) printf("_icon():M_EXECUTE:ival:%D to sval:%s\n",val.ival,s2);
  96.         val.sval=myalloc(strlen(s2)+1);
  97.         strcpy(val.sval,s2);
  98.         push(val);
  99.     }
  100.     return(p);
  101. }
  102. _rtoa(l,p)
  103. int (*l[])(),p;
  104. {
  105.     union value val;
  106.     char s2[30];
  107.  
  108.     if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
  109.     if((status&XMODE) == M_EXECUTE) {
  110. EXEC:
  111.         val = pop();
  112.         sprintf(s2,"%g",val.rval);
  113. if(dbg) printf("_rtoa():M_EXECUTE:rval:%g to sval:%s\n",val.rval,s2);
  114.         val.sval = myalloc(strlen(s2)+1);
  115.         strcpy(val.sval,s2);
  116.         push(val);
  117.     }
  118.     return(p);
  119. }
  120. _itor(l,p)
  121. int (*l[])(),p;
  122. {
  123.     union value v1,v2;
  124.  
  125.     if((status&XMODE) == M_READ) { dtype = T_DBL; goto EXEC; }
  126.     if((status&XMODE) == M_EXECUTE) {
  127. EXEC:
  128.         v1 = pop();
  129.         v2.rval = (double)v1.ival;
  130.         push(v2);
  131.     }
  132.     return(p);
  133. }
  134. _rtoi(l,p)
  135. int (*l[])(),p;
  136. {
  137.     union value v1,v2;
  138.  
  139.     if((status&XMODE) == M_READ) { dtype = T_INT; goto EXEC; }
  140.     if((status&XMODE) == M_EXECUTE) {
  141. EXEC:
  142.         v1 = pop();
  143.         v2.ival = (int)v1.rval;
  144.         push(v2);
  145.     }
  146.     return(p);
  147. }
  148.  
  149. /* M_COMPILE:
  150.  *    x scon "quoted string" x   --to--   x,_scon,&string,x
  151.  * M_EXECUTE:
  152.  *    stack: x   --to--   string,x
  153.  *    other: pushes a COPY of the string, not the original.
  154.  */
  155. _scon(l,p)
  156. int (*l[])(),p;
  157. {
  158.     char *s,c;
  159.     union value val;
  160.     int i;
  161.  
  162.     if((status&XMODE) == M_FIXUP) ++p;
  163.     if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
  164.     if((status&XMODE) == M_EXECUTE) {
  165. EXEC:
  166.         s = l[p++];
  167.         val.sval = myalloc(strlen(s)+1);
  168.         strcpy(val.sval,s);
  169.         push(val);
  170. if(dbg) printf("_scon():M_EXECUTE:sval:%s\n",val.sval);
  171.     }
  172.     return(p);
  173. }
  174.  
  175. /* M_COMPILE:
  176.  *    x icon int x   --to--   x,_icon,int,x
  177.  * M_EXECUTE:
  178.  *    stack: x   --to--   int,x
  179.  */
  180. _icon(l,p)
  181. int (*l[])(),p;
  182. {
  183.     union value val;
  184.     union loni v;
  185.     int i;
  186.  
  187.     if((status&XMODE) == M_FIXUP) return(p+(sizeof(long)/sizeof(int)));
  188.     if((status&XMODE) == M_READ) { dtype = T_INT; goto EXEC; }
  189.     if((status&XMODE) == M_EXECUTE) {
  190. EXEC:
  191.         for(i=0; i<(sizeof(long)/sizeof(int)); i++)
  192.         v.i_in_loni[i] = l[p++];
  193.         val.ival = v.l_in_loni;
  194.         push(val);
  195. if(dbg) printf("_icon():M_EXECUTE:ival:%D\n",val.ival);
  196.     }
  197.     return(p);
  198. }
  199. _rcon(l,p)
  200. int (*l[])(),p;
  201. {
  202.     union doni v;
  203.     int i;
  204.     union value val;
  205.  
  206.     if((status&XMODE) == M_FIXUP) return(p+(sizeof(double)/sizeof(int)));
  207.     if((status&XMODE) == M_READ) { dtype = T_DBL; goto EXEC; }
  208.     if((status&XMODE) = M_EXECUTE) {
  209. EXEC:
  210.         for(i=0; i<(sizeof(double)/sizeof(int)); i++)
  211.         v.i_in_doni[i] = l[p++];
  212.         val.rval = v.d_in_doni;
  213.         push(val);
  214.     }
  215.     return(p);
  216. }
  217.  
  218. /* M_COMPILE:
  219.  *    x val type x   --to--   x,_val,type,x
  220.  * M_EXECUTE:
  221.  *    stack:    place,x   --to--   value,x
  222.  *    other: for strings, pushes a copy of the string.
  223.  */
  224. _val(l,p) int(*l[])(),p;
  225. {
  226.     union value place,val;
  227.     int ty;
  228.  
  229.     if((status&XMODE) == M_READ) { dtype = l[p]; goto EXEC; }
  230.     if((status&XMODE) == M_EXECUTE) {
  231. EXEC:
  232.         ty = l[p];
  233.         place = pop();
  234. if(dbg) printf("_val():M_EXECUTE:var:%s",place.vpval->name);
  235.         place.plval = getplace(place.vpval);
  236.         if(ty==T_CHR && place.plval->sval!=0) {
  237.         val.sval = myalloc(strlen(place.plval->sval)+1);
  238.         strcpy(val.sval,place.plval->sval);
  239.         push(val);
  240.         }
  241.         else push(*place.plval);
  242. if(dbg) printf(":ival:%D:rval:%g:sval:%s\n",ty==T_INT?place.plval->ival:(long)0,
  243.     ty==T_DBL?place.plval->rval:(double)0,ty==T_CHR?place.plval->sval:0);
  244.     }
  245.     return(p+1);
  246. }
  247.  
  248. /* M_COMPILE:
  249.  *    x store typ x   --to--    x,_store,type,x
  250.  * M_EXECUTE:
  251.  *    stack: value,location,x   --to--   value,x
  252.  *        (stores value at location).
  253.  */
  254. _store(l,p) int(*l[])(),p;
  255. {
  256.     union value place,val;
  257.     int ty;
  258.  
  259.     if((status&XMODE) == M_READ) { dtype = l[p]; goto EXEC; }
  260.     if((status&XMODE) == M_EXECUTE) {
  261. EXEC:
  262.         val = pop();
  263.         place = pop();
  264.         ty = l[p];
  265. if(dbg) printf("_store():M_EXECUTE:var:%s:ival:%D:rval:%g:sval:%s\n",
  266.     place.vpval->name,ty==T_INT?val.ival:(long)0,ty==T_DBL?val.rval:(double)0,ty==T_CHR?val.sval:0);
  267.         place.plval = getplace(place.vpval);
  268.         if(ty==T_CHR && place.plval->sval!=0) free(place.plval->sval);
  269.         (*place.plval) = val;
  270.         push(val);
  271.     }
  272.     return(p+1);
  273. }
  274.  
  275. /* M_COMPILE:
  276.  *    x var typ name x   --to--    x,_var,&vlist entry,x
  277.  * M_EXECUTE:
  278.  *    stack: x   --to--   &vlist entry,x
  279.  * M_INPUT:
  280.  *    (&vlist entry)->val is set to input value.
  281.  * M_READ:
  282.  *    Moves the data list pointers to the next data item.  If no next
  283.  *    data item, calls ODerror.
  284.  *    Does a "gosub" to the data item, to get its value on the stack.
  285.  *    Does T_INT to T_CHR conversion if necessary.
  286.  *    Pops value into vp->val.
  287.  */
  288. _var(l,p) int(*l[])(),p; /* same proc for any variable type */
  289. {
  290.     char *s;
  291.     struct dictnode *vp;
  292.     struct line *thislist;
  293.     union value place,val;
  294.     int ty,qual;
  295.  
  296.     if((status&XMODE) == M_EXECUTE) {
  297.         val.vpval = l[p++];
  298. if(dbg) printf("_var():M_EXECUTE:var:(%d)%s\n",val.vpval->type_of_value,
  299.     val.vpval->name);
  300.         push(val);
  301.         return(p);
  302.     }
  303.     if((status&XMODE) == M_INPUT) {
  304.         vp = l[p++];
  305.         place.plval = getplace(vp);
  306.         ty = (vp->type_of_value) & T_TMASK;
  307.         if(ty == T_INT)
  308.         place.plval->ival = atol(int_in());
  309.         else if(ty == T_DBL)
  310.         place.plval->rval = atof(real_in());
  311.         else /* ty == T_CHR */
  312.         place.plval->sval = scon_in();
  313. if(dbg) printf("_var():M_INPUT:var:(%d)%s:ival:%D:rval:%g:sval:%s\n",
  314. vp->type_of_value,vp->name,ty==T_INT?place.plval->ival:(long)0,
  315. ty==T_DBL?place.plval->rval:(double)0,ty==T_CHR?place.plval->sval:0);
  316.         return(p);
  317.     }
  318.     if((status&XMODE) == M_READ) {
  319. nxdl:        if(dlist[dlp] == 0) ODerror(l,p);    /* ran off end of dlist */
  320.         thislist = dlist[dlp];
  321.         if((thislist->code)[dlindx] == 0) {
  322.         dlp++;
  323.         dlindx = 2;    /* skips <_data,0> */
  324.         goto nxdl;
  325.         }
  326.  
  327.         status = M_EXECUTE;
  328.         dlindx = interp(thislist->code,dlindx);
  329.         status = M_READ;
  330.  
  331.         val = pop();
  332.         vp = l[p];
  333.         place.plval = getplace(vp);
  334.         qual = vp->type_of_value&T_TMASK;
  335.         if(qual == T_INT) {
  336.         if(dtype == T_DBL) {
  337.             push(val); _rtoi(l,p); val = pop();
  338.         }
  339.         place.plval->ival = val.ival;
  340.         }
  341.         else if(qual == T_DBL) {
  342.         if(dtype == T_INT) {
  343.             push(val); _itor(l,p); val = pop();
  344.         }
  345.         place.plval->rval = val.rval;
  346.         }
  347.         else if(qual == T_CHR) {
  348.         if(dtype == T_INT) {
  349.             push(val); _itoa(l,p); val = pop();
  350.         }
  351.         else if(dtype == T_DBL) {
  352.             push(val); _rtoa(l,p); val = pop();
  353.         }
  354.         if(place.plval->sval != 0) free(place.plval->sval);
  355.         place.plval->sval = myalloc(strlen(val.sval)+1);
  356.         strcpy(place.plval->sval,val.sval);
  357.         }
  358.         else VTerror(l,p);
  359.     return(p+1);
  360.     }
  361.     return(p+1);
  362. }
  363.