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