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