--- freem/src/merr.c 2025/01/19 02:04:04 1.1 +++ freem/src/merr.c 2025/05/03 04:12:34 1.8 @@ -1,23 +1,11 @@ /* - * * - * * * - * * * - * *************** - * * * * * - * * MUMPS * - * * * * * - * *************** - * * * - * * * - * * - * - * merr.c + * $Id: merr.c,v 1.8 2025/05/03 04:12:34 snw Exp $ * stuff for handling program bogosity * * - * Author: Serena Willis + * Author: Serena Willis * Copyright (C) 1998 MUG Deutschland - * Copyright (C) 2020 Coherent Logic Development LLC + * Copyright (C) 2020, 2025 Coherent Logic Development LLC * * * This file is part of FreeM. @@ -35,6 +23,28 @@ * You should have received a copy of the GNU Affero Public License * 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 + * + * Revision 1.4 2025/04/09 19:52:02 snw + * Eliminate as many warnings as possible while building with -Wall + * + * Revision 1.3 2025/03/09 19:50:47 snw + * Second phase of REUSE compliance and header reformat + * + * + * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC + * SPDX-License-Identifier: AGPL-3.0-or-later **/ #include @@ -208,8 +218,12 @@ err_lut errtab[] = { inline int merr_raise(int num) { - char place[256]; - char cod[256]; + char placebuf[256]; + char lref[256]; + + if (num != OK) { + lasterr[nstx] = ierr; + } if (merr_in_break ()) { ierr = num - CTRLB; @@ -221,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; } @@ -308,15 +329,15 @@ void merr_set_ecode_ierr (void) char *cod; char *t; - cod = (char *) malloc (256 * sizeof (char)); + cod = (char *) malloc (MERR_COD_LENGTH * sizeof (char)); NULLPTRCHK(cod,"merr_set_ecode_ierr"); - t = (char *) malloc (256 * sizeof (char)); + t = (char *) malloc (MERR_COD_LENGTH * sizeof (char)); NULLPTRCHK(t,"merr_set_ecode_ierr"); if ((merr_num_to_code (merr (), cod)) == -1) goto done; - snprintf (t, 255, ",%s,\201", cod); + snprintf (t, MERR_COD_LENGTH - 1, ",%s,\201", cod); merr_set_ecode (t); job_set_ecode (pid, cod); @@ -406,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); @@ -421,12 +442,14 @@ void merr_dump (int num, char *rtn, char strcpy (real_ecode, p->canonical_name); } + + if (!stlen (err_suppl)) { - sprintf (tbuf, "\r\n>> Error %s: %s in %s.%s::%s [$STACK = %d]\r\n\201", real_ecode, nem, shm_env, nsn, nrt, nstx); + snprintf (tbuf, STRLEN - 1, "\r\n>> Error %s: %s in %s.%s::%s [$STACK = %d]\r\n\201", real_ecode, nem, shm_env, nsn, nrt, nstx); } else { stcnv_m2c (err_suppl); - sprintf (tbuf, "\r\n>> Error %s: %s (%s) in %s::%s [$STACK = %d]\r\n\201", real_ecode, nem, err_suppl, nsn, nrt, nstx); + snprintf (tbuf, STRLEN - 1, "\r\n>> Error %s: %s (%s) in %s::%s [$STACK = %d]\r\n\201", real_ecode, nem, err_suppl, nsn, nrt, nstx); err_suppl[0] = EOL; } write_m (tbuf);