home *** CD-ROM | disk | FTP | other *** search
- /* operat.c -- operations, as opposed to actions. FOR is an action,
- * '+' is an operation.
- *
- * More operators can be found in the machine generated file "operat2.c".
- */
-
- #include "bsdefs.h"
-
-
- /* BINARY OPERATORS */
-
- /* Common description for the binary ops.
- * also applies to all ops in operat2.c
- *
- * M_COMPILE:
- * x op x --to-- x,_op,x
- * M_EXECUTE:
- * stack: ar2,ar1,x --to-- (ar1 op ar2),x
- */
-
-
- _comma(l,p) int (*l[])(),p;
- {
- union value s1,s2,s3;
- if((status&XMODE) == M_FIXUP) return(p);
- if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- s1 = pop();
- s2 = pop();
- s3.sval = myalloc(strlen(s1.sval)+strlen(s2.sval)+3);
- strcpy(s3.sval,s2.sval);
- strcat(s3.sval,"\t");
- strcat(s3.sval,s1.sval);
- if(s1.sval != 0) free(s1.sval);
- if(s2.sval != 0) free(s2.sval);
- push(s3);
- }
- return(p);
- }
- _scolon(l,p) int(*l[])(),p;
- {
- union value s1,s2,s3;
- if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- s1 = pop();
- s2 = pop();
- s3.sval = myalloc(strlen(s1.sval)+strlen(s2.sval)+2);
- strcpy(s3.sval,s2.sval);
- strcat(s3.sval,s1.sval);
- push(s3);
- if(s1.sval != 0) free(s1.sval);
- if(s2.sval != 0) free(s2.sval);
- }
- return(p);
- }
- /* last of binary operators */
-
- /* ---And now for something completely different: a Unary Operator.
- *
- * M_COMPILE:
- * x not x --to-- x,_not,x
- * M_EXECUTE:
- * stack: bool,x --to-- !(bool),x
- */
- _not(l,p) int (*l[])(),p;
- {
- union value val;
-
- if((status&XMODE) == M_EXECUTE) {
- val = pop();
- val.ival = ! val.ival;
- push(val);
- }
- return(p);
- }
-
- /* M_COMPILE:
- * x itoa x --to-- x,_itoa,x
- * M_EXECUTE:
- * stack: int,x --to-- string,x
- */
- _itoa(l,p)
- int (*l[])(),p;
- {
- union value val;
- char s2[30];
-
- if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- val=pop();
- sprintf(s2,"%D",val.ival); /* optimize later */
- if(dbg) printf("_icon():M_EXECUTE:ival:%D to sval:%s\n",val.ival,s2);
- val.sval=myalloc(strlen(s2)+1);
- strcpy(val.sval,s2);
- push(val);
- }
- return(p);
- }
- _rtoa(l,p)
- int (*l[])(),p;
- {
- union value val;
- char s2[30];
-
- if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- val = pop();
- sprintf(s2,"%g",val.rval);
- if(dbg) printf("_rtoa():M_EXECUTE:rval:%g to sval:%s\n",val.rval,s2);
- val.sval = myalloc(strlen(s2)+1);
- strcpy(val.sval,s2);
- push(val);
- }
- return(p);
- }
- _itor(l,p)
- int (*l[])(),p;
- {
- union value v1,v2;
-
- if((status&XMODE) == M_READ) { dtype = T_DBL; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- v1 = pop();
- v2.rval = (double)v1.ival;
- push(v2);
- }
- return(p);
- }
- _rtoi(l,p)
- int (*l[])(),p;
- {
- union value v1,v2;
-
- if((status&XMODE) == M_READ) { dtype = T_INT; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- v1 = pop();
- v2.ival = (int)v1.rval;
- push(v2);
- }
- return(p);
- }
-
- /* M_COMPILE:
- * x scon "quoted string" x --to-- x,_scon,&string,x
- * M_EXECUTE:
- * stack: x --to-- string,x
- * other: pushes a COPY of the string, not the original.
- */
- _scon(l,p)
- int (*l[])(),p;
- {
- char *s,c;
- union value val;
- int i;
-
- if((status&XMODE) == M_FIXUP) ++p;
- if((status&XMODE) == M_READ) { dtype = T_CHR; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- s = l[p++];
- val.sval = myalloc(strlen(s)+1);
- strcpy(val.sval,s);
- push(val);
- if(dbg) printf("_scon():M_EXECUTE:sval:%s\n",val.sval);
- }
- return(p);
- }
-
- /* M_COMPILE:
- * x icon int x --to-- x,_icon,int,x
- * M_EXECUTE:
- * stack: x --to-- int,x
- */
- _icon(l,p)
- int (*l[])(),p;
- {
- union value val;
- union loni v;
- int i;
-
- if((status&XMODE) == M_FIXUP) return(p+(sizeof(long)/sizeof(int)));
- if((status&XMODE) == M_READ) { dtype = T_INT; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- for(i=0; i<(sizeof(long)/sizeof(int)); i++)
- v.i_in_loni[i] = l[p++];
- val.ival = v.l_in_loni;
- push(val);
- if(dbg) printf("_icon():M_EXECUTE:ival:%D\n",val.ival);
- }
- return(p);
- }
- _rcon(l,p)
- int (*l[])(),p;
- {
- union doni v;
- int i;
- union value val;
-
- if((status&XMODE) == M_FIXUP) return(p+(sizeof(double)/sizeof(int)));
- if((status&XMODE) == M_READ) { dtype = T_DBL; goto EXEC; }
- if((status&XMODE) = M_EXECUTE) {
- EXEC:
- for(i=0; i<(sizeof(double)/sizeof(int)); i++)
- v.i_in_doni[i] = l[p++];
- val.rval = v.d_in_doni;
- push(val);
- }
- return(p);
- }
-
- /* M_COMPILE:
- * x val type x --to-- x,_val,type,x
- * M_EXECUTE:
- * stack: place,x --to-- value,x
- * other: for strings, pushes a copy of the string.
- */
- _val(l,p) int(*l[])(),p;
- {
- union value place,val;
- int ty;
-
- if((status&XMODE) == M_READ) { dtype = l[p]; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- ty = l[p];
- place = pop();
- if(dbg) printf("_val():M_EXECUTE:var:%s",place.vpval->name);
- place.plval = getplace(place.vpval);
- if(ty==T_CHR && place.plval->sval!=0) {
- val.sval = myalloc(strlen(place.plval->sval)+1);
- strcpy(val.sval,place.plval->sval);
- push(val);
- }
- else push(*place.plval);
- if(dbg) printf(":ival:%D:rval:%g:sval:%s\n",ty==T_INT?place.plval->ival:(long)0,
- ty==T_DBL?place.plval->rval:(double)0,ty==T_CHR?place.plval->sval:0);
- }
- return(p+1);
- }
-
- /* M_COMPILE:
- * x store typ x --to-- x,_store,type,x
- * M_EXECUTE:
- * stack: value,location,x --to-- value,x
- * (stores value at location).
- */
- _store(l,p) int(*l[])(),p;
- {
- union value place,val;
- int ty;
-
- if((status&XMODE) == M_READ) { dtype = l[p]; goto EXEC; }
- if((status&XMODE) == M_EXECUTE) {
- EXEC:
- val = pop();
- place = pop();
- ty = l[p];
- if(dbg) printf("_store():M_EXECUTE:var:%s:ival:%D:rval:%g:sval:%s\n",
- place.vpval->name,ty==T_INT?val.ival:(long)0,ty==T_DBL?val.rval:(double)0,ty==T_CHR?val.sval:0);
- place.plval = getplace(place.vpval);
- if(ty==T_CHR && place.plval->sval!=0) free(place.plval->sval);
- (*place.plval) = val;
- push(val);
- }
- return(p+1);
- }
-
- /* M_COMPILE:
- * x var typ name x --to-- x,_var,&vlist entry,x
- * M_EXECUTE:
- * stack: x --to-- &vlist entry,x
- * M_INPUT:
- * (&vlist entry)->val is set to input value.
- * M_READ:
- * Moves the data list pointers to the next data item. If no next
- * data item, calls ODerror.
- * Does a "gosub" to the data item, to get its value on the stack.
- * Does T_INT to T_CHR conversion if necessary.
- * Pops value into vp->val.
- */
- _var(l,p) int(*l[])(),p; /* same proc for any variable type */
- {
- char *s;
- struct dictnode *vp;
- struct line *thislist;
- union value place,val;
- int ty,qual;
-
- if((status&XMODE) == M_EXECUTE) {
- val.vpval = l[p++];
- if(dbg) printf("_var():M_EXECUTE:var:(%d)%s\n",val.vpval->type_of_value,
- val.vpval->name);
- push(val);
- return(p);
- }
- if((status&XMODE) == M_INPUT) {
- vp = l[p++];
- place.plval = getplace(vp);
- ty = (vp->type_of_value) & T_TMASK;
- if(ty == T_INT)
- place.plval->ival = atol(int_in());
- else if(ty == T_DBL)
- place.plval->rval = atof(real_in());
- else /* ty == T_CHR */
- place.plval->sval = scon_in();
- if(dbg) printf("_var():M_INPUT:var:(%d)%s:ival:%D:rval:%g:sval:%s\n",
- vp->type_of_value,vp->name,ty==T_INT?place.plval->ival:(long)0,
- ty==T_DBL?place.plval->rval:(double)0,ty==T_CHR?place.plval->sval:0);
- return(p);
- }
- if((status&XMODE) == M_READ) {
- nxdl: if(dlist[dlp] == 0) ODerror(l,p); /* ran off end of dlist */
- thislist = dlist[dlp];
- if((thislist->code)[dlindx] == 0) {
- dlp++;
- dlindx = 2; /* skips <_data,0> */
- goto nxdl;
- }
-
- status = M_EXECUTE;
- dlindx = interp(thislist->code,dlindx);
- status = M_READ;
-
- val = pop();
- vp = l[p];
- place.plval = getplace(vp);
- qual = vp->type_of_value&T_TMASK;
- if(qual == T_INT) {
- if(dtype == T_DBL) {
- push(val); _rtoi(l,p); val = pop();
- }
- place.plval->ival = val.ival;
- }
- else if(qual == T_DBL) {
- if(dtype == T_INT) {
- push(val); _itor(l,p); val = pop();
- }
- place.plval->rval = val.rval;
- }
- else if(qual == T_CHR) {
- if(dtype == T_INT) {
- push(val); _itoa(l,p); val = pop();
- }
- else if(dtype == T_DBL) {
- push(val); _rtoa(l,p); val = pop();
- }
- if(place.plval->sval != 0) free(place.plval->sval);
- place.plval->sval = myalloc(strlen(val.sval)+1);
- strcpy(place.plval->sval,val.sval);
- }
- else VTerror(l,p);
- return(p+1);
- }
- return(p+1);
- }
-