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