1*22558Sdist /* 2*22558Sdist * Copyright (c) 1980 Regents of the University of California. 3*22558Sdist * All rights reserved. The Berkeley software License Agreement 4*22558Sdist * specifies the terms and conditions for redistribution. 5*22558Sdist */ 65542Slinton 7*22558Sdist #ifndef lint 8*22558Sdist static char sccsid[] = "@(#)build.c 5.1 (Berkeley) 06/06/85"; 9*22558Sdist #endif not lint 105542Slinton /* 115542Slinton * parse tree building routines 125542Slinton * 135542Slinton * Semantics is not checked here, this is done by the "treetype" routine 145542Slinton * in the SYM directory which returns the type of the newly built tree. 155542Slinton */ 165542Slinton 175542Slinton #include "defs.h" 185542Slinton #include "tree.h" 195542Slinton #include "sym.h" 205542Slinton #include "source.h" 215542Slinton #include "tree.rep" 225542Slinton 235542Slinton /* 245542Slinton * header for using routines with unknown number and types of arguments 255542Slinton * I didn't like the looks of the standard varargs.h. 265542Slinton */ 275542Slinton 285542Slinton typedef char *ARGLIST; 295542Slinton 305542Slinton #define nextarg(arglist, type) ((type *) (arglist += sizeof(type)))[-1] 315542Slinton 325542Slinton /* 335542Slinton * build a tree 345542Slinton */ 355542Slinton 365542Slinton /*VARARGS1*/ 375542Slinton NODE *build(op, args) 385542Slinton OP op; 395542Slinton { 405542Slinton register NODE *p; 415542Slinton NODE *p1, *p2; 425542Slinton register ARGLIST ap; 435542Slinton SYM *s; 445542Slinton 455542Slinton p = alloc(1, NODE); 465542Slinton p->op = op; 475542Slinton ap = (ARGLIST) &args; 485542Slinton switch(degree(op)) { 495542Slinton case BINARY: 505542Slinton p->left = p1 = nextarg(ap, NODE *); 515542Slinton p->right = p2 = nextarg(ap, NODE *); 525542Slinton break; 535542Slinton 545542Slinton case UNARY: 555542Slinton p->left = p1 = nextarg(ap, NODE *); 565542Slinton p->right = NIL; 575542Slinton break; 585542Slinton 595542Slinton } 605542Slinton switch(op) { 615542Slinton case O_NAME: 625542Slinton case O_WHICH: 635542Slinton p->nameval = nextarg(ap, SYM *); 645542Slinton break; 655542Slinton 665542Slinton case O_LCON: 675542Slinton p->lconval = nextarg(ap, long); 685542Slinton break; 695542Slinton 705542Slinton case O_FCON: 715542Slinton p->fconval = nextarg(ap, double); 725542Slinton break; 735542Slinton 745542Slinton case O_SCON: 755542Slinton p->sconval = nextarg(ap, char *); 765542Slinton break; 775542Slinton 785542Slinton case O_CALL: 795542Slinton p->left = nextarg(ap, NODE *); 805542Slinton p->right = nextarg(ap, NODE *); 815542Slinton break; 825542Slinton 835542Slinton case O_CHFILE: 845542Slinton p->sconval = nextarg(ap, char *); 855542Slinton break; 865542Slinton 875542Slinton case O_EDIT: 885542Slinton p->sconval = nextarg(ap, char *); 895542Slinton if (p->sconval == NIL) { 905542Slinton p->sconval = cursource; 915542Slinton } 925542Slinton break; 935542Slinton 945542Slinton case O_SOURCE: 955542Slinton p->sconval = nextarg(ap, char *); 965542Slinton break; 975542Slinton 985542Slinton case O_PRINT: 995542Slinton case O_WHATIS: 1005542Slinton case O_LIST: 1015542Slinton case O_XI: 1025542Slinton case O_XD: 1035542Slinton p->left = nextarg(ap, NODE *); 1045542Slinton break; 1055542Slinton 1065542Slinton case O_TRACE: 1075542Slinton case O_TRACEI: 1085542Slinton case O_STOP: 1095542Slinton case O_STOPI: 1105542Slinton p->what = nextarg(ap, NODE *); 1115542Slinton p->where = nextarg(ap, NODE *); 1125542Slinton p->cond = nextarg(ap, NODE *); 1135542Slinton break; 1145542Slinton 1155542Slinton case O_DELETE: 1165542Slinton p->left = build(O_LCON, nextarg(ap, long)); 1175542Slinton break; 1185542Slinton 1195542Slinton case O_QLINE: { 1205542Slinton char *s; 1215542Slinton 1225542Slinton s = nextarg(ap, char *); 1235542Slinton p->left = alloc(1, NODE); 1245542Slinton p->left->op = O_SCON; 1255542Slinton if (s != cursource) { 1265542Slinton p->left->sconval = s; 1275542Slinton s[strlen(s) - 1] = '\0'; 1285542Slinton } else { 1295542Slinton p->left->sconval = strdup(s); 1305542Slinton } 1315542Slinton p->right = nextarg(ap, NODE *); 1325542Slinton break; 1335542Slinton } 1345542Slinton 1355542Slinton case O_ALIAS: 1365542Slinton p->left = alloc(1, NODE); 1375542Slinton p->left->op = O_SCON; 1385542Slinton p->left->sconval = nextarg(ap, char *); 1395542Slinton p->right = alloc(1, NODE); 1405542Slinton p->right->op = O_SCON; 1415542Slinton p->right->sconval = nextarg(ap, char *); 1425542Slinton break; 1435542Slinton 1445542Slinton default: 1455542Slinton if (op < O_NOP || op > O_LASTOP) { 1465542Slinton panic("build: bad op %d", op); 1475542Slinton } 1485542Slinton break; 1495542Slinton } 1505542Slinton p->nodetype = treetype(p, (ARGLIST) &args); 1515542Slinton return(p); 1525542Slinton } 153