--- freem/src/xecline.c 2025/04/28 14:52:54 1.16 +++ freem/src/xecline.c 2025/04/28 19:38:55 1.17 @@ -1,5 +1,5 @@ /* - * $Id: xecline.c,v 1.16 2025/04/28 14:52:54 snw Exp $ + * $Id: xecline.c,v 1.17 2025/04/28 19:38:55 snw Exp $ * freem interpreter proper * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: xecline.c,v $ + * Revision 1.17 2025/04/28 19:38:55 snw + * Add trace mode + * * Revision 1.16 2025/04/28 14:52:54 snw * Temporarily revert global handler refactor and fix reference regression in xecline * @@ -172,6 +175,8 @@ int xecline(int typ) unsigned long jobtime; char label[256], routine[256]; + char tracestr[512]; + char *vn; char *an; char *tmp; @@ -854,6 +859,8 @@ again: } } + if (trace_mode) tracestr[0] = '\0'; + switch (mcmnd) { case MAP: @@ -2367,6 +2374,10 @@ s_end: case QUIT: + if (trace_mode) { + fprintf (stderr, ">> TRACE: $STACK = %d QUIT CMD = %c\r\n", nstx, nestc[nstx]); + } + if (tp_level > 0) { merr_raise (M42); goto err; @@ -2396,6 +2407,10 @@ s_end: if (nestc[nstx] == '$') { /* extrinsic function/variable */ + if (trace_mode) { + fprintf (stderr, ">> TRACE: QUIT FROM EXTRINSIC\r\n"); + } + #ifdef DEBUG_NEWSTACK printf ("EXTRINSIC\r\n"); #endif @@ -2425,6 +2440,10 @@ s_end: else { expr (STRING); + + if (trace_mode) { + fprintf (stderr, ">> TRACE: QUIT FROM SUBROUTINE\r\n"); + } if (ierr != OK - CTRLB && merr () != OK && merr () != INRPT) { @@ -3061,6 +3080,21 @@ do_xecute: do_goto: + if (trace_mode) { + char rn[256]; + stcpy (rn, rou_name); + stcnv_m2c (rn); + + switch (mcmnd) { + case DO: + snprintf (tracestr, sizeof (tracestr) - 1, "rtn = %s $stack = %d do ", rn, nstx); + break; + case GOTO: + snprintf (tracestr, sizeof (tracestr) - 1, "rtn = %s $stack = %d goto ", rn, nstx); + break; + } + } + offset = 0; label[0] = routine[0] = EOL; dofram0 = 0; @@ -3095,6 +3129,14 @@ do_goto: stcpy (label, varnam); + if (trace_mode) { + char ttt[256]; + stcpy (ttt, label); + stcnv_m2c (ttt); + + strcat (tracestr, ttt); + } + ch = *++codptr; } @@ -3110,7 +3152,12 @@ do_goto: /* unless argument is numeric, expr returns wrong codptr */ if ((ch = *codptr) != SP && (ch != EOL) && (ch != ',') && (ch != '^')) ch = *++codptr; - + + if (trace_mode) { + char ttt[256]; + snprintf (ttt, 255, "+%d", offset); + strcat (tracestr, ttt); + } } if (ch == '^') { /* parse routine */ @@ -3120,12 +3167,26 @@ do_goto: if (merr () > OK) goto err; stcpy (routine, varnam); + + if (trace_mode) { + char ttt[256]; + char ttx[256]; + + stcpy (ttt, routine); + stcnv_m2c (ttt); + snprintf (ttx, 255, "^%s", ttt); + strcat (tracestr, ttx); + } dosave[0] = EOL; ch = *++codptr; loadsw = TRUE; } + if (trace_mode) { + fprintf (stderr, ">> TRACE: %s\r\n", tracestr); + } + if (ch == '(' && mcmnd == DO) { /* parse parameter */ if (offset) {