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 4f93fd1..273e6cc 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -1,20 +1,45 @@
-/* $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;
@@ -23,32 +48,38 @@ 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 = ");
@@ -64,24 +95,30 @@ 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:
            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) {
@@ -90,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 */
@@ -102,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");
     }
@@ -117,28 +169,32 @@ register ARG *arg;
     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:
@@ -149,10 +205,14 @@ register ARG *arg;
            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;
@@ -165,21 +225,51 @@ 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--;
     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");
 }
@@ -189,33 +279,42 @@ register SPAT *spat;
 {
     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
@@ -236,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;
        }
     }