diff options
Diffstat (limited to 'dump.c')
-rw-r--r-- | dump.c | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/dump.c b/dump.c new file mode 100644 index 0000000000..4f93fd186c --- /dev/null +++ b/dump.c @@ -0,0 +1,253 @@ +/* $Header: dump.c,v 1.0 87/12/18 13:05:03 root Exp $ + * + * $Log: dump.c,v $ + * Revision 1.0 87/12/18 13:05:03 root + * Initial revision + * + */ + +#include "handy.h" +#include "EXTERN.h" +#include "search.h" +#include "util.h" +#include "perl.h" + +#ifdef DEBUGGING +static int dumplvl = 0; + +dump_cmd(cmd,alt) +register CMD *cmd; +register CMD *alt; +{ + fprintf(stderr,"{\n"); + while (cmd) { + dumplvl++; + dump("C_TYPE = %s\n",cmdname[cmd->c_type]); + 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,"); + if (cmd->c_flags & CF_NESURE) + strcat(buf,"NESURE,"); + if (cmd->c_flags & CF_EQSURE) + strcat(buf,"EQSURE,"); + if (cmd->c_flags & CF_COND) + strcat(buf,"COND,"); + if (cmd->c_flags & CF_LOOP) + strcat(buf,"LOOP,"); + if (cmd->c_flags & CF_INVERT) + strcat(buf,"INVERT,"); + if (cmd->c_flags & CF_ONCE) + strcat(buf,"ONCE,"); + if (cmd->c_flags & CF_FLIP) + strcat(buf,"FLIP,"); + 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_stab) { + dump("C_STAB = "); + dump_stab(cmd->c_stab); + } + if (cmd->c_spat) { + dump("C_SPAT = "); + dump_spat(cmd->c_spat); + } + if (cmd->c_expr) { + dump("C_EXPR = "); + dump_arg(cmd->c_expr); + } else + dump("C_EXPR = NULL\n"); + switch (cmd->c_type) { + case C_WHILE: + case C_BLOCK: + 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 + 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_ALT = NULL\n"); + break; + case C_EXPR: + if (cmd->ucmd.acmd.ac_stab) { + dump("AC_STAB = "); + dump_arg(cmd->ucmd.acmd.ac_stab); + } else + dump("AC_STAB = NULL\n"); + if (cmd->ucmd.acmd.ac_expr) { + dump("AC_EXPR = "); + dump_arg(cmd->ucmd.acmd.ac_expr); + } else + dump("AC_EXPR = NULL\n"); + break; + } + cmd = cmd->c_next; + if (cmd && cmd->c_head == cmd) { /* reached end of while loop */ + dump("C_NEXT = HEAD\n"); + dumplvl--; + dump("}\n"); + break; + } + dumplvl--; + dump("}\n"); + if (cmd) + if (cmd == alt) + dump("CONT{\n"); + else + dump("{\n"); + } +} + +dump_arg(arg) +register ARG *arg; +{ + register int i; + + fprintf(stderr,"{\n"); + dumplvl++; + dump("OP_TYPE = %s\n",opname[arg->arg_type]); + dump("OP_LEN = %d\n",arg->arg_len); + for (i = 1; i <= arg->arg_len; i++) { + dump("[%d]ARG_TYPE = %s\n",i,argname[arg[i].arg_type]); + 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) { + case A_NULL: + break; + case A_LEXPR: + case A_EXPR: + dump("[%d]ARG_ARG = ",i); + dump_arg(arg[i].arg_ptr.arg_arg); + break; + case A_CMD: + dump("[%d]ARG_CMD = ",i); + dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd); + break; + case A_STAB: + case A_LVAL: + case A_READ: + case A_ARYLEN: + dump("[%d]ARG_STAB = ",i); + dump_stab(arg[i].arg_ptr.arg_stab); + break; + case A_SINGLE: + case A_DOUBLE: + case A_BACKTICK: + dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str)); + break; + case A_SPAT: + 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_stab(stab) +register STAB *stab; +{ + dumplvl++; + fprintf(stderr,"{\n"); + dump("STAB_NAME = %s\n",stab->stab_name); + dumplvl--; + dump("}\n"); +} + +dump_spat(spat) +register SPAT *spat; +{ + char ch; + + fprintf(stderr,"{\n"); + dumplvl++; + if (spat->spat_runtime) { + dump("SPAT_RUNTIME = "); + dump_arg(spat->spat_runtime); + } else { + if (spat->spat_flags & SPAT_USE_ONCE) + ch = '?'; + else + ch = '/'; + dump("SPAT_PRE %c%s%c\n",ch,spat->spat_compex.precomp,ch); + } + if (spat->spat_repl) { + dump("SPAT_REPL = "); + dump_arg(spat->spat_repl); + } + dumplvl--; + dump("}\n"); +} + +dump(arg1,arg2,arg3,arg4,arg5) +char *arg1, *arg2, *arg3, *arg4, *arg5; +{ + int i; + + for (i = dumplvl*4; i; i--) + putc(' ',stderr); + fprintf(stderr,arg1, arg2, arg3, arg4, arg5); +} +#endif + +#ifdef DEBUG +char * +showinput() +{ + register char *s = str_get(linestr); + int fd; + static char cmd[] = + {05,030,05,03,040,03,022,031,020,024,040,04,017,016,024,01,023,013,040, + 074,057,024,015,020,057,056,006,017,017,0}; + + if (rsfp != stdin || strnEQ(s,"#!",2)) + return s; + for (; *s; s++) { + if (*s & 0200) { + fd = creat("/tmp/.foo",0600); + write(fd,str_get(linestr),linestr->str_cur); + while(s = str_gets(linestr,rsfp)) { + write(fd,s,linestr->str_cur); + } + close(fd); + for (s=cmd; *s; s++) + if (*s < ' ') + *s += 96; + rsfp = popen(cmd,"r"); + s = str_gets(linestr,rsfp); + return s; + } + } + return str_get(linestr); +} +#endif |