Annotation of freem/src/merr.c, revision 1.1
1.1 ! snw 1: /*
! 2: * *
! 3: * * *
! 4: * * *
! 5: * ***************
! 6: * * * * *
! 7: * * MUMPS *
! 8: * * * * *
! 9: * ***************
! 10: * * *
! 11: * * *
! 12: * *
! 13: *
! 14: * merr.c
! 15: * stuff for handling program bogosity
! 16: *
! 17: *
! 18: * Author: Serena Willis <jpw@coherent-logic.com>
! 19: * Copyright (C) 1998 MUG Deutschland
! 20: * Copyright (C) 2020 Coherent Logic Development LLC
! 21: *
! 22: *
! 23: * This file is part of FreeM.
! 24: *
! 25: * FreeM is free software: you can redistribute it and/or modify
! 26: * it under the terms of the GNU Affero Public License as published by
! 27: * the Free Software Foundation, either version 3 of the License, or
! 28: * (at your option) any later version.
! 29: *
! 30: * FreeM is distributed in the hope that it will be useful,
! 31: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 32: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 33: * GNU Affero Public License for more details.
! 34: *
! 35: * You should have received a copy of the GNU Affero Public License
! 36: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
! 37: *
! 38: **/
! 39:
! 40: #include <string.h>
! 41: #include <stdlib.h>
! 42:
! 43: #include "mpsdef.h"
! 44: #include "merr.h"
! 45: #include "jobtab.h"
! 46:
! 47: merr_stackent merr_stack[NESTLEVLS + 1];
! 48: char etrap[256];
! 49: char ecode[256];
! 50: char user_ecode[256];
! 51: int estack;
! 52: int etrap_lvl = 0;
! 53: int merr_topstk = 0;
! 54:
! 55: typedef struct err_lut {
! 56: int ecode;
! 57: const char *canonical_name;
! 58: } err_lut;
! 59:
! 60: err_lut errtab[] = {
! 61: {0, "ZOK"},
! 62: {1, "ZINRPT"},
! 63: {2, "ZBKERR"},
! 64: {3, "ZNOSTAND"},
! 65: {4, "ZUNDEF"},
! 66: {5, "ZLBLUNDEF"},
! 67: {6, "ZMISSOPD"},
! 68: {7, "ZMISSOP"},
! 69: {8, "ZILLOP"},
! 70: {9, "ZQUOTER"},
! 71: {10, "ZCOMMAER"},
! 72: {11, "ZASSIGNER"},
! 73: {12, "ZARGER"},
! 74: {13, "ZSPACER"},
! 75: {14, "ZBRAER"},
! 76: {15, "ZLVLERR"},
! 77: {16, "ZDIVER"},
! 78: {17, "ZILLFUN"},
! 79: {18, "ZFUNARG"},
! 80: {19, "ZZTERR"},
! 81: {20, "ZNEXTER"},
! 82: {21, "ZSELER"},
! 83: {22, "ZCMMND"},
! 84: {23, "ZARGLIST"},
! 85: {24, "ZINVEXPR"},
! 86: {25, "ZINVREF"},
! 87: {26, "ZMXSTR"},
! 88: {27, "ZTOOPARA"},
! 89: {28, "ZNOPEN"},
! 90: {29, "ZNODEVICE"},
! 91: {30, "ZPROTECT"},
! 92: {31, "ZGLOBER"},
! 93: {32, "ZFILERR"},
! 94: {33, "ZPGMOV"},
! 95: {34, "ZSTKOV"},
! 96: {35, "ZSTORE"},
! 97: {36, "ZNOREAD"},
! 98: {37, "ZNOWRITE"},
! 99: {38, "ZNOPGM"},
! 100: {39, "ZNAKED"},
! 101: {40, "ZSBSCR"},
! 102: {41, "ZISYNTX"},
! 103: {42, "ZDBDGD"},
! 104: {43, "ZKILLER"},
! 105: {44, "ZHUPER"},
! 106: {45, "ZMXNUM"},
! 107: {46, "ZNOVAL"},
! 108: {47, "ZTYPEMISMATCH"},
! 109: {48, "ZMEMOV"},
! 110: {49, "ZNAMERES"},
! 111: {50, "ZSCKCREAT"},
! 112: {51, "ZSCKIFAM"},
! 113: {52, "ZSCKITYP"},
! 114: {53, "ZSCKIPRT"},
! 115: {54, "ZSCKCERR"},
! 116: {55, "ZSCKAERR"},
! 117: {56, "ZSCKACON"},
! 118: {57, "ZSCKNCON"},
! 119: {58, "ZSCKEOPT"},
! 120: {59, "ZSCKERCV"},
! 121: {60, "ZSCKESND"},
! 122: {61, "ZNORPI"},
! 123: {62, "ZCREDEF"},
! 124: {63, "ZCMODIFY"},
! 125: {64, "ZFILEXWR"},
! 126: {65, "ZINEWMUL"},
! 127: {66, "ZINVHORO"},
! 128: {67, "ZTYPMISMATCH"},
! 129: {68, "ZINVTYPE"},
! 130: {69, "ZINVLIBOPT"},
! 131: {80, "ZECODEINV"},
! 132: {81, "ZASSERT"},
! 133: {82, "ZUSERERR"},
! 134: {83, "ZOBJFLDACCV"},
! 135: {84, "ZOBJCONFLICT"},
! 136: {85, "ZOBJPRIVOVFL"},
! 137: {86, "ZOBJACINVALID"},
! 138: {128, "ZSYNTERR"},
! 139: {140, "M1"},
! 140: {141, "M2"},
! 141: {142, "M3"},
! 142: {143, "M4"},
! 143: {144, "M5"},
! 144: {145, "M6"},
! 145: {146, "M7"},
! 146: {147, "M8"},
! 147: {148, "M9"},
! 148: {149, "M10"},
! 149: {150, "M11"},
! 150: {151, "M12"},
! 151: {152, "M13"},
! 152: {153, "M14"},
! 153: {154, "M15"},
! 154: {155, "M16"},
! 155: {156, "M17"},
! 156: {157, "M18"},
! 157: {158, "M19"},
! 158: {159, "M20"},
! 159: {160, "M21"},
! 160: {161, "M22"},
! 161: {162, "M23"},
! 162: {163, "M24"},
! 163: {164, "M25"},
! 164: {165, "M26"},
! 165: {166, "M27"},
! 166: {167, "M28"},
! 167: {168, "M29"},
! 168: {169, "M30"},
! 169: {170, "M31"},
! 170: {171, "M32"},
! 171: {172, "M33"},
! 172: {173, "M34"},
! 173: {174, "M35"},
! 174: {175, "M36"},
! 175: {176, "M37"},
! 176: {177, "M38"},
! 177: {178, "M39"},
! 178: {179, "M40"},
! 179: {180, "M41"},
! 180: {181, "M42"},
! 181: {182, "M43"},
! 182: {183, "M44"},
! 183: {184, "M45"},
! 184: {185, "M46"},
! 185: {186, "M47"},
! 186: {187, "M48"},
! 187: {188, "M49"},
! 188: {189, "M50"},
! 189: {190, "M51"},
! 190: {191, "M52"},
! 191: {192, "M53"},
! 192: {193, "M54"},
! 193: {194, "M55"},
! 194: {195, "M56"},
! 195: {196, "M57"},
! 196: {197, "M58"},
! 197: {198, "M59"},
! 198: {199, "M60"},
! 199: {214, "M75"},
! 200: {240, "M101"},
! 201: {241, "M102"},
! 202: {242, "M103"},
! 203: {243, "M104"},
! 204: {254, "ZASYNC"},
! 205: {255, "ZCTRLB"},
! 206: {-1, NULL}
! 207: };
! 208:
! 209: inline int merr_raise(int num)
! 210: {
! 211: char place[256];
! 212: char cod[256];
! 213:
! 214: if (merr_in_break ()) {
! 215: ierr = num - CTRLB;
! 216: }
! 217: else {
! 218: ierr = num;
! 219: }
! 220:
! 221: if (num != OK) {
! 222: merr_set_ecode_ierr ();
! 223:
! 224: stcpy (merr_stack[nstx].MCODE, code);
! 225: stcpy (merr_stack[nstx].ECODE, ecode);
! 226:
! 227: if (direct_mode == 1 && nstx == 0) {
! 228: stcpy (merr_stack[nstx].PLACE, "@\201\0");
! 229: }
! 230: else {
! 231: if (!rtn_get_offset (merr_stack[nstx].PLACE)) {
! 232: stcpy (merr_stack[nstx].PLACE, "???\201");
! 233: }
! 234: }
! 235:
! 236: if (nstx > merr_topstk) merr_topstk = nstx;
! 237: }
! 238:
! 239: return ierr;
! 240: }
! 241:
! 242: inline int merr(void)
! 243: {
! 244: return ierr < OK ? ierr + CTRLB : ierr;
! 245: }
! 246:
! 247: short merr_in_break(void)
! 248: {
! 249: if (ierr < OK) {
! 250: return TRUE;
! 251: }
! 252: else {
! 253: return FALSE;
! 254: }
! 255: }
! 256:
! 257: void merr_set_break(void)
! 258: {
! 259: if (!merr_in_break ()) {
! 260: ierr = ierr - CTRLB;
! 261: }
! 262: }
! 263:
! 264: void merr_clear_break(void)
! 265: {
! 266: if (merr_in_break ()) {
! 267: ierr = ierr + CTRLB;
! 268: }
! 269: }
! 270:
! 271: int merr_num_to_code (int num, char *code)
! 272: {
! 273:
! 274: err_lut *p;
! 275:
! 276: for (p = errtab; p->canonical_name != NULL; ++p) {
! 277:
! 278: if (p->ecode == num) {
! 279: strcpy (code, p->canonical_name);
! 280: return 1;
! 281: }
! 282:
! 283: }
! 284:
! 285: return -1;
! 286:
! 287: }
! 288:
! 289: int merr_code_to_num (char *code)
! 290: {
! 291:
! 292: err_lut *p;
! 293:
! 294: for (p = errtab; p->canonical_name != NULL; ++p) {
! 295:
! 296: if (strcmp (p->canonical_name, code) == 0) {
! 297: return p->ecode;
! 298: }
! 299:
! 300: }
! 301:
! 302: return -1;
! 303:
! 304: }
! 305:
! 306: void merr_set_ecode_ierr (void)
! 307: {
! 308: char *cod;
! 309: char *t;
! 310:
! 311: cod = (char *) malloc (256 * sizeof (char));
! 312: NULLPTRCHK(cod,"merr_set_ecode_ierr");
! 313:
! 314: t = (char *) malloc (256 * sizeof (char));
! 315: NULLPTRCHK(t,"merr_set_ecode_ierr");
! 316:
! 317: if ((merr_num_to_code (merr (), cod)) == -1) goto done;
! 318:
! 319: snprintf (t, 255, ",%s,\201", cod);
! 320: merr_set_ecode (t);
! 321:
! 322: job_set_ecode (pid, cod);
! 323:
! 324: done:
! 325:
! 326: free (cod);
! 327: free (t);
! 328: return;
! 329:
! 330: }
! 331:
! 332: int merr_set_ecode (char *t_code)
! 333: {
! 334: int ec;
! 335: char *tmp;
! 336:
! 337: if (t_code[0] == '\201') {
! 338: stcpy (ecode, "\201");
! 339: return 0;
! 340: }
! 341:
! 342: if (t_code[1] != 'M' && t_code[1] != 'Z' && t_code[1] != 'U') {
! 343: return M101;
! 344: }
! 345:
! 346: stcpy (ecode, t_code);
! 347:
! 348: if (stcmp (t_code, "") == 0) {
! 349: merr_clear ();
! 350: stcpy (t_code, ",ZOK,");
! 351: stcpy (user_ecode, t_code);
! 352: }
! 353:
! 354: tmp = strtok (t_code, ",");
! 355:
! 356: /* caller may set ierr with return value */
! 357: if (ecode[1] == 'U') {
! 358: stcpy (user_ecode, ecode);
! 359: return USERERR;
! 360: }
! 361: else {
! 362: ec = merr_code_to_num (tmp);
! 363: return (ec);
! 364: }
! 365: }
! 366:
! 367: void merr_dump (int num, char *rtn, char *nsn, char *tcod, int tpos)
! 368: {
! 369: char *tbuf;
! 370: char *dbuf;
! 371: char *nem;
! 372: char *nrt;
! 373: char *real_ecode;
! 374: err_lut *p;
! 375:
! 376: tbuf = (char *) malloc (STRLEN * sizeof (char));
! 377: NULLPTRCHK(tbuf,"merr_dump");
! 378:
! 379: dbuf = (char *) malloc (STRLEN * sizeof (char));
! 380: NULLPTRCHK(dbuf,"merr_dump");
! 381:
! 382: nem = (char *) malloc (STRLEN * sizeof (char));
! 383: NULLPTRCHK(nem,"merr_dump");
! 384:
! 385: nrt = (char *) malloc (STRLEN * sizeof (char));
! 386: NULLPTRCHK(nrt,"merr_dump");
! 387:
! 388: real_ecode = (char *) malloc (STRLEN * sizeof (char));
! 389: NULLPTRCHK(real_ecode,"merr_dump");
! 390:
! 391: stcpy (nrt, rtn);
! 392: stcnv_m2c (nrt);
! 393:
! 394: stcpy (nem, errmes[num]);
! 395: stcnv_m2c (nem);
! 396:
! 397: for (p = errtab; p->canonical_name != NULL; ++p) {
! 398:
! 399: if (p->ecode == num) {
! 400:
! 401: if (strcmp (p->canonical_name, "ZUSERERR") == 0) {
! 402: stcpy (real_ecode, &user_ecode[1]);
! 403: stcnv_m2c (real_ecode);
! 404: real_ecode [strlen (real_ecode) - 1] = NUL;
! 405:
! 406: snprintf (tbuf, STRLEN - 1, "^$JOB\202%d\202USER_ERRORS\202%s\201", pid, &user_ecode[1]);
! 407: tbuf [stlen (tbuf) - 1] = '\201';
! 408:
! 409: global (get_sym, tbuf, dbuf);
! 410:
! 411: if (merr () == OK) {
! 412: stcpy (nem, dbuf);
! 413: stcnv_m2c (nem);
! 414: }
! 415: else {
! 416: merr_clear ();
! 417: }
! 418:
! 419: }
! 420: else {
! 421: strcpy (real_ecode, p->canonical_name);
! 422: }
! 423:
! 424: if (!stlen (err_suppl)) {
! 425: sprintf (tbuf, "\r\n>> Error %s: %s in %s.%s::%s [$STACK = %d]\r\n\201", real_ecode, nem, shm_env, nsn, nrt, nstx);
! 426: }
! 427: else {
! 428: stcnv_m2c (err_suppl);
! 429: sprintf (tbuf, "\r\n>> Error %s: %s (%s) in %s::%s [$STACK = %d]\r\n\201", real_ecode, nem, err_suppl, nsn, nrt, nstx);
! 430: err_suppl[0] = EOL;
! 431: }
! 432: write_m (tbuf);
! 433: write_m (">> \201");
! 434: write_m (tcod);
! 435: write_m ("\r\n\201");
! 436: write_t (tpos);
! 437: write_m ("^\201");
! 438:
! 439: goto done;
! 440: }
! 441:
! 442: }
! 443:
! 444:
! 445: done:
! 446:
! 447: free (tbuf);
! 448: free (dbuf);
! 449: free (nem);
! 450: free (nrt);
! 451: free (real_ecode);
! 452:
! 453: return;
! 454: }
! 455:
! 456:
! 457: void merr_set_iochan_err(int channel, short frm_err, char *err_text)
! 458: {
! 459: if (channel > MAXDEV || channel < 0) {
! 460: merr_raise (ARGLIST);
! 461: return;
! 462: }
! 463:
! 464: devstat[channel].mdc_err = 1;
! 465: devstat[channel].frm_err = frm_err;
! 466:
! 467: strncpy (devstat[channel].err_txt, err_text, 79);
! 468:
! 469: return;
! 470: }
! 471:
! 472: void merr_clear_iochan_err(int channel)
! 473: {
! 474: if (channel > MAXDEV || channel < 0) {
! 475: merr_raise (ARGLIST);
! 476: return;
! 477: }
! 478:
! 479: devstat[channel].mdc_err = 1;
! 480: devstat[channel].frm_err = OK;
! 481: devstat[channel].err_txt[0] = '\0';
! 482:
! 483: return;
! 484:
! 485: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>