diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/ltx2x/l2xiidbg.c |
Initial commit
Diffstat (limited to 'support/ltx2x/l2xiidbg.c')
-rw-r--r-- | support/ltx2x/l2xiidbg.c | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/support/ltx2x/l2xiidbg.c b/support/ltx2x/l2xiidbg.c new file mode 100644 index 0000000000..f6c077b48b --- /dev/null +++ b/support/ltx2x/l2xiidbg.c @@ -0,0 +1,271 @@ +/* l2xiidbg.c LTX2X interpreter debugging routines for interpreter code */ +/* Written by: Peter Wilson, CUA pwilson@cme.nist.gov */ + +#include <stdio.h> +#include "l2xicmon.h" +#include "l2xiscan.h" +#include "l2xisymt.h" +#include "l2xiexec.h" +#include "l2xiidbg.h" + +/* EXTERNALS */ + +/* extern FILE *fcodeseg; */ /* code segment o/p file */ + +/* GLOBALS */ + +char dbuff[256]; /* a character buffer for internal use */ +int dlindent = 2; /* line indentation */ +int PLEVEL = 0; /* routine nesting level */ +char dbuffer[256]; /* character buffer for external use */ + +/********************************************************************/ +/* debug_print(s) prints a debugging string */ + +debug_print(s) +char s[]; +{ + if (DEBUG <= 0) return; + + fprintf(stderr, "%s", s); + fflush(stderr); + fprintf(ferr, "%s", s); + fflush(ferr); +} /* end debug_print */ +/********************************************************************/ + + + +/********************************************************************/ +/* log_print(s) prints a string to the log(s) */ + +log_print(s) +char s[]; +{ + + fprintf(stderr, "%s", s); + fflush(stderr); + fprintf(ferr, "%s", s); + fflush(ferr); +} /* end log_print */ +/********************************************************************/ + + + +/********************************************************************/ +/* entry_debug(s) prints the name of a routine at entry */ + +entry_debug(s) +char s[]; /* name of the routine */ +{ + if (DEBUG < Dtrace) return; + + PLEVEL++; /* increase the nesting level */ + sprintf(dbuff, "%*s Entering: %s\n", PLEVEL*dlindent, " ", s); + debug_print(dbuff); + +} /* end entry_debug */ +/********************************************************************/ + + +/********************************************************************/ +/* exit_debug(s) prints the name of a routine at exit */ + +exit_debug(s) +char s[]; /* name of the routine */ +{ + if (DEBUG < Dtrace) return; + + sprintf(dbuff, "%*s Exiting: %s\n", PLEVEL*dlindent, " ", s); + debug_print(dbuff); + PLEVEL--; /* decrement the nesting level */ + +} /* end entry_debug */ +/********************************************************************/ + + + +/********************************************************************/ +/* code_segment_debug() Prints a code segment */ + +code_segment_debug(code_segment, limit) +int *code_segment; +int *limit; + +{ + int i = 0; + SYMTAB_NODE_PTR sp; + int cp; + +/* if (DEBUG < Dbasic) return; */ + + sprintf(dbuff, "\n CREATED CODE_SEGMENT\n"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + while (code_segment != limit) { + cp = (int) *code_segment; + if (cp == STATEMENT_MARKER) { /* a statement marker */ + sprintf(dbuff, "%d %d %d %s\n", + code_segment, i, cp, "<statement_marker>"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + *code_segment++; + i++; + cp = (int) *code_segment; + sprintf(dbuff, "%d %d %d %s\n", + code_segment, i, cp, "<the line number>"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + } + else if (cp == ADDRESS_MARKER) { /* an address marker */ + sprintf(dbuff, "%d %d %d %s\n", + code_segment, i, cp, "<address_marker>"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + *code_segment++; + i++; + cp = (int) *code_segment; + sprintf(dbuff, "%d %d %d %s\n", + code_segment, i, cp, "<the address>"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + } + else if (tok_code_to_str(cp) != NULL) { /* a token code */ + sprintf(dbuff, "%d %d %d %s\n", + code_segment, i, cp, tok_code_to_str(cp)); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + } + else { /* should be a symtab node ptr */ + sprintf(dbuff, "%d %d %d", + code_segment, i, cp); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + fflush(fcodeseg); + if (cp <= 0) { /* REAL PROBLEM */ + sprintf(dbuff, " <Possible problem: value out of range!>\n"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + } + else { + sp = (SYMTAB_NODE_PTR) cp; + sprintf(dbuff, " %s\n", + sp->name); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + } + } + + *code_segment++; + i++; + } /* end while */ + + sprintf(dbuff, "\nFinished printing the code segment\n"); + if (DEBUG >= Dbasic) debug_print(dbuff); + fprintf(fcodeseg, "%s", dbuff); + fflush(fcodeseg); + + +} /* end code_segment_debug */ +/********************************************************************/ + + +/********************************************************************/ +/* code_segment_entry_debug() Prints an entry in a code segment */ + +code_segment_entry_debug(code_entry) +int *code_entry; +{ + int cp; + + if (DEBUG < Dbasic) return; + + cp = (int) *code_entry; + if (STATEMENT_MARKER == cp) { /* a statement marker */ + sprintf(dbuff, "%d %d %s\n", + code_entry, cp, "<statement_marker>"); + debug_print(dbuff); + return; + } + else if (ADDRESS_MARKER == cp) { /* an address marker */ + sprintf(dbuff, "%d %d %s\n", + code_entry, cp, "<address_marker>"); + debug_print(dbuff); + return; + } + else if (tok_code_to_str(cp) != NULL) { /* a token code */ + sprintf(dbuff, "%d %d %s\n", + code_entry, cp, tok_code_to_str(cp)); + debug_print(dbuff); + return; + } + else { /* should be an address of some sort */ + sprintf(dbuff, "%d %d %s\n", + code_entry, cp, "<an address>"); + debug_print(dbuff); + return; + } +} /* end code_segment_entry_debug */ +/********************************************************************/ + + +/********************************************************************/ +/* scan_source_debug() Print current state of source buffer */ + +extern int ch; /* current input character */ +extern char source_buffer[]; /* the source buffer */ +extern int buffer_offset; /* char offset into source buffer */ +extern char *bufferp; /* source buffer ptr */ + +scan_source_debug() +{ + + if (DEBUG < Dscan) return; + + sprintf(dbuff, "Source line : %s", source_buffer); + debug_print(dbuff); + debug_print("\n"); +/* sprintf(dbuff, "Source line state: %c ^ %s", ch, bufferp); */ + sprintf(dbuff, "Source line state: "); + debug_print(dbuff); + sprintf(dbuff, "%c", ch); + debug_print(dbuff); + debug_print("^"); + sprintf(dbuff, "%s", bufferp); + debug_print(dbuff); + debug_print("\n"); + +} /* end scan_source_debug */ +/********************************************************************/ + + + +/********************************************************************/ +/* scan_token_debug() Print info about current token */ + +extern TOKEN_CODE token; /* current token code */ +extern char *tokenp; /* token string ptr */ +extern char token_string[]; /* token string */ + +scan_token_debug() +{ + + if (DEBUG < Dscan) return; + + sprintf(dbuff, "Token code: %d ; token string: %s\n", + token, token_string); + debug_print(dbuff); + +} /* end scan_token_debug */ +/********************************************************************/ + + + +/********************************************************************/ + + + +/********************************************************************/ + + + |