BSD 3 development
[unix-history] / usr / src / cmd / awk / dump.c
CommitLineData
42d6e430
BJ
1#include "awk.def"
2#include "stdio.h"
3#include "awk.h"
4#define printit(n) printf(printname[n-FIRSTTOKEN]);
5extern char *printname[];
6extern cell fldtab[];
7
8dump(a,b) node *a, *b;
9{
10#ifdef DEBUG
11 node *x;
12 if(a==nullstat) return;
13 for(x=a;x!=NULL;x=x->nnext)
14 {
15 if(x==b) printf(" *** ");
16 if(x->ntype==NVALUE)
17 { switch(x->subtype)
18 {
19 default: runerror();
20 case CCON: case CVAR:
21 printf("%s",x->nobj->nval);
22 continue;
23 case CFLD:
24 if(x->nobj->nval==0) printf("$%d",x->nobj - fldtab);
25 else printf("$0");
26 continue;
27 }
28 }
29 else if(x->ntype==PASTAT2)
30 { pa2dump(x,b);
31 continue;
32 }
33 switch(x->nobj)
34 {
35 default: runerror();
36 case LE: case LT: case EQ:
37 case NE: case GT: case GE:
38 case MATCH: case NOTMATCH:
39 case ADD: case MINUS: case MULT:
40 case DIVIDE: case MOD: case ASGNOP:
41 case BOR: case AND: case CAT:
42 dump(x->narg[0], b);
43 printit(x->nobj);
44 if(x->nobj!=MATCH && x->nobj!=NOTMATCH)
45 dump(x->narg[1]);
46 else printf("regex");
47 break;
48 case UMINUS: case FNCN: case INCR:
49 case DECR: case INDIRECT:
50 printit(x->nobj);
51 dump(x->narg[0], b);
52 break;
53 case PRINT: case PRINTF: case SPRINTF:
54 case SPLIT:
55 printit(x->nobj);
56 dump(x->narg[0], b);
57 if(x->nobj==SPLIT || x->nobj==SPRINTF) break;
58 if(x->narg[1]==0) break;
59 printit((int)x->narg[1]);
60 dump(x->narg[2], b);
61 break;
62 case IF: case WHILE:
63 printit(x->nobj);
64 dump(x->narg[0], b);
65 printf(") ");
66 dump(x->narg[1], b);
67 if(x->narg[2]==NULL) break;
68 printit(ELSE);
69 dump(x->narg[2], b);
70 break;
71 case FOR:
72 printit(x->nobj);
73 dump(x->narg[0], b);
74 putchar(';');
75 dump(x->narg[1], b);
76 putchar(';');
77 dump(x->narg[2], b);
78 printf(") ");
79 dump(x->narg[3], b);
80 break;
81 case NEXT: case EXIT: case BREAK: case CONTINUE:
82 printit(x->nobj);
83 break;
84 case PROGRAM:
85 if(x->narg[0]!=NULL)
86 { printf("BEGIN {");
87 dump(x->narg[0], b);
88 printf("}\n");
89 }
90 dump(x->narg[1], b);
91 if(x->narg[2]!=NULL)
92 { printf("END {");
93 dump(x->narg[2], b);
94 printf("}\n");
95 }
96 break;
97 case PASTAT:
98 dump(x->narg[0], b);
99 printf("{");
100 dump(x->narg[1], b);
101 printf("}\n");
102 break;
103 case ARRAY:
104 printf(x->nval);
105 printf("[");
106 dump(x->narg[1], b);
107 printf("]");
108 break;
109 case SUBSTR:
110 printit(x->nobj);
111 dump(x->narg[0], b);
112 putchar(',');
113 dump(x->narg[1], b);
114 if(x->narg[2]!=NULL)
115 { putchar(',');
116 dump(x->narg[2], b);
117 }
118 putchar(')');
119 break;
120 }
121 if(x->ntype == NSTAT) putchar('\n');
122 }
123#endif
124}
125pa2dump(a, b) node *a, *b;
126{
127#ifdef DEBUG
128 dump(a->narg[0], b);
129 printf(", ");
130 dump(a->narg[1], b);
131 printf(" {");
132 dump(a->narg[2], b);
133 printf("}\n");
134#endif
135}