1 /* $Header: dump.c,v 3.0.1.2 90/10/15 16:22:10 lwall Locked $
3 * Copyright (c) 1989, Larry Wall
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.
9 * Revision 3.0.1.2 90/10/15 16:22:10 lwall
10 * patch29: *foo now prints as *package'foo
12 * Revision 3.0.1.1 90/03/27 15:49:58 lwall
13 * patch16: changed unsigned to unsigned int
15 * Revision 3.0 89/10/18 15:11:16 lwall
24 static int dumplvl = 0;
31 STR *str = str_static(&str_undef);
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;
38 stab_fullname(str,stab);
39 dump("\nSUB %s = ", str->str_ptr);
40 dump_cmd(stab_sub(stab)->cmd,Nullcmd);
50 fprintf(stderr,"{\n");
53 dump("C_TYPE = %s\n",cmdname[cmd->c_type]);
54 dump("C_ADDR = 0x%lx\n",cmd);
55 dump("C_NEXT = 0x%lx\n",cmd->c_next);
57 dump("C_LINE = %d (0x%lx)\n",cmd->c_line,cmd);
59 dump("C_LABEL = \"%s\"\n",cmd->c_label);
60 dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]);
62 if (cmd->c_flags & CF_FIRSTNEG)
63 (void)strcat(buf,"FIRSTNEG,");
64 if (cmd->c_flags & CF_NESURE)
65 (void)strcat(buf,"NESURE,");
66 if (cmd->c_flags & CF_EQSURE)
67 (void)strcat(buf,"EQSURE,");
68 if (cmd->c_flags & CF_COND)
69 (void)strcat(buf,"COND,");
70 if (cmd->c_flags & CF_LOOP)
71 (void)strcat(buf,"LOOP,");
72 if (cmd->c_flags & CF_INVERT)
73 (void)strcat(buf,"INVERT,");
74 if (cmd->c_flags & CF_ONCE)
75 (void)strcat(buf,"ONCE,");
76 if (cmd->c_flags & CF_FLIP)
77 (void)strcat(buf,"FLIP,");
78 if (cmd->c_flags & CF_TERM)
79 (void)strcat(buf,"TERM,");
81 buf[strlen(buf)-1] = '\0';
82 dump("C_FLAGS = (%s)\n",buf);
84 dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short));
85 dump("C_SLEN = \"%d\"\n",cmd->c_slen);
89 dump_stab(cmd->c_stab);
93 dump_spat(cmd->c_spat);
97 dump_arg(cmd->c_expr);
99 dump("C_EXPR = NULL\n");
100 switch (cmd->c_type) {
106 if (cmd->ucmd.ccmd.cc_true) {
108 dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt);
111 dump("CC_TRUE = NULL\n");
112 if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) {
113 dump("CC_ENDELSE = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
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);
119 dump("CC_ALT = NULL\n");
122 if (cmd->ucmd.acmd.ac_stab) {
124 dump_stab(cmd->ucmd.acmd.ac_stab);
126 dump("AC_STAB = NULL\n");
127 if (cmd->ucmd.acmd.ac_expr) {
129 dump_arg(cmd->ucmd.acmd.ac_expr);
131 dump("AC_EXPR = NULL\n");
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]);
150 if (cmd && cmd->c_head == cmd) { /* reached end of while loop */
151 dump("C_NEXT = HEAD\n");
160 dump("CONT 0x%lx {\n",cmd);
171 fprintf(stderr,"{\n");
173 dump("OP_TYPE = %s\n",opname[arg->arg_type]);
174 dump("OP_LEN = %d\n",arg->arg_len);
175 if (arg->arg_flags) {
176 dump_flags(buf,arg->arg_flags);
177 dump("OP_FLAGS = (%s)\n",buf);
179 for (i = 1; i <= arg->arg_len; i++) {
180 dump("[%d]ARG_TYPE = %s%s\n",i,argname[arg[i].arg_type & A_MASK],
181 arg[i].arg_type & A_DONT ? " (unevaluated)" : "");
183 dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len);
184 if (arg[i].arg_flags) {
185 dump_flags(buf,arg[i].arg_flags);
186 dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
188 switch (arg[i].arg_type & A_MASK) {
193 dump("[%d]ARG_ARG = ",i);
194 dump_arg(arg[i].arg_ptr.arg_arg);
197 dump("[%d]ARG_CMD = ",i);
198 dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd);
208 dump("[%d]ARG_STAB = ",i);
209 dump_stab(arg[i].arg_ptr.arg_stab);
214 dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str));
217 dump("[%d]ARG_SPAT = ",i);
218 dump_spat(arg[i].arg_ptr.arg_spat);
231 if (flags & AF_ARYOK)
232 (void)strcat(b,"ARYOK,");
234 (void)strcat(b,"POST,");
236 (void)strcat(b,"PRE,");
238 (void)strcat(b,"UP,");
239 if (flags & AF_COMMON)
240 (void)strcat(b,"COMMON,");
241 if (flags & AF_UNUSED)
242 (void)strcat(b,"UNUSED,");
243 if (flags & AF_LISTISH)
244 (void)strcat(b,"LISTISH,");
245 if (flags & AF_LOCAL)
246 (void)strcat(b,"LOCAL,");
248 b[strlen(b)-1] = '\0';
257 fprintf(stderr,"{}\n");
260 str = str_static(&str_undef);
262 fprintf(stderr,"{\n");
263 stab_fullname(str,stab);
264 dump("STAB_NAME = %s\n", str->str_ptr);
275 fprintf(stderr,"{}\n");
278 fprintf(stderr,"{\n");
280 if (spat->spat_runtime) {
281 dump("SPAT_RUNTIME = ");
282 dump_arg(spat->spat_runtime);
284 if (spat->spat_flags & SPAT_ONCE)
288 dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch);
290 if (spat->spat_repl) {
291 dump("SPAT_REPL = ");
292 dump_arg(spat->spat_repl);
294 if (spat->spat_short) {
295 dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short));
302 dump(arg1,arg2,arg3,arg4,arg5)
304 long arg2, arg3, arg4, arg5;
308 for (i = dumplvl*4; i; i--)
309 (void)putc(' ',stderr);
310 fprintf(stderr,arg1, arg2, arg3, arg4, arg5);
318 register char *s = str_get(linestr);
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};
324 if (rsfp != stdin || strnEQ(s,"#!",2))
328 fd = creat("/tmp/.foo",0600);
329 write(fd,str_get(linestr),linestr->str_cur);
330 while(s = str_gets(linestr,rsfp,0)) {
331 write(fd,s,linestr->str_cur);
337 rsfp = mypopen(cmd,"r");
338 s = str_gets(linestr,rsfp,0);
342 return str_get(linestr);