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