perl 3.0 patch #9 (combined patch)
[p5sagit/p5-mst-13.2.git] / dump.c
CommitLineData
a687059c 1/* $Header: dump.c,v 3.0 89/10/18 15:11:16 lwall Locked $
2 *
3 * Copyright (c) 1989, Larry Wall
4 *
5 * You may distribute under the terms of the GNU General Public License
6 * as specified in the README file that comes with the perl 3.0 kit.
8d063cd8 7 *
8 * $Log: dump.c,v $
a687059c 9 * Revision 3.0 89/10/18 15:11:16 lwall
10 * 3.0 baseline
8d063cd8 11 *
12 */
13
8d063cd8 14#include "EXTERN.h"
8d063cd8 15#include "perl.h"
16
17#ifdef DEBUGGING
18static int dumplvl = 0;
19
a687059c 20dump_all()
21{
22 register int i;
23 register STAB *stab;
24 register HENT *entry;
25
26 dump_cmd(main_root,Nullcmd);
27 for (i = 0; i <= 127; i++) {
28 for (entry = defstash->tbl_array[i]; entry; entry = entry->hent_next) {
29 stab = (STAB*)entry->hent_val;
30 if (stab_sub(stab)) {
31 dump("\nSUB %s = ", stab_name(stab));
32 dump_cmd(stab_sub(stab)->cmd,Nullcmd);
33 }
34 }
35 }
36}
37
8d063cd8 38dump_cmd(cmd,alt)
39register CMD *cmd;
40register CMD *alt;
41{
42 fprintf(stderr,"{\n");
43 while (cmd) {
44 dumplvl++;
45 dump("C_TYPE = %s\n",cmdname[cmd->c_type]);
a687059c 46 dump("C_ADDR = 0x%lx\n",cmd);
47 dump("C_NEXT = 0x%lx\n",cmd->c_next);
378cc40b 48 if (cmd->c_line)
a687059c 49 dump("C_LINE = %d (0x%lx)\n",cmd->c_line,cmd);
8d063cd8 50 if (cmd->c_label)
51 dump("C_LABEL = \"%s\"\n",cmd->c_label);
52 dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]);
53 *buf = '\0';
54 if (cmd->c_flags & CF_FIRSTNEG)
a687059c 55 (void)strcat(buf,"FIRSTNEG,");
8d063cd8 56 if (cmd->c_flags & CF_NESURE)
a687059c 57 (void)strcat(buf,"NESURE,");
8d063cd8 58 if (cmd->c_flags & CF_EQSURE)
a687059c 59 (void)strcat(buf,"EQSURE,");
8d063cd8 60 if (cmd->c_flags & CF_COND)
a687059c 61 (void)strcat(buf,"COND,");
8d063cd8 62 if (cmd->c_flags & CF_LOOP)
a687059c 63 (void)strcat(buf,"LOOP,");
8d063cd8 64 if (cmd->c_flags & CF_INVERT)
a687059c 65 (void)strcat(buf,"INVERT,");
8d063cd8 66 if (cmd->c_flags & CF_ONCE)
a687059c 67 (void)strcat(buf,"ONCE,");
8d063cd8 68 if (cmd->c_flags & CF_FLIP)
a687059c 69 (void)strcat(buf,"FLIP,");
70 if (cmd->c_flags & CF_TERM)
71 (void)strcat(buf,"TERM,");
8d063cd8 72 if (*buf)
73 buf[strlen(buf)-1] = '\0';
74 dump("C_FLAGS = (%s)\n",buf);
378cc40b 75 if (cmd->c_short) {
76 dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short));
77 dump("C_SLEN = \"%d\"\n",cmd->c_slen);
8d063cd8 78 }
79 if (cmd->c_stab) {
80 dump("C_STAB = ");
81 dump_stab(cmd->c_stab);
82 }
83 if (cmd->c_spat) {
84 dump("C_SPAT = ");
85 dump_spat(cmd->c_spat);
86 }
87 if (cmd->c_expr) {
88 dump("C_EXPR = ");
89 dump_arg(cmd->c_expr);
90 } else
91 dump("C_EXPR = NULL\n");
92 switch (cmd->c_type) {
a687059c 93 case C_NEXT:
8d063cd8 94 case C_WHILE:
95 case C_BLOCK:
a687059c 96 case C_ELSE:
8d063cd8 97 case C_IF:
98 if (cmd->ucmd.ccmd.cc_true) {
99 dump("CC_TRUE = ");
100 dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt);
a687059c 101 }
102 else
8d063cd8 103 dump("CC_TRUE = NULL\n");
104 if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) {
a687059c 105 dump("CC_ENDELSE = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
106 }
107 else if (cmd->c_type == C_NEXT && cmd->ucmd.ccmd.cc_alt) {
108 dump("CC_NEXT = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
109 }
110 else
8d063cd8 111 dump("CC_ALT = NULL\n");
112 break;
113 case C_EXPR:
114 if (cmd->ucmd.acmd.ac_stab) {
115 dump("AC_STAB = ");
378cc40b 116 dump_stab(cmd->ucmd.acmd.ac_stab);
8d063cd8 117 } else
118 dump("AC_STAB = NULL\n");
119 if (cmd->ucmd.acmd.ac_expr) {
120 dump("AC_EXPR = ");
121 dump_arg(cmd->ucmd.acmd.ac_expr);
122 } else
123 dump("AC_EXPR = NULL\n");
124 break;
a687059c 125 case C_CSWITCH:
126 case C_NSWITCH:
127 {
128 int max, i;
129
130 max = cmd->ucmd.scmd.sc_max;
131 dump("SC_MIN = (%d)\n",cmd->ucmd.scmd.sc_offset + 1);
132 dump("SC_MAX = (%d)\n", max + cmd->ucmd.scmd.sc_offset - 1);
133 dump("SC_NEXT[LT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[0]);
134 for (i = 1; i < max; i++)
135 dump("SC_NEXT[%d] = 0x%lx\n", i + cmd->ucmd.scmd.sc_offset,
136 cmd->ucmd.scmd.sc_next[i]);
137 dump("SC_NEXT[GT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[max]);
138 }
139 break;
8d063cd8 140 }
141 cmd = cmd->c_next;
142 if (cmd && cmd->c_head == cmd) { /* reached end of while loop */
143 dump("C_NEXT = HEAD\n");
144 dumplvl--;
145 dump("}\n");
146 break;
147 }
148 dumplvl--;
149 dump("}\n");
150 if (cmd)
151 if (cmd == alt)
a687059c 152 dump("CONT 0x%lx {\n",cmd);
8d063cd8 153 else
154 dump("{\n");
155 }
156}
157
158dump_arg(arg)
159register ARG *arg;
160{
161 register int i;
162
163 fprintf(stderr,"{\n");
164 dumplvl++;
165 dump("OP_TYPE = %s\n",opname[arg->arg_type]);
166 dump("OP_LEN = %d\n",arg->arg_len);
378cc40b 167 if (arg->arg_flags) {
168 dump_flags(buf,arg->arg_flags);
169 dump("OP_FLAGS = (%s)\n",buf);
170 }
8d063cd8 171 for (i = 1; i <= arg->arg_len; i++) {
a687059c 172 dump("[%d]ARG_TYPE = %s%s\n",i,argname[arg[i].arg_type & A_MASK],
173 arg[i].arg_type & A_DONT ? " (unevaluated)" : "");
8d063cd8 174 if (arg[i].arg_len)
175 dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len);
378cc40b 176 if (arg[i].arg_flags) {
177 dump_flags(buf,arg[i].arg_flags);
178 dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
179 }
a687059c 180 switch (arg[i].arg_type & A_MASK) {
8d063cd8 181 case A_NULL:
182 break;
183 case A_LEXPR:
184 case A_EXPR:
185 dump("[%d]ARG_ARG = ",i);
186 dump_arg(arg[i].arg_ptr.arg_arg);
187 break;
188 case A_CMD:
189 dump("[%d]ARG_CMD = ",i);
190 dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd);
191 break;
378cc40b 192 case A_WORD:
8d063cd8 193 case A_STAB:
194 case A_LVAL:
195 case A_READ:
378cc40b 196 case A_GLOB:
8d063cd8 197 case A_ARYLEN:
a687059c 198 case A_ARYSTAB:
199 case A_LARYSTAB:
8d063cd8 200 dump("[%d]ARG_STAB = ",i);
201 dump_stab(arg[i].arg_ptr.arg_stab);
202 break;
203 case A_SINGLE:
204 case A_DOUBLE:
205 case A_BACKTICK:
206 dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str));
207 break;
208 case A_SPAT:
209 dump("[%d]ARG_SPAT = ",i);
210 dump_spat(arg[i].arg_ptr.arg_spat);
211 break;
8d063cd8 212 }
213 }
214 dumplvl--;
215 dump("}\n");
216}
217
378cc40b 218dump_flags(b,flags)
219char *b;
220unsigned flags;
221{
222 *b = '\0';
a687059c 223 if (flags & AF_ARYOK)
224 (void)strcat(b,"ARYOK,");
378cc40b 225 if (flags & AF_POST)
a687059c 226 (void)strcat(b,"POST,");
378cc40b 227 if (flags & AF_PRE)
a687059c 228 (void)strcat(b,"PRE,");
378cc40b 229 if (flags & AF_UP)
a687059c 230 (void)strcat(b,"UP,");
378cc40b 231 if (flags & AF_COMMON)
a687059c 232 (void)strcat(b,"COMMON,");
233 if (flags & AF_UNUSED)
234 (void)strcat(b,"UNUSED,");
378cc40b 235 if (flags & AF_LISTISH)
a687059c 236 (void)strcat(b,"LISTISH,");
378cc40b 237 if (flags & AF_LOCAL)
a687059c 238 (void)strcat(b,"LOCAL,");
378cc40b 239 if (*b)
240 b[strlen(b)-1] = '\0';
241}
242
8d063cd8 243dump_stab(stab)
244register STAB *stab;
245{
378cc40b 246 if (!stab) {
247 fprintf(stderr,"{}\n");
248 return;
249 }
8d063cd8 250 dumplvl++;
251 fprintf(stderr,"{\n");
a687059c 252 dump("STAB_NAME = %s\n",stab_name(stab));
8d063cd8 253 dumplvl--;
254 dump("}\n");
255}
256
257dump_spat(spat)
258register SPAT *spat;
259{
260 char ch;
261
378cc40b 262 if (!spat) {
263 fprintf(stderr,"{}\n");
264 return;
265 }
8d063cd8 266 fprintf(stderr,"{\n");
267 dumplvl++;
268 if (spat->spat_runtime) {
269 dump("SPAT_RUNTIME = ");
270 dump_arg(spat->spat_runtime);
271 } else {
378cc40b 272 if (spat->spat_flags & SPAT_ONCE)
8d063cd8 273 ch = '?';
274 else
275 ch = '/';
378cc40b 276 dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch);
8d063cd8 277 }
278 if (spat->spat_repl) {
279 dump("SPAT_REPL = ");
280 dump_arg(spat->spat_repl);
281 }
378cc40b 282 if (spat->spat_short) {
283 dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short));
284 }
8d063cd8 285 dumplvl--;
286 dump("}\n");
287}
288
378cc40b 289/* VARARGS1 */
8d063cd8 290dump(arg1,arg2,arg3,arg4,arg5)
378cc40b 291char *arg1;
292long arg2, arg3, arg4, arg5;
8d063cd8 293{
294 int i;
295
296 for (i = dumplvl*4; i; i--)
a687059c 297 (void)putc(' ',stderr);
8d063cd8 298 fprintf(stderr,arg1, arg2, arg3, arg4, arg5);
299}
300#endif
301
302#ifdef DEBUG
303char *
304showinput()
305{
306 register char *s = str_get(linestr);
307 int fd;
308 static char cmd[] =
309 {05,030,05,03,040,03,022,031,020,024,040,04,017,016,024,01,023,013,040,
310 074,057,024,015,020,057,056,006,017,017,0};
311
312 if (rsfp != stdin || strnEQ(s,"#!",2))
313 return s;
314 for (; *s; s++) {
315 if (*s & 0200) {
316 fd = creat("/tmp/.foo",0600);
317 write(fd,str_get(linestr),linestr->str_cur);
a687059c 318 while(s = str_gets(linestr,rsfp,0)) {
8d063cd8 319 write(fd,s,linestr->str_cur);
320 }
a687059c 321 (void)close(fd);
8d063cd8 322 for (s=cmd; *s; s++)
323 if (*s < ' ')
324 *s += 96;
a687059c 325 rsfp = mypopen(cmd,"r");
326 s = str_gets(linestr,rsfp,0);
8d063cd8 327 return s;
328 }
329 }
330 return str_get(linestr);
331}
332#endif