Commit | Line | Data |
378cc40b |
1 | /* $Header: dump.c,v 2.0 88/06/05 00:08:44 root Exp $ |
8d063cd8 |
2 | * |
3 | * $Log: dump.c,v $ |
378cc40b |
4 | * Revision 2.0 88/06/05 00:08:44 root |
5 | * Baseline version 2.0. |
8d063cd8 |
6 | * |
7 | */ |
8 | |
8d063cd8 |
9 | #include "EXTERN.h" |
8d063cd8 |
10 | #include "perl.h" |
11 | |
12 | #ifdef DEBUGGING |
13 | static int dumplvl = 0; |
14 | |
15 | dump_cmd(cmd,alt) |
16 | register CMD *cmd; |
17 | register CMD *alt; |
18 | { |
19 | fprintf(stderr,"{\n"); |
20 | while (cmd) { |
21 | dumplvl++; |
22 | dump("C_TYPE = %s\n",cmdname[cmd->c_type]); |
378cc40b |
23 | if (cmd->c_line) |
24 | dump("C_LINE = %d\n",cmd->c_line); |
8d063cd8 |
25 | if (cmd->c_label) |
26 | dump("C_LABEL = \"%s\"\n",cmd->c_label); |
27 | dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]); |
28 | *buf = '\0'; |
29 | if (cmd->c_flags & CF_FIRSTNEG) |
30 | strcat(buf,"FIRSTNEG,"); |
31 | if (cmd->c_flags & CF_NESURE) |
32 | strcat(buf,"NESURE,"); |
33 | if (cmd->c_flags & CF_EQSURE) |
34 | strcat(buf,"EQSURE,"); |
35 | if (cmd->c_flags & CF_COND) |
36 | strcat(buf,"COND,"); |
37 | if (cmd->c_flags & CF_LOOP) |
38 | strcat(buf,"LOOP,"); |
39 | if (cmd->c_flags & CF_INVERT) |
40 | strcat(buf,"INVERT,"); |
41 | if (cmd->c_flags & CF_ONCE) |
42 | strcat(buf,"ONCE,"); |
43 | if (cmd->c_flags & CF_FLIP) |
44 | strcat(buf,"FLIP,"); |
45 | if (*buf) |
46 | buf[strlen(buf)-1] = '\0'; |
47 | dump("C_FLAGS = (%s)\n",buf); |
378cc40b |
48 | if (cmd->c_short) { |
49 | dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short)); |
50 | dump("C_SLEN = \"%d\"\n",cmd->c_slen); |
8d063cd8 |
51 | } |
52 | if (cmd->c_stab) { |
53 | dump("C_STAB = "); |
54 | dump_stab(cmd->c_stab); |
55 | } |
56 | if (cmd->c_spat) { |
57 | dump("C_SPAT = "); |
58 | dump_spat(cmd->c_spat); |
59 | } |
60 | if (cmd->c_expr) { |
61 | dump("C_EXPR = "); |
62 | dump_arg(cmd->c_expr); |
63 | } else |
64 | dump("C_EXPR = NULL\n"); |
65 | switch (cmd->c_type) { |
66 | case C_WHILE: |
67 | case C_BLOCK: |
68 | case C_IF: |
69 | if (cmd->ucmd.ccmd.cc_true) { |
70 | dump("CC_TRUE = "); |
71 | dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt); |
72 | } else |
73 | dump("CC_TRUE = NULL\n"); |
74 | if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) { |
75 | dump("CC_ELSE = "); |
76 | dump_cmd(cmd->ucmd.ccmd.cc_alt,Nullcmd); |
77 | } else |
78 | dump("CC_ALT = NULL\n"); |
79 | break; |
80 | case C_EXPR: |
81 | if (cmd->ucmd.acmd.ac_stab) { |
82 | dump("AC_STAB = "); |
378cc40b |
83 | dump_stab(cmd->ucmd.acmd.ac_stab); |
8d063cd8 |
84 | } else |
85 | dump("AC_STAB = NULL\n"); |
86 | if (cmd->ucmd.acmd.ac_expr) { |
87 | dump("AC_EXPR = "); |
88 | dump_arg(cmd->ucmd.acmd.ac_expr); |
89 | } else |
90 | dump("AC_EXPR = NULL\n"); |
91 | break; |
92 | } |
93 | cmd = cmd->c_next; |
94 | if (cmd && cmd->c_head == cmd) { /* reached end of while loop */ |
95 | dump("C_NEXT = HEAD\n"); |
96 | dumplvl--; |
97 | dump("}\n"); |
98 | break; |
99 | } |
100 | dumplvl--; |
101 | dump("}\n"); |
102 | if (cmd) |
103 | if (cmd == alt) |
104 | dump("CONT{\n"); |
105 | else |
106 | dump("{\n"); |
107 | } |
108 | } |
109 | |
110 | dump_arg(arg) |
111 | register ARG *arg; |
112 | { |
113 | register int i; |
114 | |
115 | fprintf(stderr,"{\n"); |
116 | dumplvl++; |
117 | dump("OP_TYPE = %s\n",opname[arg->arg_type]); |
118 | dump("OP_LEN = %d\n",arg->arg_len); |
378cc40b |
119 | if (arg->arg_flags) { |
120 | dump_flags(buf,arg->arg_flags); |
121 | dump("OP_FLAGS = (%s)\n",buf); |
122 | } |
8d063cd8 |
123 | for (i = 1; i <= arg->arg_len; i++) { |
124 | dump("[%d]ARG_TYPE = %s\n",i,argname[arg[i].arg_type]); |
125 | if (arg[i].arg_len) |
126 | dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len); |
378cc40b |
127 | if (arg[i].arg_flags) { |
128 | dump_flags(buf,arg[i].arg_flags); |
129 | dump("[%d]ARG_FLAGS = (%s)\n",i,buf); |
130 | } |
8d063cd8 |
131 | switch (arg[i].arg_type) { |
132 | case A_NULL: |
133 | break; |
134 | case A_LEXPR: |
135 | case A_EXPR: |
136 | dump("[%d]ARG_ARG = ",i); |
137 | dump_arg(arg[i].arg_ptr.arg_arg); |
138 | break; |
139 | case A_CMD: |
140 | dump("[%d]ARG_CMD = ",i); |
141 | dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd); |
142 | break; |
378cc40b |
143 | case A_WORD: |
8d063cd8 |
144 | case A_STAB: |
145 | case A_LVAL: |
146 | case A_READ: |
378cc40b |
147 | case A_GLOB: |
8d063cd8 |
148 | case A_ARYLEN: |
149 | dump("[%d]ARG_STAB = ",i); |
150 | dump_stab(arg[i].arg_ptr.arg_stab); |
151 | break; |
152 | case A_SINGLE: |
153 | case A_DOUBLE: |
154 | case A_BACKTICK: |
155 | dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str)); |
156 | break; |
157 | case A_SPAT: |
158 | dump("[%d]ARG_SPAT = ",i); |
159 | dump_spat(arg[i].arg_ptr.arg_spat); |
160 | break; |
161 | case A_NUMBER: |
162 | dump("[%d]ARG_NVAL = %f\n",i,arg[i].arg_ptr.arg_nval); |
163 | break; |
164 | } |
165 | } |
166 | dumplvl--; |
167 | dump("}\n"); |
168 | } |
169 | |
378cc40b |
170 | dump_flags(b,flags) |
171 | char *b; |
172 | unsigned flags; |
173 | { |
174 | *b = '\0'; |
175 | if (flags & AF_SPECIAL) |
176 | strcat(b,"SPECIAL,"); |
177 | if (flags & AF_POST) |
178 | strcat(b,"POST,"); |
179 | if (flags & AF_PRE) |
180 | strcat(b,"PRE,"); |
181 | if (flags & AF_UP) |
182 | strcat(b,"UP,"); |
183 | if (flags & AF_COMMON) |
184 | strcat(b,"COMMON,"); |
185 | if (flags & AF_NUMERIC) |
186 | strcat(b,"NUMERIC,"); |
187 | if (flags & AF_LISTISH) |
188 | strcat(b,"LISTISH,"); |
189 | if (flags & AF_LOCAL) |
190 | strcat(b,"LOCAL,"); |
191 | if (*b) |
192 | b[strlen(b)-1] = '\0'; |
193 | } |
194 | |
8d063cd8 |
195 | dump_stab(stab) |
196 | register STAB *stab; |
197 | { |
378cc40b |
198 | if (!stab) { |
199 | fprintf(stderr,"{}\n"); |
200 | return; |
201 | } |
8d063cd8 |
202 | dumplvl++; |
203 | fprintf(stderr,"{\n"); |
204 | dump("STAB_NAME = %s\n",stab->stab_name); |
205 | dumplvl--; |
206 | dump("}\n"); |
207 | } |
208 | |
209 | dump_spat(spat) |
210 | register SPAT *spat; |
211 | { |
212 | char ch; |
213 | |
378cc40b |
214 | if (!spat) { |
215 | fprintf(stderr,"{}\n"); |
216 | return; |
217 | } |
8d063cd8 |
218 | fprintf(stderr,"{\n"); |
219 | dumplvl++; |
220 | if (spat->spat_runtime) { |
221 | dump("SPAT_RUNTIME = "); |
222 | dump_arg(spat->spat_runtime); |
223 | } else { |
378cc40b |
224 | if (spat->spat_flags & SPAT_ONCE) |
8d063cd8 |
225 | ch = '?'; |
226 | else |
227 | ch = '/'; |
378cc40b |
228 | dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch); |
8d063cd8 |
229 | } |
230 | if (spat->spat_repl) { |
231 | dump("SPAT_REPL = "); |
232 | dump_arg(spat->spat_repl); |
233 | } |
378cc40b |
234 | if (spat->spat_short) { |
235 | dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short)); |
236 | } |
8d063cd8 |
237 | dumplvl--; |
238 | dump("}\n"); |
239 | } |
240 | |
378cc40b |
241 | /* VARARGS1 */ |
8d063cd8 |
242 | dump(arg1,arg2,arg3,arg4,arg5) |
378cc40b |
243 | char *arg1; |
244 | long arg2, arg3, arg4, arg5; |
8d063cd8 |
245 | { |
246 | int i; |
247 | |
248 | for (i = dumplvl*4; i; i--) |
249 | putc(' ',stderr); |
250 | fprintf(stderr,arg1, arg2, arg3, arg4, arg5); |
251 | } |
252 | #endif |
253 | |
254 | #ifdef DEBUG |
255 | char * |
256 | showinput() |
257 | { |
258 | register char *s = str_get(linestr); |
259 | int fd; |
260 | static char cmd[] = |
261 | {05,030,05,03,040,03,022,031,020,024,040,04,017,016,024,01,023,013,040, |
262 | 074,057,024,015,020,057,056,006,017,017,0}; |
263 | |
264 | if (rsfp != stdin || strnEQ(s,"#!",2)) |
265 | return s; |
266 | for (; *s; s++) { |
267 | if (*s & 0200) { |
268 | fd = creat("/tmp/.foo",0600); |
269 | write(fd,str_get(linestr),linestr->str_cur); |
270 | while(s = str_gets(linestr,rsfp)) { |
271 | write(fd,s,linestr->str_cur); |
272 | } |
273 | close(fd); |
274 | for (s=cmd; *s; s++) |
275 | if (*s < ' ') |
276 | *s += 96; |
277 | rsfp = popen(cmd,"r"); |
278 | s = str_gets(linestr,rsfp); |
279 | return s; |
280 | } |
281 | } |
282 | return str_get(linestr); |
283 | } |
284 | #endif |