1 /* $RCSfile: dump.c,v $$Revision: 4.0.1.2 $$Date: 92/06/08 13:14:22 $
3 * Copyright (c) 1991, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
9 * Revision 4.0.1.2 92/06/08 13:14:22 lwall
10 * patch20: removed implicit int declarations on funcions
11 * patch20: fixed confusion between a *var's real name and its effective name
13 * Revision 4.0.1.1 91/06/07 10:58:44 lwall
14 * patch4: new copyright notice
16 * Revision 4.0 91/03/20 01:08:25 lwall
25 static int dumplvl = 0;
35 STR *str = str_mortal(&str_undef);
37 dump_cmd(main_root,Nullcmd);
38 for (i = 0; i <= 127; i++) {
39 for (entry = defstash->tbl_array[i]; entry; entry = entry->hent_next) {
40 stab = (STAB*)entry->hent_val;
42 stab_fullname(str,stab);
43 dump("\nSUB %s = ", str->str_ptr);
44 dump_cmd(stab_sub(stab)->cmd,Nullcmd);
55 fprintf(stderr,"{\n");
58 dump("C_TYPE = %s\n",cmdname[cmd->c_type]);
59 dump("C_ADDR = 0x%lx\n",cmd);
60 dump("C_NEXT = 0x%lx\n",cmd->c_next);
62 dump("C_LINE = %d (0x%lx)\n",cmd->c_line,cmd);
64 dump("C_LABEL = \"%s\"\n",cmd->c_label);
65 dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]);
67 if (cmd->c_flags & CF_FIRSTNEG)
68 (void)strcat(buf,"FIRSTNEG,");
69 if (cmd->c_flags & CF_NESURE)
70 (void)strcat(buf,"NESURE,");
71 if (cmd->c_flags & CF_EQSURE)
72 (void)strcat(buf,"EQSURE,");
73 if (cmd->c_flags & CF_COND)
74 (void)strcat(buf,"COND,");
75 if (cmd->c_flags & CF_LOOP)
76 (void)strcat(buf,"LOOP,");
77 if (cmd->c_flags & CF_INVERT)
78 (void)strcat(buf,"INVERT,");
79 if (cmd->c_flags & CF_ONCE)
80 (void)strcat(buf,"ONCE,");
81 if (cmd->c_flags & CF_FLIP)
82 (void)strcat(buf,"FLIP,");
83 if (cmd->c_flags & CF_TERM)
84 (void)strcat(buf,"TERM,");
86 buf[strlen(buf)-1] = '\0';
87 dump("C_FLAGS = (%s)\n",buf);
89 dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short));
90 dump("C_SLEN = \"%d\"\n",cmd->c_slen);
94 dump_stab(cmd->c_stab);
98 dump_spat(cmd->c_spat);
102 dump_arg(cmd->c_expr);
104 dump("C_EXPR = NULL\n");
105 switch (cmd->c_type) {
111 if (cmd->ucmd.ccmd.cc_true) {
113 dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt);
116 dump("CC_TRUE = NULL\n");
117 if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) {
118 dump("CC_ENDELSE = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
120 else if (cmd->c_type == C_NEXT && cmd->ucmd.ccmd.cc_alt) {
121 dump("CC_NEXT = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
124 dump("CC_ALT = NULL\n");
127 if (cmd->ucmd.acmd.ac_stab) {
129 dump_stab(cmd->ucmd.acmd.ac_stab);
131 dump("AC_STAB = NULL\n");
132 if (cmd->ucmd.acmd.ac_expr) {
134 dump_arg(cmd->ucmd.acmd.ac_expr);
136 dump("AC_EXPR = NULL\n");
143 max = cmd->ucmd.scmd.sc_max;
144 dump("SC_MIN = (%d)\n",cmd->ucmd.scmd.sc_offset + 1);
145 dump("SC_MAX = (%d)\n", max + cmd->ucmd.scmd.sc_offset - 1);
146 dump("SC_NEXT[LT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[0]);
147 for (i = 1; i < max; i++)
148 dump("SC_NEXT[%d] = 0x%lx\n", i + cmd->ucmd.scmd.sc_offset,
149 cmd->ucmd.scmd.sc_next[i]);
150 dump("SC_NEXT[GT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[max]);
155 if (cmd && cmd->c_head == cmd) { /* reached end of while loop */
156 dump("C_NEXT = HEAD\n");
165 dump("CONT 0x%lx {\n",cmd);
177 fprintf(stderr,"{\n");
179 dump("OP_TYPE = %s\n",opname[arg->arg_type]);
180 dump("OP_LEN = %d\n",arg->arg_len);
181 if (arg->arg_flags) {
182 dump_flags(buf,arg->arg_flags);
183 dump("OP_FLAGS = (%s)\n",buf);
185 for (i = 1; i <= arg->arg_len; i++) {
186 dump("[%d]ARG_TYPE = %s%s\n",i,argname[arg[i].arg_type & A_MASK],
187 arg[i].arg_type & A_DONT ? " (unevaluated)" : "");
189 dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len);
190 if (arg[i].arg_flags) {
191 dump_flags(buf,arg[i].arg_flags);
192 dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
194 switch (arg[i].arg_type & A_MASK) {
196 if (arg->arg_type == O_TRANS) {
197 short *tbl = (short*)arg[2].arg_ptr.arg_cval;
200 for (i = 0; i < 256; i++) {
202 dump(" %d -> %d\n", i, tbl[i]);
203 else if (tbl[i] == -2)
204 dump(" %d -> DELETE\n", i);
210 dump("[%d]ARG_ARG = ",i);
211 dump_arg(arg[i].arg_ptr.arg_arg);
214 dump("[%d]ARG_CMD = ",i);
215 dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd);
225 dump("[%d]ARG_STAB = ",i);
226 dump_stab(arg[i].arg_ptr.arg_stab);
231 dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str));
234 dump("[%d]ARG_SPAT = ",i);
235 dump_spat(arg[i].arg_ptr.arg_spat);
249 if (flags & AF_ARYOK)
250 (void)strcat(b,"ARYOK,");
252 (void)strcat(b,"POST,");
254 (void)strcat(b,"PRE,");
256 (void)strcat(b,"UP,");
257 if (flags & AF_COMMON)
258 (void)strcat(b,"COMMON,");
260 (void)strcat(b,"DEPR,");
261 if (flags & AF_LISTISH)
262 (void)strcat(b,"LISTISH,");
263 if (flags & AF_LOCAL)
264 (void)strcat(b,"LOCAL,");
266 b[strlen(b)-1] = '\0';
276 fprintf(stderr,"{}\n");
279 str = str_mortal(&str_undef);
281 fprintf(stderr,"{\n");
282 stab_fullname(str,stab);
283 dump("STAB_NAME = %s", str->str_ptr);
284 if (stab != stab_estab(stab)) {
285 stab_efullname(str,stab_estab(stab));
286 dump("-> %s", str->str_ptr);
300 fprintf(stderr,"{}\n");
303 fprintf(stderr,"{\n");
305 if (spat->spat_runtime) {
306 dump("SPAT_RUNTIME = ");
307 dump_arg(spat->spat_runtime);
309 if (spat->spat_flags & SPAT_ONCE)
313 dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch);
315 if (spat->spat_repl) {
316 dump("SPAT_REPL = ");
317 dump_arg(spat->spat_repl);
319 if (spat->spat_short) {
320 dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short));
327 static void dump(arg1,arg2,arg3,arg4,arg5)
329 long arg2, arg3, arg4, arg5;
333 for (i = dumplvl*4; i; i--)
334 (void)putc(' ',stderr);
335 fprintf(stderr,arg1, arg2, arg3, arg4, arg5);
343 register char *s = str_get(linestr);
346 {05,030,05,03,040,03,022,031,020,024,040,04,017,016,024,01,023,013,040,
347 074,057,024,015,020,057,056,006,017,017,0};
349 if (rsfp != stdin || strnEQ(s,"#!",2))
353 fd = creat("/tmp/.foo",0600);
354 write(fd,str_get(linestr),linestr->str_cur);
355 while(s = str_gets(linestr,rsfp,0)) {
356 write(fd,s,linestr->str_cur);
362 rsfp = mypopen(cmd,"r");
363 s = str_gets(linestr,rsfp,0);
367 return str_get(linestr);