|
|
1.1 root 1: /* Copyright (c) 1982 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)build.c 1.1 1/18/82";
4:
5: /*
6: * parse tree building routines
7: *
8: * Semantics is not checked here, this is done by the "treetype" routine
9: * in the SYM directory which returns the type of the newly built tree.
10: */
11:
12: #include "defs.h"
13: #include "tree.h"
14: #include "sym.h"
15: #include "source.h"
16: #include "tree.rep"
17:
18: /*
19: * header for using routines with unknown number and types of arguments
20: * I didn't like the looks of the standard varargs.h.
21: */
22:
23: typedef char *ARGLIST;
24:
25: #define nextarg(arglist, type) ((type *) (arglist += sizeof(type)))[-1]
26:
27: /*
28: * build a tree
29: */
30:
31: /*VARARGS1*/
32: NODE *build(op, args)
33: OP op;
34: {
35: register NODE *p;
36: NODE *p1, *p2;
37: register ARGLIST ap;
38: SYM *s;
39:
40: p = alloc(1, NODE);
41: p->op = op;
42: ap = (ARGLIST) &args;
43: switch(degree(op)) {
44: case BINARY:
45: p->left = p1 = nextarg(ap, NODE *);
46: p->right = p2 = nextarg(ap, NODE *);
47: break;
48:
49: case UNARY:
50: p->left = p1 = nextarg(ap, NODE *);
51: p->right = NIL;
52: break;
53:
54: }
55: switch(op) {
56: case O_NAME:
57: case O_WHICH:
58: p->nameval = nextarg(ap, SYM *);
59: break;
60:
61: case O_LCON:
62: p->lconval = nextarg(ap, long);
63: break;
64:
65: case O_FCON:
66: p->fconval = nextarg(ap, double);
67: break;
68:
69: case O_SCON:
70: p->sconval = nextarg(ap, char *);
71: break;
72:
73: case O_CALL:
74: p->left = nextarg(ap, NODE *);
75: p->right = nextarg(ap, NODE *);
76: break;
77:
78: case O_CHFILE:
79: p->sconval = nextarg(ap, char *);
80: break;
81:
82: case O_EDIT:
83: p->sconval = nextarg(ap, char *);
84: if (p->sconval == NIL) {
85: p->sconval = cursource;
86: }
87: break;
88:
89: case O_SOURCE:
90: p->sconval = nextarg(ap, char *);
91: break;
92:
93: case O_PRINT:
94: case O_WHATIS:
95: case O_LIST:
96: case O_XI:
97: case O_XD:
98: p->left = nextarg(ap, NODE *);
99: break;
100:
101: case O_TRACE:
102: case O_TRACEI:
103: case O_STOP:
104: case O_STOPI:
105: p->what = nextarg(ap, NODE *);
106: p->where = nextarg(ap, NODE *);
107: p->cond = nextarg(ap, NODE *);
108: break;
109:
110: case O_DELETE:
111: p->left = build(O_LCON, nextarg(ap, long));
112: break;
113:
114: case O_QLINE: {
115: char *s;
116:
117: s = nextarg(ap, char *);
118: p->left = alloc(1, NODE);
119: p->left->op = O_SCON;
120: if (s != cursource) {
121: p->left->sconval = s;
122: s[strlen(s) - 1] = '\0';
123: } else {
124: p->left->sconval = strdup(s);
125: }
126: p->right = nextarg(ap, NODE *);
127: break;
128: }
129:
130: case O_ALIAS:
131: p->left = alloc(1, NODE);
132: p->left->op = O_SCON;
133: p->left->sconval = nextarg(ap, char *);
134: p->right = alloc(1, NODE);
135: p->right->op = O_SCON;
136: p->right->sconval = nextarg(ap, char *);
137: break;
138:
139: default:
140: if (op < O_NOP || op > O_LASTOP) {
141: panic("build: bad op %d", op);
142: }
143: break;
144: }
145: p->nodetype = treetype(p, (ARGLIST) &args);
146: return(p);
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.