--- freem/src/merr.c 2025/04/13 04:22:43 1.5 +++ freem/src/merr.c 2025/05/03 04:12:34 1.8 @@ -1,5 +1,5 @@ /* - * $Id: merr.c,v 1.5 2025/04/13 04:22:43 snw Exp $ + * $Id: merr.c,v 1.8 2025/05/03 04:12:34 snw Exp $ * stuff for handling program bogosity * * @@ -24,6 +24,15 @@ * along with FreeM. If not, see . * * $Log: merr.c,v $ + * Revision 1.8 2025/05/03 04:12:34 snw + * Fix user-defined error codes + * + * Revision 1.7 2025/05/01 03:56:29 snw + * -m + * + * Revision 1.6 2025/04/30 17:19:16 snw + * Improve backtraces in debugger + * * Revision 1.5 2025/04/13 04:22:43 snw * Fix snprintf calls * @@ -209,6 +218,12 @@ err_lut errtab[] = { inline int merr_raise(int num) { + char placebuf[256]; + char lref[256]; + + if (num != OK) { + lasterr[nstx] = ierr; + } if (merr_in_break ()) { ierr = num - CTRLB; @@ -220,20 +235,27 @@ inline int merr_raise(int num) if (num != OK) { merr_set_ecode_ierr (); - stcpy (merr_stack[nstx].MCODE, code); stcpy (merr_stack[nstx].ECODE, ecode); if (direct_mode == 1 && nstx == 0) { stcpy (merr_stack[nstx].PLACE, "@\201\0"); + stcpy (merr_stack[nstx].MCODE, " \201\0"); } - else { - if (!rtn_get_offset (merr_stack[nstx].PLACE)) { - stcpy (merr_stack[nstx].PLACE, "???\201"); + else { + getraddress (placebuf, nstx); + stcpy (merr_stack[nstx].PLACE, &(placebuf[3])); + stcpy (lref, merr_stack[nstx].PLACE); + stcnv_m2c (lref); + if (routine_get_line (lref, merr_stack[nstx].MCODE) == NULL) { + sprintf (merr_stack[nstx].MCODE, "???\201"); + } + else { + stcnv_c2m (merr_stack[nstx].MCODE); } } - + if (nstx > merr_topstk) merr_topstk = nstx; - } + } return ierr; } @@ -405,7 +427,7 @@ void merr_dump (int num, char *rtn, char snprintf (tbuf, STRLEN - 1, "^$JOB\202%d\202USER_ERRORS\202%s\201", pid, &user_ecode[1]); tbuf [stlen (tbuf) - 1] = '\201'; - global (get_sym, tbuf, dbuf); + ssvn (get_sym, tbuf, dbuf); if (merr () == OK) { stcpy (nem, dbuf);