|
|
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.2 (Berkeley) 4/7/87"; ! 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: register ARGLIST ap; ! 42: ! 43: p = alloc(1, NODE); ! 44: p->op = op; ! 45: ap = (ARGLIST) &args; ! 46: switch(degree(op)) { ! 47: case BINARY: ! 48: p->left = nextarg(ap, NODE *); ! 49: p->right = nextarg(ap, NODE *); ! 50: break; ! 51: ! 52: case UNARY: ! 53: p->left = nextarg(ap, NODE *); ! 54: p->right = NIL; ! 55: break; ! 56: ! 57: } ! 58: switch(op) { ! 59: case O_NAME: ! 60: case O_WHICH: ! 61: p->nameval = nextarg(ap, SYM *); ! 62: break; ! 63: ! 64: case O_LCON: ! 65: p->lconval = nextarg(ap, long); ! 66: break; ! 67: ! 68: case O_FCON: ! 69: p->fconval = nextarg(ap, double); ! 70: break; ! 71: ! 72: case O_SCON: ! 73: p->sconval = nextarg(ap, char *); ! 74: break; ! 75: ! 76: case O_CALL: ! 77: p->left = nextarg(ap, NODE *); ! 78: p->right = nextarg(ap, NODE *); ! 79: break; ! 80: ! 81: case O_CHFILE: ! 82: p->sconval = nextarg(ap, char *); ! 83: break; ! 84: ! 85: case O_EDIT: ! 86: p->sconval = nextarg(ap, char *); ! 87: if (p->sconval == NIL) { ! 88: p->sconval = cursource; ! 89: } ! 90: break; ! 91: ! 92: case O_SOURCE: ! 93: p->sconval = nextarg(ap, char *); ! 94: break; ! 95: ! 96: case O_PRINT: ! 97: case O_WHATIS: ! 98: case O_LIST: ! 99: case O_XI: ! 100: case O_XD: ! 101: p->left = nextarg(ap, NODE *); ! 102: break; ! 103: ! 104: case O_TRACE: ! 105: case O_TRACEI: ! 106: case O_STOP: ! 107: case O_STOPI: ! 108: p->what = nextarg(ap, NODE *); ! 109: p->where = nextarg(ap, NODE *); ! 110: p->cond = nextarg(ap, NODE *); ! 111: break; ! 112: ! 113: case O_DELETE: ! 114: p->left = build(O_LCON, nextarg(ap, long)); ! 115: break; ! 116: ! 117: case O_QLINE: { ! 118: char *s; ! 119: ! 120: s = nextarg(ap, char *); ! 121: p->left = alloc(1, NODE); ! 122: p->left->op = O_SCON; ! 123: if (s != cursource) { ! 124: p->left->sconval = s; ! 125: s[strlen(s) - 1] = '\0'; ! 126: } else { ! 127: p->left->sconval = strdup(s); ! 128: } ! 129: p->right = nextarg(ap, NODE *); ! 130: break; ! 131: } ! 132: ! 133: case O_ALIAS: ! 134: p->left = alloc(1, NODE); ! 135: p->left->op = O_SCON; ! 136: p->left->sconval = nextarg(ap, char *); ! 137: p->right = alloc(1, NODE); ! 138: p->right->op = O_SCON; ! 139: p->right->sconval = nextarg(ap, char *); ! 140: break; ! 141: ! 142: default: ! 143: if (op < O_NOP || op > O_LASTOP) { ! 144: panic("build: bad op %d", op); ! 145: } ! 146: break; ! 147: } ! 148: p->nodetype = treetype(p, (ARGLIST) &args); ! 149: return(p); ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.