version 1.15, 2025/04/15 16:49:36
|
version 1.17, 2025/04/28 19:38:55
|
Line 24
|
Line 24
|
* along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
* along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
* |
* |
* $Log$ |
* $Log$ |
|
* 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 |
|
* |
* Revision 1.15 2025/04/15 16:49:36 snw |
* Revision 1.15 2025/04/15 16:49:36 snw |
* Make use of logprintf throughout codebase |
* Make use of logprintf throughout codebase |
* |
* |
Line 169 int xecline(int typ)
|
Line 175 int xecline(int typ)
|
unsigned long jobtime; |
unsigned long jobtime; |
char label[256], routine[256]; |
char label[256], routine[256]; |
|
|
|
char tracestr[512]; |
|
|
char *vn; |
char *vn; |
char *an; |
char *an; |
char *tmp; |
char *tmp; |
Line 851 again:
|
Line 859 again:
|
} |
} |
} |
} |
|
|
|
if (trace_mode) tracestr[0] = '\0'; |
|
|
switch (mcmnd) { |
switch (mcmnd) { |
|
|
case MAP: |
case MAP: |
Line 973 set0:
|
Line 983 set0:
|
|
|
ch = *codptr; |
ch = *codptr; |
|
|
if (ch == '.') { |
if (ch == '.') { |
setref = TRUE; |
if (!isdigit (*(codptr + 1))) { |
codptr++; |
setref = TRUE; |
expr (NAME); |
codptr++; |
|
expr (NAME); |
|
} |
|
else { |
|
expr (STRING); |
|
} |
} |
} |
else { |
else { |
expr (STRING); |
expr (STRING); |
Line 2359 s_end:
|
Line 2374 s_end:
|
|
|
case QUIT: |
case QUIT: |
|
|
|
if (trace_mode) { |
|
fprintf (stderr, ">> TRACE: $STACK = %d QUIT CMD = %c\r\n", nstx, nestc[nstx]); |
|
} |
|
|
if (tp_level > 0) { |
if (tp_level > 0) { |
merr_raise (M42); |
merr_raise (M42); |
goto err; |
goto err; |
Line 2388 s_end:
|
Line 2407 s_end:
|
if (nestc[nstx] == '$') { /* extrinsic function/variable */ |
if (nestc[nstx] == '$') { /* extrinsic function/variable */ |
|
|
|
|
|
if (trace_mode) { |
|
fprintf (stderr, ">> TRACE: QUIT FROM EXTRINSIC\r\n"); |
|
} |
|
|
#ifdef DEBUG_NEWSTACK |
#ifdef DEBUG_NEWSTACK |
printf ("EXTRINSIC\r\n"); |
printf ("EXTRINSIC\r\n"); |
#endif |
#endif |
Line 2417 s_end:
|
Line 2440 s_end:
|
else { |
else { |
|
|
expr (STRING); |
expr (STRING); |
|
|
|
if (trace_mode) { |
|
fprintf (stderr, ">> TRACE: QUIT FROM SUBROUTINE\r\n"); |
|
} |
|
|
if (ierr != OK - CTRLB && merr () != OK && merr () != INRPT) { |
if (ierr != OK - CTRLB && merr () != OK && merr () != INRPT) { |
|
|
Line 3053 do_xecute:
|
Line 3080 do_xecute:
|
|
|
do_goto: |
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; |
offset = 0; |
label[0] = routine[0] = EOL; |
label[0] = routine[0] = EOL; |
dofram0 = 0; |
dofram0 = 0; |
Line 3087 do_goto:
|
Line 3129 do_goto:
|
|
|
stcpy (label, varnam); |
stcpy (label, varnam); |
|
|
|
if (trace_mode) { |
|
char ttt[256]; |
|
stcpy (ttt, label); |
|
stcnv_m2c (ttt); |
|
|
|
strcat (tracestr, ttt); |
|
} |
|
|
ch = *++codptr; |
ch = *++codptr; |
} |
} |
|
|
Line 3102 do_goto:
|
Line 3152 do_goto:
|
|
|
/* unless argument is numeric, expr returns wrong codptr */ |
/* unless argument is numeric, expr returns wrong codptr */ |
if ((ch = *codptr) != SP && (ch != EOL) && (ch != ',') && (ch != '^')) ch = *++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 */ |
if (ch == '^') { /* parse routine */ |
Line 3112 do_goto:
|
Line 3167 do_goto:
|
if (merr () > OK) goto err; |
if (merr () > OK) goto err; |
|
|
stcpy (routine, varnam); |
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; |
dosave[0] = EOL; |
ch = *++codptr; |
ch = *++codptr; |
loadsw = TRUE; |
loadsw = TRUE; |
} |
} |
|
|
|
if (trace_mode) { |
|
fprintf (stderr, ">> TRACE: %s\r\n", tracestr); |
|
} |
|
|
if (ch == '(' && mcmnd == DO) { /* parse parameter */ |
if (ch == '(' && mcmnd == DO) { /* parse parameter */ |
|
|
if (offset) { |
if (offset) { |