aboutsummaryrefslogtreecommitdiffstats
path: root/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'debug.c')
-rw-r--r--debug.c485
1 files changed, 485 insertions, 0 deletions
diff --git a/debug.c b/debug.c
new file mode 100644
index 00000000..59033abf
--- /dev/null
+++ b/debug.c
@@ -0,0 +1,485 @@
+/*
+ Debug.c -- Various debugging routines
+
+ Copyright (C) 1986 Free Software Foundation
+ Written by Jay Fenlason, December 1986
+
+ */
+
+/*
+GAWK is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY. No author or distributor accepts responsibility to anyone
+for the consequences of using it or for whether it serves any
+particular purpose or works at all, unless he says so in writing.
+Refer to the GAWK General Public License for full details.
+
+Everyone is granted permission to copy, modify and redistribute GAWK,
+but only under the conditions described in the GAWK General Public
+License. A copy of this license is supposed to have been given to you
+along with GAWK so you can know your rights and responsibilities. It
+should be in a file named COPYING. Among other things, the copyright
+notice and this notice must be preserved on all copies.
+
+In other words, go ahead and share GAWK, but don't try to stop
+anyone else from sharing it farther. Help stamp out software hoarding!
+*/
+#include "awk.h"
+#include <stdio.h>
+
+#ifndef FAST
+
+extern NODE **fields_arr;
+extern f_arr_siz;
+
+
+/* This is all debugging stuff. Ignore it and maybe it'll go away. */
+
+/* Some of it could be turned into a really cute trace command, if anyone
+ wants to. */
+char *nnames[] = {
+ "Illegal Node",
+ "Times", "Divide", "Mod", "Plus", "Minus",
+ "Cond-pair" /* jfw */, "Subscript", "Concat",
+ "++Pre", "--Pre", "Post++",
+ "Post--", "Uminus", "Field",
+ "Assign", "*=", "/=", "%=",
+ "+=", "-=",
+ "And", "Or",
+ "Equal", "!=", "Less", "Greater", "<=", ">=",
+ "Not",
+ "Match", "Nomatch",
+ "String", "TmpString", "Number",
+ "Rule_list", "Rule_node", "State_list", "If_branches", "Exp_list",
+ "BEGIN", "END", "IF", "WHILE", "FOR",
+ "arrayfor", "BREAK", "CONTINUE", "PRINT", "PRINTF",
+ "next", "exit", "redirect", "Append",
+ "Pipe", "variable", "Varray", "builtin",
+ "Line-range" /*jfw*/,
+};
+
+ptree(n)
+{
+ print_parse_tree((NODE *)n);
+}
+
+pt()
+{
+ int x;
+ scanf("%x",&x);
+ printf("0x%x\n",x);
+ print_parse_tree((NODE *)x);
+ fflush(stdout);
+}
+
+static depth = 0;
+print_parse_tree(ptr)
+NODE *ptr;
+{
+ register int n;
+
+ if(!ptr) {
+ printf("NULL\n");
+ return;
+ }
+ if((int)(ptr->type)<0 || (int)(ptr->type)>sizeof(nnames)/sizeof(nnames[0])) {
+ printf("(0x%x Type %d??)\n",ptr,ptr->type);
+ return;
+ }
+ printf("(%d)%*s",depth,depth,"");
+ switch((int)ptr->type) {
+ case (int)Node_string:
+ case (int)Node_temp_string:
+ printf("(0x%x String \"%.*s\")\n",ptr,ptr->stlen,ptr->stptr);
+ return;
+ case (int)Node_number:
+ printf("(0x%x Number %g)\n",ptr,ptr->numbr);
+ return;
+ case (int)Node_var_array:
+ printf("(0x%x Array of %d)\n",ptr,ptr->arrsiz);
+ for(n=0;n<ptr->arrsiz;n++) {
+ printf("'");
+ print_simple((ptr->array)[n*2],stdout);
+ printf("' is '");
+ print_simple((ptr->array)[n*2+1],stdout);
+ printf("'\n");
+ }
+ return;
+ }
+ if(ptr->lnode) printf("0x%x = left<--",ptr->lnode);
+ printf("(0x%x %s.%d)",ptr,nnames[(int)(ptr->type)],ptr->type);
+ if(ptr->rnode) printf("-->right = 0x%x",ptr->rnode);
+ printf("\n");
+ depth++;
+ if(ptr->lnode)
+ print_parse_tree(ptr->lnode);
+ switch((int)ptr->type) {
+ case (int)Node_line_range: /* jfw */
+ case (int)Node_match:
+ case (int)Node_nomatch:
+ break;
+ case (int)Node_builtin:
+ printf("Builtin: %d\n",ptr->proc); /* jfw: was \N */
+ break;
+ case (int)Node_K_for:
+ case (int)Node_K_arrayfor:
+ printf("(%s:)\n",nnames[(int)(ptr->type)]);
+ print_parse_tree(ptr->forloop->init);
+ printf("looping:\n");
+ print_parse_tree(ptr->forloop->cond);
+ printf("doing:\n");
+ print_parse_tree(ptr->forloop->incr);
+ break;
+ default:
+ if(ptr->rnode)
+ print_parse_tree(ptr->rnode);
+ break;
+ }
+ --depth;
+}
+#endif
+
+#ifndef FAST
+/*
+ * print out all the variables in the world
+ */
+
+dump_vars()
+{
+ register int n;
+ register HASHNODE *buc;
+
+ printf("Fields:");
+ dump_fields();
+ printf("Vars:\n");
+ for(n=0;n<HASHSIZE;n++) {
+ for(buc=variables[n];buc;buc=buc->next) {
+ printf("'%.*s': ",buc->length,buc->name);
+ print_simple(buc->value->var_value,stdout);
+ printf(":");
+ print_parse_tree(buc->value->lnode);
+ /* print_parse_tree(buc->value); */
+ }
+ }
+ printf("End\n");
+}
+#endif
+
+#ifndef FAST
+dump_fields()
+{
+ register NODE **p;
+ register int n;
+
+ printf("%d fields\n",f_arr_siz);
+ for(n=0,p= &fields_arr[0];n<f_arr_siz;n++,p++) {
+ printf("$%d is '",n);
+ print_simple(*p,stdout);
+ printf("'\n");
+ }
+}
+#endif
+
+#ifndef FAST
+/*VARARGS1*/
+print_debug(str,n)
+char *str;
+{
+ extern int debugging;
+
+ if(debugging)
+ printf("%s:%d\n",str,n);
+}
+
+int indent = 0;
+
+print_a_node(ptr)
+NODE *ptr;
+{
+ NODE *p1;
+ char *str,*str2;
+ int n;
+ HASHNODE *buc;
+
+ if(!ptr) return; /* don't print null ptrs */
+ switch(ptr->type) {
+ case Node_number:
+ printf("%g",ptr->numbr);
+ return;
+ case Node_string:
+ printf("\"%.*s\"",ptr->stlen,ptr->stptr);
+ return;
+ case Node_times:
+ str="*";
+ goto pr_twoop;
+ case Node_quotient:
+ str="/";
+ goto pr_twoop;
+ case Node_mod:
+ str="%";
+ goto pr_twoop;
+ case Node_plus:
+ str="+";
+ goto pr_twoop;
+ case Node_minus:
+ str="-";
+ goto pr_twoop;
+ case Node_concat:
+ str=" ";
+ goto pr_twoop;
+ case Node_assign:
+ str="=";
+ goto pr_twoop;
+ case Node_assign_times:
+ str="*=";
+ goto pr_twoop;
+ case Node_assign_quotient:
+ str="/=";
+ goto pr_twoop;
+ case Node_assign_mod:
+ str="%=";
+ goto pr_twoop;
+ case Node_assign_plus:
+ str="+=";
+ goto pr_twoop;
+ case Node_assign_minus:
+ str="-=";
+ goto pr_twoop;
+ case Node_and:
+ str="&&";
+ goto pr_twoop;
+ case Node_or:
+ str="||";
+ goto pr_twoop;
+ case Node_equal:
+ str="==";
+ goto pr_twoop;
+ case Node_notequal:
+ str="!=";
+ goto pr_twoop;
+ case Node_less:
+ str="<";
+ goto pr_twoop;
+ case Node_greater:
+ str=">";
+ goto pr_twoop;
+ case Node_leq:
+ str="<=";
+ goto pr_twoop;
+ case Node_geq:
+ str=">=";
+ goto pr_twoop;
+
+ pr_twoop:
+ print_a_node(ptr->lnode);
+ printf("%s",str);
+ print_a_node(ptr->rnode);
+ return;
+
+ case Node_not:
+ str="!";
+ str2="";
+ goto pr_oneop;
+ case Node_field_spec:
+ str="$(";
+ str2=")";
+ goto pr_oneop;
+ case Node_postincrement:
+ str="";
+ str2="++";
+ goto pr_oneop;
+ case Node_postdecrement:
+ str="";
+ str2="--";
+ goto pr_oneop;
+ case Node_preincrement:
+ str="++";
+ str2="";
+ goto pr_oneop;
+ case Node_predecrement:
+ str="--";
+ str2="";
+ goto pr_oneop;
+ pr_oneop:
+ printf(str);
+ print_a_node(ptr->subnode);
+ printf(str2);
+ return;
+
+ case Node_expression_list:
+ print_a_node(ptr->lnode);
+ if(ptr->rnode) {
+ printf(",");
+ print_a_node(ptr->rnode);
+ }
+ return;
+
+ case Node_var:
+ for(n=0;n<HASHSIZE;n++) {
+ for(buc=variables[n];buc;buc=buc->next) {
+ if(buc->value==ptr) {
+ printf("%.*s",buc->length,buc->name);
+ n=HASHSIZE;
+ break;
+ }
+ }
+ }
+ return;
+ case Node_subscript:
+ print_a_node(ptr->lnode);
+ printf("[");
+ print_a_node(ptr->rnode);
+ printf("]");
+ return;
+ case Node_builtin:
+ printf("some_builtin(");
+ print_a_node(ptr->subnode);
+ printf(")");
+ return;
+
+ case Node_statement_list:
+ printf("{\n");
+ indent++;
+ for(n=indent;n;--n)
+ printf(" ");
+ while(ptr) {
+ print_maybe_semi(ptr->lnode);
+ if(ptr->rnode)
+ for(n=indent;n;--n)
+ printf(" ");
+ ptr=ptr->rnode;
+ }
+ --indent;
+ for(n=indent;n;--n)
+ printf(" ");
+ printf("}\n");
+ for(n=indent;n;--n)
+ printf(" ");
+ return;
+
+ case Node_K_if:
+ printf("if(");
+ print_a_node(ptr->lnode);
+ printf(") ");
+ ptr=ptr->rnode;
+ if(ptr->lnode->type==Node_statement_list) {
+ printf("{\n");
+ indent++;
+ for(p1=ptr->lnode;p1;p1=p1->rnode) {
+ for(n=indent;n;--n)
+ printf(" ");
+ print_maybe_semi(p1->lnode);
+ }
+ --indent;
+ for(n=indent;n;--n)
+ printf(" ");
+ if(ptr->rnode) {
+ printf("} else ");
+ } else {
+ printf("}\n");
+ return;
+ }
+ } else {
+ print_maybe_semi(ptr->lnode);
+ if(ptr->rnode) {
+ for(n=indent;n;--n)
+ printf(" ");
+ printf("else ");
+ } else return;
+ }
+ if(!ptr->rnode) return;
+ deal_with_curls(ptr->rnode);
+ return;
+
+ case Node_K_for:
+ printf("for(");
+ print_a_node(ptr->forloop->init);
+ printf(";");
+ print_a_node(ptr->forloop->cond);
+ printf(";");
+ print_a_node(ptr->forloop->incr);
+ printf(") ");
+ deal_with_curls(ptr->forsub);
+ return;
+ case Node_K_arrayfor:
+ printf("for(");
+ print_a_node(ptr->forloop->init);
+ printf(" in ");
+ print_a_node(ptr->forloop->incr);
+ printf(") ");
+ deal_with_curls(ptr->forsub);
+ return;
+
+ case Node_K_printf:
+ printf("printf(");
+ print_a_node(ptr->lnode);
+ printf(")");
+ return;
+ case Node_K_print:
+ printf("print(");
+ print_a_node(ptr->lnode);
+ printf(")");
+ return;
+ case Node_K_next:
+ printf("next");
+ return;
+ case Node_K_break:
+ printf("break");
+ return;
+ default:
+ print_parse_tree(ptr);
+ return;
+ }
+}
+
+print_maybe_semi(ptr)
+NODE *ptr;
+{
+ print_a_node(ptr);
+ switch(ptr->type) {
+ case Node_K_if:
+ case Node_K_for:
+ case Node_K_arrayfor:
+ case Node_statement_list:
+ break;
+ default:
+ printf(";\n");
+ break;
+ }
+}
+deal_with_curls(ptr)
+NODE *ptr;
+{
+ int n;
+
+ if(ptr->type==Node_statement_list) {
+ printf("{\n");
+ indent++;
+ while(ptr) {
+ for(n=indent;n;--n)
+ printf(" ");
+ print_maybe_semi(ptr->lnode);
+ ptr=ptr->rnode;
+ }
+ --indent;
+ for(n=indent;n;--n)
+ printf(" ");
+ printf("}\n");
+ } else {
+ print_maybe_semi(ptr);
+ }
+}
+
+NODE *
+do_prvars()
+{
+ dump_vars();
+ return Nnull_string;
+}
+
+NODE *
+do_bp()
+{
+ return Nnull_string;
+}
+
+#endif