1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)assign.c 5.1 (Berkeley) 06/06/85"; 9 #endif not lint 10 11 /* 12 * assign the value of an expression to a variable (or term) 13 */ 14 15 #include "defs.h" 16 #include "tree.h" 17 #include "sym.h" 18 #include "process.h" 19 #include "tree.rep" 20 21 assign(var, exp) 22 NODE *var; 23 NODE *exp; 24 { 25 ADDRESS addr; 26 int varsize; 27 char cvalue; 28 short svalue; 29 long lvalue; 30 31 if (!compatible(var->nodetype, exp->nodetype)) { 32 error("incompatible types"); 33 } 34 addr = lval(var); 35 eval(exp); 36 varsize = size(var->nodetype); 37 if (varsize < sizeof(long)) { 38 lvalue = pop(long); 39 switch (varsize) { 40 case sizeof(char): 41 cvalue = lvalue; 42 dwrite(&cvalue, addr, varsize); 43 break; 44 45 case sizeof(short): 46 svalue = lvalue; 47 dwrite(&svalue, addr, varsize); 48 break; 49 50 default: 51 panic("bad size %d", varsize); 52 } 53 } else { 54 sp -= varsize; 55 dwrite(sp, addr, varsize); 56 } 57 } 58