xref: /csrg-svn/usr.bin/pascal/pdx/tree/assign.c (revision 22557)
1*22557Sdist /*
2*22557Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22557Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22557Sdist  * specifies the terms and conditions for redistribution.
5*22557Sdist  */
65536Slinton 
7*22557Sdist #ifndef lint
8*22557Sdist static char sccsid[] = "@(#)assign.c	5.1 (Berkeley) 06/06/85";
9*22557Sdist #endif not lint
105536Slinton 
115536Slinton /*
125536Slinton  * assign the value of an expression to a variable (or term)
135536Slinton  */
145536Slinton 
155536Slinton #include "defs.h"
165536Slinton #include "tree.h"
175536Slinton #include "sym.h"
185536Slinton #include "process.h"
195536Slinton #include "tree.rep"
205536Slinton 
215536Slinton assign(var, exp)
225536Slinton NODE *var;
235536Slinton NODE *exp;
245536Slinton {
255536Slinton 	ADDRESS addr;
265536Slinton 	int varsize;
275536Slinton 	char cvalue;
285536Slinton 	short svalue;
295536Slinton 	long lvalue;
305536Slinton 
315536Slinton 	if (!compatible(var->nodetype, exp->nodetype)) {
325536Slinton 		error("incompatible types");
335536Slinton 	}
345536Slinton 	addr = lval(var);
355536Slinton 	eval(exp);
365536Slinton 	varsize = size(var->nodetype);
375536Slinton 	if (varsize < sizeof(long)) {
385536Slinton 		lvalue = pop(long);
395536Slinton 		switch (varsize) {
405536Slinton 			case sizeof(char):
415536Slinton 				cvalue = lvalue;
425536Slinton 				dwrite(&cvalue, addr, varsize);
435536Slinton 				break;
445536Slinton 
455536Slinton 			case sizeof(short):
465536Slinton 				svalue = lvalue;
475536Slinton 				dwrite(&svalue, addr, varsize);
485536Slinton 				break;
495536Slinton 
505536Slinton 			default:
515536Slinton 				panic("bad size %d", varsize);
525536Slinton 		}
535536Slinton 	} else {
545536Slinton 		sp -= varsize;
555536Slinton 		dwrite(sp, addr, varsize);
565536Slinton 	}
575536Slinton }
58