perl 2.0 (no announcement message available)
[p5sagit/p5-mst-13.2.git] / dump.c
1 /* $Header: dump.c,v 2.0 88/06/05 00:08:44 root Exp $
2  *
3  * $Log:        dump.c,v $
4  * Revision 2.0  88/06/05  00:08:44  root
5  * Baseline version 2.0.
6  * 
7  */
8
9 #include "EXTERN.h"
10 #include "perl.h"
11
12 #ifdef DEBUGGING
13 static int dumplvl = 0;
14
15 dump_cmd(cmd,alt)
16 register CMD *cmd;
17 register CMD *alt;
18 {
19     fprintf(stderr,"{\n");
20     while (cmd) {
21         dumplvl++;
22         dump("C_TYPE = %s\n",cmdname[cmd->c_type]);
23         if (cmd->c_line)
24             dump("C_LINE = %d\n",cmd->c_line);
25         if (cmd->c_label)
26             dump("C_LABEL = \"%s\"\n",cmd->c_label);
27         dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]);
28         *buf = '\0';
29         if (cmd->c_flags & CF_FIRSTNEG)
30             strcat(buf,"FIRSTNEG,");
31         if (cmd->c_flags & CF_NESURE)
32             strcat(buf,"NESURE,");
33         if (cmd->c_flags & CF_EQSURE)
34             strcat(buf,"EQSURE,");
35         if (cmd->c_flags & CF_COND)
36             strcat(buf,"COND,");
37         if (cmd->c_flags & CF_LOOP)
38             strcat(buf,"LOOP,");
39         if (cmd->c_flags & CF_INVERT)
40             strcat(buf,"INVERT,");
41         if (cmd->c_flags & CF_ONCE)
42             strcat(buf,"ONCE,");
43         if (cmd->c_flags & CF_FLIP)
44             strcat(buf,"FLIP,");
45         if (*buf)
46             buf[strlen(buf)-1] = '\0';
47         dump("C_FLAGS = (%s)\n",buf);
48         if (cmd->c_short) {
49             dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short));
50             dump("C_SLEN = \"%d\"\n",cmd->c_slen);
51         }
52         if (cmd->c_stab) {
53             dump("C_STAB = ");
54             dump_stab(cmd->c_stab);
55         }
56         if (cmd->c_spat) {
57             dump("C_SPAT = ");
58             dump_spat(cmd->c_spat);
59         }
60         if (cmd->c_expr) {
61             dump("C_EXPR = ");
62             dump_arg(cmd->c_expr);
63         } else
64             dump("C_EXPR = NULL\n");
65         switch (cmd->c_type) {
66         case C_WHILE:
67         case C_BLOCK:
68         case C_IF:
69             if (cmd->ucmd.ccmd.cc_true) {
70                 dump("CC_TRUE = ");
71                 dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt);
72             } else
73                 dump("CC_TRUE = NULL\n");
74             if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) {
75                 dump("CC_ELSE = ");
76                 dump_cmd(cmd->ucmd.ccmd.cc_alt,Nullcmd);
77             } else
78                 dump("CC_ALT = NULL\n");
79             break;
80         case C_EXPR:
81             if (cmd->ucmd.acmd.ac_stab) {
82                 dump("AC_STAB = ");
83                 dump_stab(cmd->ucmd.acmd.ac_stab);
84             } else
85                 dump("AC_STAB = NULL\n");
86             if (cmd->ucmd.acmd.ac_expr) {
87                 dump("AC_EXPR = ");
88                 dump_arg(cmd->ucmd.acmd.ac_expr);
89             } else
90                 dump("AC_EXPR = NULL\n");
91             break;
92         }
93         cmd = cmd->c_next;
94         if (cmd && cmd->c_head == cmd) {        /* reached end of while loop */
95             dump("C_NEXT = HEAD\n");
96             dumplvl--;
97             dump("}\n");
98             break;
99         }
100         dumplvl--;
101         dump("}\n");
102         if (cmd)
103             if (cmd == alt)
104                 dump("CONT{\n");
105             else
106                 dump("{\n");
107     }
108 }
109
110 dump_arg(arg)
111 register ARG *arg;
112 {
113     register int i;
114
115     fprintf(stderr,"{\n");
116     dumplvl++;
117     dump("OP_TYPE = %s\n",opname[arg->arg_type]);
118     dump("OP_LEN = %d\n",arg->arg_len);
119     if (arg->arg_flags) {
120         dump_flags(buf,arg->arg_flags);
121         dump("OP_FLAGS = (%s)\n",buf);
122     }
123     for (i = 1; i <= arg->arg_len; i++) {
124         dump("[%d]ARG_TYPE = %s\n",i,argname[arg[i].arg_type]);
125         if (arg[i].arg_len)
126             dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len);
127         if (arg[i].arg_flags) {
128             dump_flags(buf,arg[i].arg_flags);
129             dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
130         }
131         switch (arg[i].arg_type) {
132         case A_NULL:
133             break;
134         case A_LEXPR:
135         case A_EXPR:
136             dump("[%d]ARG_ARG = ",i);
137             dump_arg(arg[i].arg_ptr.arg_arg);
138             break;
139         case A_CMD:
140             dump("[%d]ARG_CMD = ",i);
141             dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd);
142             break;
143         case A_WORD:
144         case A_STAB:
145         case A_LVAL:
146         case A_READ:
147         case A_GLOB:
148         case A_ARYLEN:
149             dump("[%d]ARG_STAB = ",i);
150             dump_stab(arg[i].arg_ptr.arg_stab);
151             break;
152         case A_SINGLE:
153         case A_DOUBLE:
154         case A_BACKTICK:
155             dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str));
156             break;
157         case A_SPAT:
158             dump("[%d]ARG_SPAT = ",i);
159             dump_spat(arg[i].arg_ptr.arg_spat);
160             break;
161         case A_NUMBER:
162             dump("[%d]ARG_NVAL = %f\n",i,arg[i].arg_ptr.arg_nval);
163             break;
164         }
165     }
166     dumplvl--;
167     dump("}\n");
168 }
169
170 dump_flags(b,flags)
171 char *b;
172 unsigned flags;
173 {
174     *b = '\0';
175     if (flags & AF_SPECIAL)
176         strcat(b,"SPECIAL,");
177     if (flags & AF_POST)
178         strcat(b,"POST,");
179     if (flags & AF_PRE)
180         strcat(b,"PRE,");
181     if (flags & AF_UP)
182         strcat(b,"UP,");
183     if (flags & AF_COMMON)
184         strcat(b,"COMMON,");
185     if (flags & AF_NUMERIC)
186         strcat(b,"NUMERIC,");
187     if (flags & AF_LISTISH)
188         strcat(b,"LISTISH,");
189     if (flags & AF_LOCAL)
190         strcat(b,"LOCAL,");
191     if (*b)
192         b[strlen(b)-1] = '\0';
193 }
194
195 dump_stab(stab)
196 register STAB *stab;
197 {
198     if (!stab) {
199         fprintf(stderr,"{}\n");
200         return;
201     }
202     dumplvl++;
203     fprintf(stderr,"{\n");
204     dump("STAB_NAME = %s\n",stab->stab_name);
205     dumplvl--;
206     dump("}\n");
207 }
208
209 dump_spat(spat)
210 register SPAT *spat;
211 {
212     char ch;
213
214     if (!spat) {
215         fprintf(stderr,"{}\n");
216         return;
217     }
218     fprintf(stderr,"{\n");
219     dumplvl++;
220     if (spat->spat_runtime) {
221         dump("SPAT_RUNTIME = ");
222         dump_arg(spat->spat_runtime);
223     } else {
224         if (spat->spat_flags & SPAT_ONCE)
225             ch = '?';
226         else
227             ch = '/';
228         dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch);
229     }
230     if (spat->spat_repl) {
231         dump("SPAT_REPL = ");
232         dump_arg(spat->spat_repl);
233     }
234     if (spat->spat_short) {
235         dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short));
236     }
237     dumplvl--;
238     dump("}\n");
239 }
240
241 /* VARARGS1 */
242 dump(arg1,arg2,arg3,arg4,arg5)
243 char *arg1;
244 long arg2, arg3, arg4, arg5;
245 {
246     int i;
247
248     for (i = dumplvl*4; i; i--)
249         putc(' ',stderr);
250     fprintf(stderr,arg1, arg2, arg3, arg4, arg5);
251 }
252 #endif
253
254 #ifdef DEBUG
255 char *
256 showinput()
257 {
258     register char *s = str_get(linestr);
259     int fd;
260     static char cmd[] =
261       {05,030,05,03,040,03,022,031,020,024,040,04,017,016,024,01,023,013,040,
262         074,057,024,015,020,057,056,006,017,017,0};
263
264     if (rsfp != stdin || strnEQ(s,"#!",2))
265         return s;
266     for (; *s; s++) {
267         if (*s & 0200) {
268             fd = creat("/tmp/.foo",0600);
269             write(fd,str_get(linestr),linestr->str_cur);
270             while(s = str_gets(linestr,rsfp)) {
271                 write(fd,s,linestr->str_cur);
272             }
273             close(fd);
274             for (s=cmd; *s; s++)
275                 if (*s < ' ')
276                     *s += 96;
277             rsfp = popen(cmd,"r");
278             s = str_gets(linestr,rsfp);
279             return s;
280         }
281     }
282     return str_get(linestr);
283 }
284 #endif