1*5536Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*5536Slinton 3*5536Slinton static char sccsid[] = "@(#)assign.c 1.1 01/18/82"; 4*5536Slinton 5*5536Slinton /* 6*5536Slinton * assign the value of an expression to a variable (or term) 7*5536Slinton */ 8*5536Slinton 9*5536Slinton #include "defs.h" 10*5536Slinton #include "tree.h" 11*5536Slinton #include "sym.h" 12*5536Slinton #include "process.h" 13*5536Slinton #include "tree.rep" 14*5536Slinton 15*5536Slinton assign(var, exp) 16*5536Slinton NODE *var; 17*5536Slinton NODE *exp; 18*5536Slinton { 19*5536Slinton ADDRESS addr; 20*5536Slinton int varsize; 21*5536Slinton char cvalue; 22*5536Slinton short svalue; 23*5536Slinton long lvalue; 24*5536Slinton 25*5536Slinton if (!compatible(var->nodetype, exp->nodetype)) { 26*5536Slinton error("incompatible types"); 27*5536Slinton } 28*5536Slinton addr = lval(var); 29*5536Slinton eval(exp); 30*5536Slinton varsize = size(var->nodetype); 31*5536Slinton if (varsize < sizeof(long)) { 32*5536Slinton lvalue = pop(long); 33*5536Slinton switch (varsize) { 34*5536Slinton case sizeof(char): 35*5536Slinton cvalue = lvalue; 36*5536Slinton dwrite(&cvalue, addr, varsize); 37*5536Slinton break; 38*5536Slinton 39*5536Slinton case sizeof(short): 40*5536Slinton svalue = lvalue; 41*5536Slinton dwrite(&svalue, addr, varsize); 42*5536Slinton break; 43*5536Slinton 44*5536Slinton default: 45*5536Slinton panic("bad size %d", varsize); 46*5536Slinton } 47*5536Slinton } else { 48*5536Slinton sp -= varsize; 49*5536Slinton dwrite(sp, addr, varsize); 50*5536Slinton } 51*5536Slinton } 52