home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS - Coast to Coast
/
simteldosarchivecoasttocoast2.iso
/
awk
/
awk320sr.zip
/
AWKDEBUG.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-04-28
|
9KB
|
361 lines
/*
* Awk debug printing routines
*
* Copyright (C) 1988, 1989, 1990, 1991 by Rob Duff
* All rights reserved
*/
#include <stdio.h>
#include "awk.h"
#define DEBUG 1
#if DEBUG
char *optab[] ={
"END",
"EQ", "NE", "LT", "GT", "LE", "GE",
"MUL", "DIV", "MOD", "ADD", "SUB",
"NEG", "NOT", "NUM", "_PRE ","PRE ", "_POST", "POST",
"IS", "IN", "MAT", "CAT",
"RAND", "SYS", "LEN",
"COS", "EXP", "INT", "LOG", "SIN", "SQRT",
"ATAN2", "POW",
"DOLAR", "FIELD", "PLUCK",
"VAR", "FETCH", "AUTO", "BUILT",
"SELECT", "LOAD",
"_STORE", "STORE", "_COPY", "COPY",
"DUP", "SWAP", "UNDER", "DROP",
"CALL", "USER", "RETURN",
"JUMP", "FJMP", "TJMP", "AJMP", "OJMP", "IJMP",
"CCON", "ICON", "LCON", "DCON",
"SCON", "RCON", "FCON", "LINE"
};
char *calltab[] ={
"none", "next", "exit", "print", "printf", "getline",
"srand", "gsub", "lsub", "join", "split", "delete",
"index", "match", "substr", "sprintf", "open",
"create", "append", "close", "system"
};
char *class[] ={"ACTUAL" , "FORMAL" };
char *types[] ={"SHORT", "LONG", "DOUBLE", "NUMBER", "STRING",
"REGEXP", "ARRAY" , "STACK" , "FILES" , "FIELD ",
"SIMPLE", "BUILTIN" };
char *jumps[] = {
"NORMAL","CONTINUE","BREAK","DONE","MARK","FOR","ELSE","WHILE" };
char *print_ccl(char *ccl)
{
int i;
for (i = 1; i < 256; i++) {
if (ccl[(i>>3)&037] & (1<<(i&7))) {
if (i < ' ') {
switch (i) {
case '\b':
printf("\\b");
break;
case '\f':
printf("\\f");
break;
case '\n':
printf("\\n");
break;
case '\r':
printf("\\r");
break;
case '\t':
printf("\\t");
break;
default:
printf("\\%03o", i);
}
}
else
printf("%c", i);
}
}
return ccl+32;
}
char *print_re(char *pp)
{
register int c;
while ((c = *pp++) != R_END) {
switch (c) {
case R_BOL: fprintf(stderr, "^"); break;
case R_EOL: fprintf(stderr, "$"); break;
case R_ANY: fprintf(stderr, "."); break;
case R_CLASS:
fprintf(stderr, "[");
pp = print_ccl(pp);
fprintf(stderr, "]");
break;
case R_NCLAS:
fprintf(stderr, "[^");
pp = print_ccl(pp);
fprintf(stderr, "]");
break;
case R_BAR:
pp = print_re(pp + 5);
fprintf(stderr, "|");
pp = print_re(pp);
break;
case R_STAR:
fprintf(stderr, "(");
pp = print_re(pp + 2);
fprintf(stderr, ")*");
break;
case R_PLUS:
fprintf(stderr, "(");
pp = print_re(pp + 2);
fprintf(stderr, ")+");
break;
case R_QUEST:
fprintf(stderr, "(");
pp = print_re(pp + 2);
fprintf(stderr, ")?");
break;
case R_RANGE:
c = *pp++;
fprintf(stderr, "%c-%c", c, *pp++);
break;
case R_CHAR:
c = *pp++;
fprintf(stderr, "\\%03o", c);
break;
case '$':
case '^':
case '.':
case '/':
case '\\':
case '*':
case '+':
case '?':
case '(':
case ')':
case '[':
case ']':
fprintf(stderr, "\\");
default:
fprintf(stderr, "%c", c);
break;
}
}
return pp;
}
void print_code(char *st)
{
char *cp;
cp = st;
while (*cp != C_END)
cp = print_op(st, cp);
print_op(st, cp);
fprintf(stderr, "\n");
}
char *print_op(char *st, char *cp)
{
int op, i;
long l;
char *c;
double d;
FYLE *f;
IDENT *v;
i = (int)(cp - st);
op = *cp++;
fprintf(stderr, "%04X:%04d %04d %-8s", (int)st, i,
(int)(stacktop - stackptr), optab[op]);
switch(op) {
case C_CALL:
i = *cp++;
fprintf(stderr, "%s,%3d", calltab[i], *((char*)cp)++);
break;
case C_USER:
v = *((IDENT**)cp)++;
i = *cp++;
fprintf(stderr, "%s,%3d", v->vname, i);
break;
case C_JUMP:
case C_FJMP:
case C_TJMP:
case C_IJMP:
case C_AJMP:
case C_OJMP:
i = *((short*)cp)++;
fprintf(stderr, "%04d", i + (int)(cp - st));
break;
case C_LINE:
c = *((char**)cp)++;
i = *((short*)cp)++;
fprintf(stderr, "%d %s", i, c);
break;
case C_CCON:
i = *((char*)cp)++;
fprintf(stderr, "%d", i);
break;
case C_AUTO:
case C_ICON:
i = *((short*)cp)++;
fprintf(stderr, "%d", i);
break;
case C_LCON:
l = *((long*)cp)++;
fprintf(stderr, "%ld", l);
break;
case C_DCON:
d = *((double*)cp)++;
fprintf(stderr, "%.10g", d);
break;
case C_FCON:
f = *((FYLE**)cp)++;
fprintf(stderr, "%s", f->fname+1);
break;
case C_RCON:
c = *((char**)cp)++;
fprintf(stderr, "/");
print_re(c);
fprintf(stderr, "/");
break;
case C_SCON:
c = (*((char**)cp)++)+1;
fprintf(stderr, "\"%s\"", c);
break;
case C_FIELD:
case C_PLUCK:
i = (int)((*((ITEM**)cp)++) - fieldtab);
fprintf(stderr, "$%d", i);
break;
case C_ADDR:
case C_BUILT:
case C_FETCH:
v = lookfor((*((ITEM**)cp)++));
fprintf(stderr, "%s", v->vname);
break;
case C_PRE:
case C_POST:
case C_STORE:
case C_COPY:
case C__PRE:
case C__POST:
case C__STORE:
case C__COPY:
i = *((char*)cp)++;
if (i != 0) {
fprintf(stderr, "%s", optab[i]);
break;
}
}
fprintf(stderr, "\n");
return cp;
}
void print_one(char *sp, ITEM *ip)
{
fprintf(stderr, "%s: ", sp);
print_item(ip);
fprintf(stderr, "\n");
}
void print_two(char *sp, ITEM *ip1, ITEM *ip2)
{
fprintf(stderr, "%s: ", sp);
print_item(ip1);
print_item(ip2);
fprintf(stderr, "\n");
}
void print_element(char *sp, ELEMENT *ep)
{
fprintf(stderr, "%s ", sp);
if (ep == NULL)
fprintf(stderr, "<NULL>");
else {
printf("[%Fs] ", ep->aindex+1);
print_item((ITEM*)ep);
}
fprintf(stderr, "\n");
}
void print_item(ITEM *ip)
{
fprintf(stderr, "%s %s ", class[ip->sclass], types[ip->stype]);
print_value(ip);
}
void print_value(ITEM *ip)
{
int i;
FYLE *fp;
ELEMENT *ep;
switch (ip->stype) {
case S_SHORT:
fprintf(stderr, "%d ", ip->svalue.ival);
break;
case S_LONG:
fprintf(stderr, "%ld ", ip->svalue.lval);
break;
case S_DOUBLE:
fprintf(stderr, "%.6g", ip->svalue.dval);
fprintf(stderr, " ");
break;
case S_NUMBER:
if (ip->sstr == nullstr) {
fprintf(stderr, "<DEFAULT>");
break;
}
case S_STRING:
fprintf(stderr, "\"%Fs\" ", ip->sstr+1);
break;
case S_FILES:
fp = ip->svalue.fptr;
fprintf(stderr, "%Fs(%d)x %4X", fp->fname+1, (int)(fp-files), fp->ffyle);
break;
case S_FIELD:
i = (int)(ip->svalue.sptr - fieldtab);
fprintf(stderr, "$%d ", i);
print_item(ip->svalue.sptr);
break;
case S_SIMPLE:
case S_BUILT:
i = (int)(ip->svalue.sptr - vartab);
fprintf(stderr, "%d", i);
print_item(ip->svalue.sptr);
break;
case S_STACK:
i = (int)(ip->svalue.sptr - stacktop);
fprintf(stderr, "%d ", i);
print_item(ip->svalue.sptr);
break;
case S_ARRAY:
ep = ip->svalue.aptr;
fprintf(stderr, "\n");
while (ep != NULL) {
print_element(" ", ep);
ep = ep->anext;
}
break;
default:
fprintf(stderr, "%04X ", ip->svalue.ival);
break;
}
}
void print_label(char *str, int label)
{
printf("%s %d(%d)\n", str, labels[label].label, labels[label].where);
}
#endif