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