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