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