perl 4.0 patch 14: patch #11, continued
[p5sagit/p5-mst-13.2.git] / dump.c
diff --git a/dump.c b/dump.c
index 1567017..273e6cc 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -1,8 +1,16 @@
-/* $Header: dump.c,v 2.0 88/06/05 00:08:44 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 2.0  88/06/05  00:08:44  root
- * Baseline version 2.0.
+ * 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.
  * 
  */
 
 #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;
@@ -20,28 +48,32 @@ 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\n",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);
@@ -63,18 +95,24 @@ register CMD *alt;
        } 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:
@@ -89,6 +127,21 @@ register CMD *alt;
            } 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 */
@@ -101,7 +154,7 @@ register CMD *alt;
        dump("}\n");
        if (cmd)
            if (cmd == alt)
-               dump("CONT{\n");
+               dump("CONT 0x%lx {\n",cmd);
            else
                dump("{\n");
     }
@@ -121,15 +174,27 @@ register ARG *arg;
        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);
        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) {
+       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:
@@ -146,6 +211,8 @@ register ARG *arg;
        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;
@@ -158,9 +225,6 @@ register ARG *arg;
            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--;
@@ -169,25 +233,25 @@ register ARG *arg;
 
 dump_flags(b,flags)
 char *b;
-unsigned flags;
+unsigned int flags;
 {
     *b = '\0';
-    if (flags & AF_SPECIAL)
-       strcat(b,"SPECIAL,");
+    if (flags & AF_ARYOK)
+       (void)strcat(b,"ARYOK,");
     if (flags & AF_POST)
-       strcat(b,"POST,");
+       (void)strcat(b,"POST,");
     if (flags & AF_PRE)
-       strcat(b,"PRE,");
+       (void)strcat(b,"PRE,");
     if (flags & AF_UP)
-       strcat(b,"UP,");
+       (void)strcat(b,"UP,");
     if (flags & AF_COMMON)
-       strcat(b,"COMMON,");
-    if (flags & AF_NUMERIC)
-       strcat(b,"NUMERIC,");
+       (void)strcat(b,"COMMON,");
+    if (flags & AF_DEPR)
+       (void)strcat(b,"DEPR,");
     if (flags & AF_LISTISH)
-       strcat(b,"LISTISH,");
+       (void)strcat(b,"LISTISH,");
     if (flags & AF_LOCAL)
-       strcat(b,"LOCAL,");
+       (void)strcat(b,"LOCAL,");
     if (*b)
        b[strlen(b)-1] = '\0';
 }
@@ -195,13 +259,17 @@ unsigned flags;
 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");
 }
@@ -246,7 +314,7 @@ 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
@@ -267,15 +335,15 @@ showinput()
        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;
        }
     }