1: #ifndef lint 2: static char sccsid[] = "@(#)parse.c 4.2 8/11/83"; 3: #endif 4: 5: #include "awk.def" 6: #include "awk.h" 7: #include "stdio.h" 8: node *ALLOC(n) 9: { 10: register node *x; 11: x = (node *) malloc(sizeof(node) + (n-1)*sizeof(node *)); 12: if (x == NULL) 13: error(FATAL, "out of space in ALLOC"); 14: return(x); 15: } 16: node *exptostat(a) node *a; 17: { 18: a->ntype = NSTAT; 19: return(a); 20: } 21: node *nullstat; 22: node *node0(a) 23: { 24: register node *x; 25: x=ALLOC(0); 26: x->nnext = NULL; 27: x->nobj=a; 28: return(x); 29: } 30: node *node1(a,b) node *b; 31: { 32: register node *x; 33: x=ALLOC(1); 34: x->nnext = NULL; 35: x->nobj=a; 36: x->narg[0]=b; 37: return(x); 38: } 39: node *node2(a,b,c) node *b, *c; 40: { 41: register node *x; 42: x = ALLOC(2); 43: x->nnext = NULL; 44: x->nobj = a; 45: x->narg[0] = b; 46: x->narg[1] = c; 47: return(x); 48: } 49: node *node3(a,b,c,d) node *b, *c, *d; 50: { 51: register node *x; 52: x = ALLOC(3); 53: x->nnext = NULL; 54: x->nobj = a; 55: x->narg[0] = b; 56: x->narg[1] = c; 57: x->narg[2] = d; 58: return(x); 59: } 60: node *node4(a,b,c,d,e) node *b, *c, *d, *e; 61: { 62: register node *x; 63: x = ALLOC(4); 64: x->nnext = NULL; 65: x->nobj = a; 66: x->narg[0] = b; 67: x->narg[1] = c; 68: x->narg[2] = d; 69: x->narg[3] = e; 70: return(x); 71: } 72: node *stat3(a,b,c,d) node *b, *c, *d; 73: { 74: register node *x; 75: x = node3(a,b,c,d); 76: x->ntype = NSTAT; 77: return(x); 78: } 79: node *op2(a,b,c) node *b, *c; 80: { 81: register node *x; 82: x = node2(a,b,c); 83: x->ntype = NEXPR; 84: return(x); 85: } 86: node *op1(a,b) node *b; 87: { 88: register node *x; 89: x = node1(a,b); 90: x->ntype = NEXPR; 91: return(x); 92: } 93: node *stat1(a,b) node *b; 94: { 95: register node *x; 96: x = node1(a,b); 97: x->ntype = NSTAT; 98: return(x); 99: } 100: node *op3(a,b,c,d) node *b, *c, *d; 101: { 102: register node *x; 103: x = node3(a,b,c,d); 104: x->ntype = NEXPR; 105: return(x); 106: } 107: node *stat2(a,b,c) node *b, *c; 108: { 109: register node *x; 110: x = node2(a,b,c); 111: x->ntype = NSTAT; 112: return(x); 113: } 114: node *stat4(a,b,c,d,e) node *b, *c, *d, *e; 115: { 116: register node *x; 117: x = node4(a,b,c,d,e); 118: x->ntype = NSTAT; 119: return(x); 120: } 121: node *valtonode(a, b) cell *a; 122: { 123: register node *x; 124: x = node0(a); 125: x->ntype = NVALUE; 126: x->subtype = b; 127: return(x); 128: } 129: node *pa2stat(a,b,c) node *a, *b, *c; 130: { 131: register node *x; 132: x = node3(paircnt++, a, b, c); 133: x->ntype = NPA2; 134: return(x); 135: } 136: node *linkum(a,b) node *a, *b; 137: { 138: register node *c; 139: if(a == NULL) return(b); 140: else if(b == NULL) return(a); 141: for(c=a; c->nnext != NULL; c=c->nnext); 142: c->nnext = b; 143: return(a); 144: } 145: node *genprint() 146: { 147: register node *x; 148: x = stat2(PRINT,valtonode(lookup("$record", symtab, 0), CFLD), nullstat); 149: return(x); 150: }