/* Copyright (c) 1982 Regents of the University of California */
static char sccsid
[] = "@(#)debug.c 1.3 5/18/83";
public int debug_flag
[20];
if ( (code
>= 0) and (code
< 10) ) {
case 2: if(debug_flag
[2]) debug_flag
[2]=0;
printf(" flag 2 is %d \n",debug_flag
[2]);
case 3: if(debug_flag
[3]) debug_flag
[3]=0;
printf(" flag 3 is %d \n",debug_flag
[3]);
case 4: if(debug_flag
[4]) debug_flag
[4]=0;
printf(" flag 4 is %d \n",debug_flag
[4]);
case 5: if(debug_flag
[5]) debug_flag
[5]=0;
printf(" flag 5 is %d \n",debug_flag
[5]);
default: printf(" unknown debug code %ld \n",p
->value
.lcon
);
else if (debug_flag
[3]) symbol_dump(code
);
else if (debug_flag
[4]) psym(code
);
public char *showoperator(op
)
static char *operator_str
[] = {
"O_NOP", "O_NAME", "O_SYM", "O_LCON", "O_FCON", "O_SCON", "O_RVAL", "O_INDEX",
"O_INDIR", "O_DOT", "O_COMMA", "O_ITOF", "O_ADD", "O_ADDF", "O_SUB", "O_SUBF",
"O_NEG", "O_NEGF", "O_MUL", "O_MULF", "O_DIVF", "O_DIV", "O_MOD", "O_AND",
"O_OR", "O_LT", "O_LTF", "O_LE", "O_LEF", "O_GT", "O_GTF", "O_GE", "O_GEF",
"O_EQ", "O_EQF", "O_NE", "O_NEF", "O_ALIAS", "O_ASSIGN", "O_CALL", "O_CATCH",
"O_CHFILE", "O_CONT", "O_DEBUG", "O_DELETE", "O_DUMP", "O_EDIT", "O_FUNC",
"O_GRIPE", "O_HELP", "O_IGNORE", "O_LIST", "O_PRINT", "O_PSYM", "O_RUN",
"O_SKIP", "O_SOURCE", "O_STATUS", "O_STEP", "O_STOP", "O_STOPI", "O_TRACE",
"O_TRACEI", "O_WHATIS", "O_WHERE", "O_WHEREIS", "O_WHICH", "O_EXAMINE",
"O_ADDEVENT", "O_ENDX", "O_IF", "O_ONCE", "O_PRINTCALL", "O_PRINTIFCHANGED",
"O_PRINTRTN", "O_PRINTSRCPOS", "O_PROCRTN", "O_QLINE", "O_STOPIFCHANGED",
"O_STOPX", "O_TRACEON", "O_TRACEOFF", "O_TYPERENAME", "O_LASTOP" };
return( operator_str
[ord(op
)] );
* Dump a tree recursively
if (ord(op
) > ord(O_LASTOP
)) {
panic("bad op %d in dumptree", p
->op
);
fprintf(f
, "\n level %d op %s node %ld ",recurse
,showoperator(op
), p
);
for(n_args
=0;n_args
< nargs(op
); n_args
++)
fprintf(f
," arg%d %ld ",n_args
,p
->value
.arg
[n_args
]);
if(p
->nodetype
) {fprintf(f
,"nodetype: "); psym(p
->nodetype
);}
fprintf(f
, "%s", ident(p
->value
.name
));
printname(f
, p
->value
.sym
);
dumptree(f
, p
->value
.arg
[0]);
dumptree(f
, p
->value
.arg
[1]);
if (compatible(p
->nodetype
, t_char
)) {
fprintf(f
, "'%c'", p
->value
.lcon
);
fprintf(f
, "%d", p
->value
.lcon
);
fprintf(f
, "%g", p
->value
.fcon
);
fprintf(f
, "\"%s\"", p
->value
.scon
);
dumptree(f
, p
->value
.arg
[0]);
dumptree(f
, p
->value
.arg
[1]);
dumptree(f
, p
->value
.arg
[0]);
if (p
->value
.arg
[1] != nil
) {
dumptree(f
, p
->value
.arg
[1]);
if (p
->value
.arg
[0]->op
== O_SYM
) {
printname(f
, p
->value
.arg
[0]->value
.sym
);
dumptree(f
, p
->value
.arg
[0]);
dumptree(f
, p
->value
.arg
[0]);
dumptree(f
, p
->value
.arg
[0]);
if (p
->value
.arg
[1]!= nil
) {
dumptree(f
, p
->value
.arg
[1]);
if (isvarparam(q
->nodetype
)) {
if (q
->op
== O_SYM
or q
->op
== O_LCON
or q
->op
== O_DOT
) {
dumptree(f
, q
->value
.arg
[0]);
fprintf(f
, ".%s", symname(p
->value
.arg
[1]->value
.sym
));
dumptree(f
, p
->value
.arg
[0]);
fprintf(f
, "%s", opinfo
[ord(op
)].opstring
);
dumptree(f
, p
->value
.arg
[1]);
fprintf(f
, "%s", opinfo
[ord(op
)].opstring
);
dumptree(f
, p
->value
.arg
[0]);
if(degree(op
) < ord(O_LASTOP
) )
dumptree(f
, p
->value
.arg
[i
]);
error("internal error: bad op %d in dumptree", op
);