-/* $Header: dump.c,v 1.0 87/12/18 13:05:03 root Exp $
+/* $RCSfile: dump.c,v $$Revision: 4.0.1.1 $$Date: 91/06/07 10:58:44 $
+ *
+ * Copyright (c) 1991, Larry Wall
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
*
* $Log: dump.c,v $
- * Revision 1.0 87/12/18 13:05:03 root
- * Initial revision
+ * Revision 4.0.1.1 91/06/07 10:58:44 lwall
+ * patch4: new copyright notice
+ *
+ * Revision 4.0 91/03/20 01:08:25 lwall
+ * 4.0 baseline.
*
*/
-#include "handy.h"
#include "EXTERN.h"
-#include "search.h"
-#include "util.h"
#include "perl.h"
#ifdef DEBUGGING
static int dumplvl = 0;
+dump_all()
+{
+ register int i;
+ register STAB *stab;
+ register HENT *entry;
+ STR *str = str_mortal(&str_undef);
+
+ dump_cmd(main_root,Nullcmd);
+ for (i = 0; i <= 127; i++) {
+ for (entry = defstash->tbl_array[i]; entry; entry = entry->hent_next) {
+ stab = (STAB*)entry->hent_val;
+ if (stab_sub(stab)) {
+ stab_fullname(str,stab);
+ dump("\nSUB %s = ", str->str_ptr);
+ dump_cmd(stab_sub(stab)->cmd,Nullcmd);
+ }
+ }
+ }
+}
+
dump_cmd(cmd,alt)
register CMD *cmd;
register CMD *alt;
while (cmd) {
dumplvl++;
dump("C_TYPE = %s\n",cmdname[cmd->c_type]);
+ dump("C_ADDR = 0x%lx\n",cmd);
+ dump("C_NEXT = 0x%lx\n",cmd->c_next);
+ if (cmd->c_line)
+ dump("C_LINE = %d (0x%lx)\n",cmd->c_line,cmd);
if (cmd->c_label)
dump("C_LABEL = \"%s\"\n",cmd->c_label);
dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]);
*buf = '\0';
if (cmd->c_flags & CF_FIRSTNEG)
- strcat(buf,"FIRSTNEG,");
+ (void)strcat(buf,"FIRSTNEG,");
if (cmd->c_flags & CF_NESURE)
- strcat(buf,"NESURE,");
+ (void)strcat(buf,"NESURE,");
if (cmd->c_flags & CF_EQSURE)
- strcat(buf,"EQSURE,");
+ (void)strcat(buf,"EQSURE,");
if (cmd->c_flags & CF_COND)
- strcat(buf,"COND,");
+ (void)strcat(buf,"COND,");
if (cmd->c_flags & CF_LOOP)
- strcat(buf,"LOOP,");
+ (void)strcat(buf,"LOOP,");
if (cmd->c_flags & CF_INVERT)
- strcat(buf,"INVERT,");
+ (void)strcat(buf,"INVERT,");
if (cmd->c_flags & CF_ONCE)
- strcat(buf,"ONCE,");
+ (void)strcat(buf,"ONCE,");
if (cmd->c_flags & CF_FLIP)
- strcat(buf,"FLIP,");
+ (void)strcat(buf,"FLIP,");
+ if (cmd->c_flags & CF_TERM)
+ (void)strcat(buf,"TERM,");
if (*buf)
buf[strlen(buf)-1] = '\0';
dump("C_FLAGS = (%s)\n",buf);
- if (cmd->c_first) {
- dump("C_FIRST = \"%s\"\n",str_peek(cmd->c_first));
- dump("C_FLEN = \"%d\"\n",cmd->c_flen);
+ if (cmd->c_short) {
+ dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short));
+ dump("C_SLEN = \"%d\"\n",cmd->c_slen);
}
if (cmd->c_stab) {
dump("C_STAB = ");
} else
dump("C_EXPR = NULL\n");
switch (cmd->c_type) {
+ case C_NEXT:
case C_WHILE:
case C_BLOCK:
+ case C_ELSE:
case C_IF:
if (cmd->ucmd.ccmd.cc_true) {
dump("CC_TRUE = ");
dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt);
- } else
+ }
+ else
dump("CC_TRUE = NULL\n");
if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) {
- dump("CC_ELSE = ");
- dump_cmd(cmd->ucmd.ccmd.cc_alt,Nullcmd);
- } else
+ dump("CC_ENDELSE = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
+ }
+ else if (cmd->c_type == C_NEXT && cmd->ucmd.ccmd.cc_alt) {
+ dump("CC_NEXT = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
+ }
+ else
dump("CC_ALT = NULL\n");
break;
case C_EXPR:
if (cmd->ucmd.acmd.ac_stab) {
dump("AC_STAB = ");
- dump_arg(cmd->ucmd.acmd.ac_stab);
+ dump_stab(cmd->ucmd.acmd.ac_stab);
} else
dump("AC_STAB = NULL\n");
if (cmd->ucmd.acmd.ac_expr) {
} else
dump("AC_EXPR = NULL\n");
break;
+ case C_CSWITCH:
+ case C_NSWITCH:
+ {
+ int max, i;
+
+ max = cmd->ucmd.scmd.sc_max;
+ dump("SC_MIN = (%d)\n",cmd->ucmd.scmd.sc_offset + 1);
+ dump("SC_MAX = (%d)\n", max + cmd->ucmd.scmd.sc_offset - 1);
+ dump("SC_NEXT[LT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[0]);
+ for (i = 1; i < max; i++)
+ dump("SC_NEXT[%d] = 0x%lx\n", i + cmd->ucmd.scmd.sc_offset,
+ cmd->ucmd.scmd.sc_next[i]);
+ dump("SC_NEXT[GT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[max]);
+ }
+ break;
}
cmd = cmd->c_next;
if (cmd && cmd->c_head == cmd) { /* reached end of while loop */
dump("}\n");
if (cmd)
if (cmd == alt)
- dump("CONT{\n");
+ dump("CONT 0x%lx {\n",cmd);
else
dump("{\n");
}
dumplvl++;
dump("OP_TYPE = %s\n",opname[arg->arg_type]);
dump("OP_LEN = %d\n",arg->arg_len);
+ if (arg->arg_flags) {
+ dump_flags(buf,arg->arg_flags);
+ dump("OP_FLAGS = (%s)\n",buf);
+ }
for (i = 1; i <= arg->arg_len; i++) {
- dump("[%d]ARG_TYPE = %s\n",i,argname[arg[i].arg_type]);
+ dump("[%d]ARG_TYPE = %s%s\n",i,argname[arg[i].arg_type & A_MASK],
+ arg[i].arg_type & A_DONT ? " (unevaluated)" : "");
if (arg[i].arg_len)
dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len);
- *buf = '\0';
- if (arg[i].arg_flags & AF_SPECIAL)
- strcat(buf,"SPECIAL,");
- if (arg[i].arg_flags & AF_POST)
- strcat(buf,"POST,");
- if (arg[i].arg_flags & AF_PRE)
- strcat(buf,"PRE,");
- if (arg[i].arg_flags & AF_UP)
- strcat(buf,"UP,");
- if (arg[i].arg_flags & AF_COMMON)
- strcat(buf,"COMMON,");
- if (arg[i].arg_flags & AF_NUMERIC)
- strcat(buf,"NUMERIC,");
- if (*buf)
- buf[strlen(buf)-1] = '\0';
- dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
- switch (arg[i].arg_type) {
+ if (arg[i].arg_flags) {
+ dump_flags(buf,arg[i].arg_flags);
+ dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
+ }
+ switch (arg[i].arg_type & A_MASK) {
case A_NULL:
+ if (arg->arg_type == O_TRANS) {
+ short *tbl = (short*)arg[2].arg_ptr.arg_cval;
+ int i;
+
+ for (i = 0; i < 256; i++) {
+ if (tbl[i] >= 0)
+ dump(" %d -> %d\n", i, tbl[i]);
+ else if (tbl[i] == -2)
+ dump(" %d -> DELETE\n", i);
+ }
+ }
break;
case A_LEXPR:
case A_EXPR:
dump("[%d]ARG_CMD = ",i);
dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd);
break;
+ case A_WORD:
case A_STAB:
case A_LVAL:
case A_READ:
+ case A_GLOB:
case A_ARYLEN:
+ case A_ARYSTAB:
+ case A_LARYSTAB:
dump("[%d]ARG_STAB = ",i);
dump_stab(arg[i].arg_ptr.arg_stab);
break;
dump("[%d]ARG_SPAT = ",i);
dump_spat(arg[i].arg_ptr.arg_spat);
break;
- case A_NUMBER:
- dump("[%d]ARG_NVAL = %f\n",i,arg[i].arg_ptr.arg_nval);
- break;
}
}
dumplvl--;
dump("}\n");
}
+dump_flags(b,flags)
+char *b;
+unsigned int flags;
+{
+ *b = '\0';
+ if (flags & AF_ARYOK)
+ (void)strcat(b,"ARYOK,");
+ if (flags & AF_POST)
+ (void)strcat(b,"POST,");
+ if (flags & AF_PRE)
+ (void)strcat(b,"PRE,");
+ if (flags & AF_UP)
+ (void)strcat(b,"UP,");
+ if (flags & AF_COMMON)
+ (void)strcat(b,"COMMON,");
+ if (flags & AF_DEPR)
+ (void)strcat(b,"DEPR,");
+ if (flags & AF_LISTISH)
+ (void)strcat(b,"LISTISH,");
+ if (flags & AF_LOCAL)
+ (void)strcat(b,"LOCAL,");
+ if (*b)
+ b[strlen(b)-1] = '\0';
+}
+
dump_stab(stab)
register STAB *stab;
{
+ STR *str;
+
+ if (!stab) {
+ fprintf(stderr,"{}\n");
+ return;
+ }
+ str = str_mortal(&str_undef);
dumplvl++;
fprintf(stderr,"{\n");
- dump("STAB_NAME = %s\n",stab->stab_name);
+ stab_fullname(str,stab);
+ dump("STAB_NAME = %s\n", str->str_ptr);
dumplvl--;
dump("}\n");
}
{
char ch;
+ if (!spat) {
+ fprintf(stderr,"{}\n");
+ return;
+ }
fprintf(stderr,"{\n");
dumplvl++;
if (spat->spat_runtime) {
dump("SPAT_RUNTIME = ");
dump_arg(spat->spat_runtime);
} else {
- if (spat->spat_flags & SPAT_USE_ONCE)
+ if (spat->spat_flags & SPAT_ONCE)
ch = '?';
else
ch = '/';
- dump("SPAT_PRE %c%s%c\n",ch,spat->spat_compex.precomp,ch);
+ dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch);
}
if (spat->spat_repl) {
dump("SPAT_REPL = ");
dump_arg(spat->spat_repl);
}
+ if (spat->spat_short) {
+ dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short));
+ }
dumplvl--;
dump("}\n");
}
+/* VARARGS1 */
dump(arg1,arg2,arg3,arg4,arg5)
-char *arg1, *arg2, *arg3, *arg4, *arg5;
+char *arg1;
+long arg2, arg3, arg4, arg5;
{
int i;
for (i = dumplvl*4; i; i--)
- putc(' ',stderr);
+ (void)putc(' ',stderr);
fprintf(stderr,arg1, arg2, arg3, arg4, arg5);
}
#endif
if (*s & 0200) {
fd = creat("/tmp/.foo",0600);
write(fd,str_get(linestr),linestr->str_cur);
- while(s = str_gets(linestr,rsfp)) {
+ while(s = str_gets(linestr,rsfp,0)) {
write(fd,s,linestr->str_cur);
}
- close(fd);
+ (void)close(fd);
for (s=cmd; *s; s++)
if (*s < ' ')
*s += 96;
- rsfp = popen(cmd,"r");
- s = str_gets(linestr,rsfp);
+ rsfp = mypopen(cmd,"r");
+ s = str_gets(linestr,rsfp,0);
return s;
}
}