Annotation of freem/src/xecline.c, revision 1.1
1.1 ! snw 1: /*
! 2: * *
! 3: * * *
! 4: * * *
! 5: * ***************
! 6: * * * * *
! 7: * * MUMPS *
! 8: * * * * *
! 9: * ***************
! 10: * * *
! 11: * * *
! 12: * *
! 13: *
! 14: * xecline.c
! 15: * freem interpreter proper
! 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 <stdlib.h>
! 41:
! 42: #include "mpsdef.h"
! 43: #include "namespace.h"
! 44: #include "transact.h"
! 45: #include "merge.h"
! 46: #include "sighnd.h"
! 47: #include "init.h"
! 48: #include "events.h"
! 49: #include "mdebug.h"
! 50: #include "freem.h"
! 51: #include "mref.h"
! 52: #include "log.h"
! 53: #include "consttbl.h"
! 54: #include "shmmgr.h"
! 55: #include "locktab.h"
! 56: #include "jobtab.h"
! 57: #include "config.h"
! 58: #include "datatypes.h"
! 59: #include "objects.h"
! 60: #include "mcommand.h"
! 61:
! 62: #if defined(__linux__)
! 63: # include <sched.h>
! 64: #endif
! 65:
! 66: #if !defined(MSDOS)
! 67: # include "io_socket.h"
! 68: #endif
! 69:
! 70: #include "merr.h"
! 71:
! 72: #include <errno.h>
! 73: #include <unistd.h>
! 74: #include <string.h>
! 75:
! 76: #if !defined(MSDOS)
! 77: # include <syslog.h>
! 78: #endif
! 79:
! 80: #include <stdio.h>
! 81: #include <ctype.h>
! 82:
! 83: #include <time.h>
! 84: #include <sys/types.h>
! 85: #include <pwd.h>
! 86: #if !defined(__OpenBSD__) && !defined(__FreeBSD__)
! 87: # include <sys/timeb.h>
! 88: #endif
! 89: #include <sys/wait.h>
! 90: #include <sys/time.h>
! 91: #include <time.h>
! 92:
! 93: #ifdef HAVE_LIBREADLINE
! 94: # if defined(HAVE_READLINE_READLINE_H)
! 95: # include <readline/readline.h>
! 96: # elif defined(HAVE_READLINE_H)
! 97: # include <readline.h>
! 98: # else /* !defined(HAVE_READLINE_H) */
! 99: extern char *readline ();
! 100: # endif /* !defined(HAVE_READLINE_H) */
! 101: /*char *cmdline = NULL;*/
! 102: #else /* !defined(HAVE_READLINE_READLINE_H) */
! 103: /* no readline */
! 104: #endif /* HAVE_LIBREADLINE */
! 105:
! 106: #ifdef HAVE_READLINE_HISTORY
! 107: # if defined(HAVE_READLINE_HISTORY_H)
! 108: # include <readline/history.h>
! 109: # elif defined(HAVE_HISTORY_H)
! 110: # include <history.h>
! 111: # else /* !defined(HAVE_HISTORY_H) */
! 112: extern void add_history ();
! 113: extern int write_history ();
! 114: extern int read_history ();
! 115: # endif /* defined(HAVE_READLINE_HISTORY_H) */
! 116: /* no history */
! 117: #endif /* HAVE_READLINE_HISTORY */
! 118:
! 119: #include "mwapi_window.h"
! 120: #include "mwapi_event.h"
! 121:
! 122:
! 123: void on_frame_entry(void);
! 124: void rbuf_dump(void);
! 125: short rbuf_slot_from_name(char *);
! 126: short is_standard(void);
! 127:
! 128: /*
! 129: * xecline():
! 130: * typ (where to go on function entry): 1 = restart
! 131: * 2 = error
! 132: *
! 133: */
! 134: int xecline(int typ)
! 135: {
! 136: MACTION ra;
! 137: short new_and_set = FALSE;
! 138: short new_object = FALSE;
! 139: short destructor_run = FALSE;
! 140: short debug_mode = FALSE;
! 141: short libcall = FALSE;
! 142: char *namold;
! 143: long rouoldc;
! 144: unsigned long jobtime;
! 145: char label[256], routine[256];
! 146:
! 147: char *vn;
! 148: char *an;
! 149: char *tmp;
! 150: char *tmp2;
! 151: char *tmp3;
! 152:
! 153:
! 154: char *deferrable_codptr;
! 155: char deferrable_code[512];
! 156:
! 157: char *ev_handlers;
! 158:
! 159: char *reeval_codptr;
! 160: char reeval_code[512];
! 161:
! 162: int i;
! 163: int j;
! 164: register int ch;
! 165:
! 166: int then_ctr = 0;
! 167:
! 168: #if defined(HAVE_MWAPI_MOTIF)
! 169: int syn_event_entry_nstx = 0;
! 170: int in_syn_event_loop = FALSE;
! 171: #endif
! 172:
! 173: # ifdef DEBUG_NEWSTACK
! 174: int loop;
! 175: # endif
! 176:
! 177: vn = (char *) malloc ((STRLEN + 1) * sizeof (char));
! 178: an = (char *) malloc ((STRLEN + 1) * sizeof (char));
! 179: tmp = (char *) malloc ((STRLEN + 1) * sizeof (char));
! 180: tmp2 = (char *) malloc ((STRLEN + 1) * sizeof (char));
! 181: tmp3 = (char *) malloc ((STRLEN + 1) * sizeof (char));
! 182:
! 183: NULLPTRCHK(vn,"xecline");
! 184: NULLPTRCHK(an,"xecline");
! 185: NULLPTRCHK(tmp,"xecline");
! 186: NULLPTRCHK(tmp2,"xecline");
! 187: NULLPTRCHK(tmp3,"xecline");
! 188:
! 189: deferrable_codptr = deferrable_code;
! 190:
! 191: switch (typ) {
! 192:
! 193: case 0:
! 194: goto next_line;
! 195:
! 196: case 1:
! 197: goto restart;
! 198:
! 199: case 2:
! 200: goto err;
! 201:
! 202: case 3:
! 203: libcall = TRUE;
! 204: goto restart;
! 205:
! 206: }
! 207:
! 208: next_line: /* entry point for next command line */
! 209:
! 210:
! 211: job_set_status (pid, JSTAT_INTERPRETER);
! 212:
! 213: if (then_ctr > 0) {
! 214: test = nestlt[nstx];
! 215: level--;
! 216: then_ctr--;
! 217: }
! 218:
! 219: while ((roucur < rouend) && (ch = (*roucur++)) != TAB && ch != SP); /* skip label */
! 220:
! 221: if (roucur >= rouend) goto quit0; /* end of routine implies QUIT */
! 222:
! 223: while ((ch = *roucur) == TAB || ch == SP) roucur++;
! 224:
! 225: i = 0;
! 226: if (ch == '.') { /* get level count */
! 227:
! 228: do {
! 229: i++;
! 230: while ((ch = (*++roucur)) == SP || ch == TAB);
! 231: }
! 232: while (ch == '.');
! 233:
! 234: }
! 235:
! 236: if (i != level) {
! 237:
! 238: if (mcmnd == GOTO) {
! 239: merr_raise (M45);
! 240: goto err;
! 241: }
! 242:
! 243: if (i < level) {
! 244: goto quit0;
! 245: }
! 246: else {
! 247: roucur += stlen (roucur) + 2;
! 248: goto next_line;
! 249: }
! 250: }
! 251:
! 252: i = stcpy (code, roucur) + 1;
! 253: code[i] = EOL;
! 254: roucur += i + 1;
! 255: codptr = code;
! 256:
! 257: next_cmnd: /* continue line entry point */
! 258: if (sigint_in_for) goto for_quit;
! 259:
! 260: if (forsw && (forpost[forx][0] != '\0')) {
! 261:
! 262: stcpy (reeval_code, code);
! 263: reeval_codptr = codptr;
! 264:
! 265: strcpy (code, forpost[forx]);
! 266: stcnv_c2m (code);
! 267: codptr = code;
! 268:
! 269: expr (STRING);
! 270:
! 271: if (merr () > OK) {
! 272: stcpy (code, reeval_code);
! 273: codptr = reeval_codptr;
! 274:
! 275: goto err;
! 276: }
! 277:
! 278: if (tvexpr (argptr) == FALSE) {
! 279: stcpy (code, reeval_code);
! 280: codptr = reeval_codptr;
! 281:
! 282: goto for_quit;
! 283: }
! 284:
! 285: stcpy (code, reeval_code);
! 286: codptr = reeval_codptr;
! 287:
! 288: }
! 289:
! 290: job_set_status (pid, JSTAT_INTERPRETER);
! 291:
! 292: if (evt_async_enabled == TRUE) {
! 293:
! 294: switch (pending_signal_type) {
! 295:
! 296: case SIGWINCH:
! 297: evt_enqueue ("SIGWINCH", EVT_CLS_INTERRUPT, 1);
! 298: break;
! 299:
! 300: case SIGINT:
! 301: evt_enqueue ("SIGINT", EVT_CLS_INTERRUPT, 0);
! 302: break;
! 303:
! 304: case SIGFPE:
! 305: evt_enqueue ("SIGFPE", EVT_CLS_INTERRUPT, 0);
! 306: break;
! 307:
! 308: case SIGQUIT:
! 309: evt_enqueue ("SIGQUIT", EVT_CLS_INTERRUPT, 0);
! 310: break;
! 311:
! 312: }
! 313:
! 314: pending_signal_type = -1;
! 315:
! 316: /* process async events */
! 317: ev_handlers = (char *) malloc (STRLEN * sizeof (char));
! 318: NULLPTRCHK(ev_handlers,"xecline");
! 319:
! 320:
! 321: /* get a comma-delimited list of applicable handlers (e.g. ^HNDL1,^HNDL2,^HNDL3) */
! 322: ev_handlers[0] = NUL;
! 323: evt_depth = evt_get_handlers (ev_handlers);
! 324:
! 325: stcnv_c2m (ev_handlers);
! 326: stcpy (tmp3, ev_handlers);
! 327: free (ev_handlers);
! 328:
! 329: /* only execute event handlers if we have at least one such handler registered in ^$JOB($JOB,"EVENTS") */
! 330: if (evt_depth) {
! 331:
! 332: /* per X11-1998/28, async events are to be disabled during the execution of event handlers */
! 333:
! 334: /* TODO: this should be done by incrementing the event block counter
! 335: for all event types, or whatever the event extension says to do.
! 336:
! 337: In any event (rimshot here for the obvious pun), turning off all
! 338: event handlers this way is decidedly non-standard. Or non-what-might-
! 339: become the standard. Whatever. */
! 340:
! 341: evt_async_enabled = FALSE;
! 342: evt_async_initial = TRUE;
! 343: evt_async_restore = TRUE;
! 344:
! 345: goto evthandler;
! 346:
! 347: }
! 348:
! 349: }
! 350:
! 351:
! 352: if (merr () > OK) goto err;
! 353:
! 354: next0:
! 355:
! 356: do {
! 357: if ((ch = *codptr) == EOL) {
! 358: if (forsw) goto for_end;
! 359:
! 360: goto next_line;
! 361: }
! 362:
! 363: codptr++;
! 364: }
! 365: while (ch == SP);
! 366:
! 367: /* decode command word */
! 368:
! 369: if (ch < 'A') { /* Handle non-alpha first chars */
! 370:
! 371: if (ch == ';') { /* COMMENT */
! 372:
! 373: ch = *(codptr++);
! 374:
! 375: if(ch == '%') { /* DIRECTIVE */
! 376:
! 377: int dir_pos = 0;
! 378: int dir_wc = 0;
! 379: char dir_words[20][255];
! 380:
! 381: while((ch = *(codptr++)) != EOL) {
! 382:
! 383: switch (ch) {
! 384:
! 385:
! 386: case SP:
! 387:
! 388: dir_words[dir_wc][dir_pos] = NUL;
! 389:
! 390: dir_wc++;
! 391: dir_pos = 0;
! 392:
! 393: break;
! 394:
! 395:
! 396: default:
! 397:
! 398: dir_words[dir_wc][dir_pos++] = ch;
! 399:
! 400: }
! 401:
! 402: }
! 403:
! 404: dir_words[dir_wc][dir_pos] = NUL;
! 405:
! 406: if (strcmp (dir_words[0], "DIALECT") == 0) {
! 407: short rb_slot;
! 408:
! 409: rb_slot = rbuf_slot_from_name (rou_name);
! 410:
! 411: if ((strcmp (dir_words[1], "STANDARD") == 0) ||
! 412: (strcmp (dir_words[1], "MDS") == 0)) {
! 413: rbuf_flags[rb_slot].standard = TRUE;
! 414: rbuf_flags[rb_slot].dialect = D_MDS;
! 415: }
! 416: else if (strcmp (dir_words[1], "M77") == 0) {
! 417: rbuf_flags[rb_slot].standard = TRUE;
! 418: rbuf_flags[rb_slot].dialect = D_M77;
! 419: }
! 420: else if (strcmp (dir_words[1], "M84") == 0) {
! 421: rbuf_flags[rb_slot].standard = TRUE;
! 422: rbuf_flags[rb_slot].dialect = D_M84;
! 423: }
! 424: else if (strcmp (dir_words[1], "M90") == 0) {
! 425: rbuf_flags[rb_slot].standard = TRUE;
! 426: rbuf_flags[rb_slot].dialect = D_M90;
! 427: }
! 428: else if (strcmp (dir_words[1], "M95") == 0) {
! 429: rbuf_flags[rb_slot].standard = TRUE;
! 430: rbuf_flags[rb_slot].dialect = D_M95;
! 431: }
! 432: else if (strcmp (dir_words[1], "M5") == 0) {
! 433: rbuf_flags[rb_slot].standard = TRUE;
! 434: rbuf_flags[rb_slot].dialect = D_M5;
! 435: }
! 436: else if ((strcmp (dir_words[1], "FREEM") == 0) ||
! 437: (strcmp (dir_words[1], "EXTENDED") == 0)) {
! 438: rbuf_flags[rb_slot].standard = FALSE;
! 439: rbuf_flags[rb_slot].dialect = D_FREEM;
! 440: }
! 441: else {
! 442: merr_raise (CMMND);
! 443: goto err;
! 444: }
! 445: goto skip_line;
! 446: }
! 447: else {
! 448: goto skip_line;
! 449: }
! 450:
! 451: }
! 452:
! 453: goto skip_line;
! 454: }
! 455:
! 456: if ((!is_standard ()) && (ch == '#')) {
! 457: goto skip_line;
! 458: }
! 459:
! 460: if ((is_standard ()) && (ch == '#')) {
! 461: merr_raise (NOSTAND);
! 462: goto err;
! 463: }
! 464:
! 465: if (ch == '@') {
! 466: if (!is_standard ()) {
! 467: goto do_xecute;
! 468: }
! 469: else {
! 470: merr_raise (NOSTAND);
! 471: goto err;
! 472: }
! 473: }
! 474:
! 475: if (ch == '!') { /* UNIXCALL */
! 476:
! 477: if (restricted_mode) {
! 478: merr_raise (NOSTAND);
! 479: goto err;
! 480: }
! 481:
! 482: /* don't catch child dies signal */
! 483: sig_attach (SIGUSR1, SIG_IGN);
! 484:
! 485: tmp2[stcpy (tmp2, codptr)] = NUL;
! 486:
! 487: if (demomode) fputc (d1char, stdout);
! 488:
! 489: if (tmp2[0] == '!') {
! 490:
! 491: uid_t suid;
! 492: struct passwd *spw;
! 493:
! 494: suid = geteuid ();
! 495: spw = getpwuid (suid);
! 496:
! 497: set_io (UNIX);
! 498:
! 499: fprintf (stderr, "Type Ctrl-D to exit from the shell\n");
! 500:
! 501: if (strlen (spw->pw_shell)) {
! 502: zsystem = system (spw->pw_shell);
! 503: }
! 504: else {
! 505: zsystem = system ("/bin/sh");
! 506: }
! 507:
! 508: set_io (MUMPS);
! 509: sig_attach (SIGUSR1, &oncld); /* restore handler */
! 510:
! 511: }
! 512: else if (tmp2[0] == '<') { /* call write output to %-array */
! 513:
! 514: FILE *pipdes;
! 515: char key[STRLEN + 1 /*was 256 */ ];
! 516: char data[STRLEN + 1 /*was 256 */ ];
! 517: char data_kill[256];
! 518: data_kill[255] = EOL;
! 519:
! 520: for (i = 0; i < STRLEN + 1; i++) vn[i] = EOL;
! 521:
! 522: snprintf (key, 255, "^$JOB\202%d\202PIPE_GLVN\201", pid);
! 523: ssvn (get_sym, key, vn);
! 524:
! 525: if (vn[0] == '^') {
! 526:
! 527: if (vn[1] == '$') {
! 528: merr_raise (INVREF);
! 529: goto err;
! 530: }
! 531: else {
! 532: global (kill_sym, vn, data_kill);
! 533: }
! 534:
! 535: }
! 536: else {
! 537: symtab (kill_sym, vn, data);
! 538: }
! 539:
! 540: snprintf (key, 255, "^$JOB\202%d\202PIPE_GLVN\201", pid);
! 541: ssvn (get_sym, key, vn);
! 542:
! 543: data[0] = '0';
! 544: data[1] = EOL;
! 545:
! 546: if (vn[0] == '^') {
! 547:
! 548: if (vn[1] == '$') {
! 549: merr_raise (INVREF);
! 550: goto err;
! 551: }
! 552: else {
! 553: global (set_sym, vn, data);
! 554: }
! 555:
! 556: }
! 557: else {
! 558: symtab (set_sym, vn, data);
! 559: }
! 560:
! 561: set_io (UNIX);
! 562: if ((pipdes = popen (&tmp2[1], "r")) == NULL) {
! 563: zsystem = 1;
! 564: }
! 565: else {
! 566: int glvn_len = 0;
! 567:
! 568: while (fgets (data, STRLEN, pipdes)) {
! 569: snprintf (key, 255, "^$JOB\202%d\202PIPE_GLVN\201", pid);
! 570: ssvn (get_sym, key, vn);
! 571:
! 572: glvn_len = stlen (vn);
! 573: stcpy (key, vn);
! 574:
! 575: key[glvn_len] = DELIM;
! 576:
! 577: if (vn[0] == '^') {
! 578:
! 579: if (vn[1] == '$') {
! 580: merr_raise (INVREF);
! 581: goto err;
! 582: }
! 583: else {
! 584: global (getinc, vn, &key[glvn_len + 1]);
! 585: }
! 586:
! 587: }
! 588: else {
! 589: symtab (getinc, vn, &key[glvn_len + 1]);
! 590: }
! 591:
! 592: i = strlen (data);
! 593:
! 594: data[i] = EOL;
! 595:
! 596: if (i > 1 && data[i - 1] == LF) data[i - 1] = EOL;
! 597:
! 598: if (vn[0] == '^') {
! 599:
! 600: if (vn[1] == '$') {
! 601: merr_raise (INVREF);
! 602: goto err;
! 603: }
! 604: else {
! 605: global (set_sym, key, data);
! 606: }
! 607:
! 608: }
! 609: else {
! 610: symtab (set_sym, key, data);
! 611: }
! 612:
! 613: if (merr () == STORE) break;
! 614: }
! 615:
! 616: pclose (pipdes);
! 617:
! 618: zsystem = 0;
! 619: }
! 620: set_io (MUMPS);
! 621: }
! 622: else if (tmp2[0] == '>') { /* call read input from %-array */
! 623: FILE *pipdes;
! 624: char key[STRLEN + 1 /*was 256 */ ];
! 625: char data[STRLEN + 1 /*was 256 */ ];
! 626: int i, k, l;
! 627:
! 628: for (i = 0; i < STRLEN + 1; i++) vn[i] = EOL;
! 629:
! 630: snprintf (key, 255, "^$JOB\202%d\202PIPE_GLVN\201", pid);
! 631: ssvn (get_sym, key, vn);
! 632:
! 633: if (vn[0] == '^') {
! 634:
! 635: if (vn[1] == '$') {
! 636: merr_raise (INVREF);
! 637: goto err;
! 638: }
! 639: else {
! 640: global (get_sym, vn, data);
! 641: }
! 642:
! 643: }
! 644: else {
! 645: symtab (get_sym, vn, data);
! 646: }
! 647:
! 648: merr_clear ();
! 649: k = intexpr (data);
! 650:
! 651: set_io (UNIX);
! 652: if (k < 1 || (pipdes = popen (&tmp2[1], "w")) == NULL) {
! 653: zsystem = 1;
! 654: }
! 655: else {
! 656: int glvn_len = 0;
! 657:
! 658: for (i = 1; i <= k; i++) {
! 659: snprintf (key, 255, "^$JOB\202%d\202PIPE_GLVN\201", pid);
! 660: ssvn (get_sym, key, vn);
! 661:
! 662: glvn_len = stlen (vn);
! 663: stcpy (key, vn);
! 664:
! 665: key[glvn_len] = DELIM;
! 666:
! 667: intstr (&key[glvn_len + 1], i);
! 668:
! 669: if (vn[0] == '^') {
! 670:
! 671: if (vn[1] == '$') {
! 672: merr_raise (INVREF);
! 673: goto err;
! 674: }
! 675: else {
! 676: global (get_sym, key, data);
! 677: }
! 678:
! 679: }
! 680: else {
! 681: symtab (get_sym, key, data);
! 682: }
! 683:
! 684: l = stlen (data);
! 685:
! 686: data[l++] = LF;
! 687: data[l] = NUL;
! 688:
! 689: fputs (data, pipdes);
! 690: }
! 691:
! 692: pclose (pipdes);
! 693:
! 694: zsystem = 0;
! 695: merr_clear ();
! 696: }
! 697: set_io (MUMPS);
! 698:
! 699: }
! 700: else {
! 701: set_io (UNIX);
! 702: zsystem = system (tmp2);
! 703: set_io (MUMPS);
! 704: }
! 705:
! 706: if (demomode) fputc (d1char, stdout);
! 707:
! 708: sig_attach (SIGUSR1, &oncld); /* restore handler */
! 709:
! 710:
! 711: if (merr () == STORE) {
! 712: zsystem = 1;
! 713: goto err;
! 714: }
! 715:
! 716: goto skip_line;
! 717: }
! 718:
! 719: merr_raise (CMMND);
! 720: goto err;
! 721: } /* END handling of non-alpha first chars */
! 722:
! 723:
! 724: mcmnd = ch | 0140; /* uppercase to lower case */
! 725:
! 726: i = 1;
! 727:
! 728: while ((ch = (*codptr)) != SP && ch != ':' && ch != EOL) {
! 729: tmp3[++i] = ch | 0140;
! 730: codptr++;
! 731: }
! 732:
! 733: j = i;
! 734:
! 735: if (j > 1) {
! 736: merr_raise (mcmd_tokenize (&ra, tmp3, deferrable_codptr, deferrable_code, &j));
! 737: MRESCHECK(ra);
! 738: }
! 739:
! 740:
! 741: if (*codptr == ':') {
! 742: /* handle postconditional */
! 743:
! 744: if (mcmnd == FOR) {
! 745: char *savcp = codptr;
! 746:
! 747: codptr++;
! 748: i = 0;
! 749: while ((forpost[forx + 1][i++] = *(codptr++)) != SP);
! 750:
! 751: forpost[forx + 1][i - 1] = '\0';
! 752:
! 753: codptr = savcp;
! 754: }
! 755:
! 756:
! 757: /* postcond after FOR,IF,ELSE not allowed in dialects other than D_FREEM */
! 758:
! 759:
! 760: if ((rtn_dialect () != D_FREEM) && (mcmnd == FOR || mcmnd == IF || mcmnd == ELSE)) {
! 761: merr_raise (NOSTAND);
! 762: goto err;
! 763: }
! 764:
! 765: codptr++;
! 766:
! 767: expr (STRING);
! 768:
! 769: if (merr () > OK) goto err;
! 770:
! 771: ch = *codptr;
! 772:
! 773: if (ch != SP && ch != EOL) {
! 774: merr_raise (SPACER);
! 775: goto err;
! 776: }
! 777:
! 778: if (tvexpr (argptr) == FALSE) { /* skip arguments */
! 779:
! 780: if ((mcmnd == IF) || (mcmnd == THEN) || (mcmnd == ELSE) || (mcmnd == FOR)) {
! 781: mcmnd = 0;
! 782: goto skip_line;
! 783: }
! 784:
! 785: mcmnd = 0; /* avoid false LEVEL error */
! 786:
! 787: for (;;) {
! 788: if (ch == EOL) goto skip_line;
! 789: if ((ch = *++codptr) == SP) goto next_cmnd;
! 790: if (ch != '"') continue;
! 791:
! 792: while (*codptr++ != EOL) {
! 793: if (*codptr != ch) continue;
! 794: if (*++codptr != ch) break;
! 795: }
! 796:
! 797: if (--codptr == code) goto err;
! 798: }
! 799: }
! 800:
! 801: }
! 802:
! 803: if (*codptr != EOL) { /* beware argumentless cmnds at end of line */
! 804: codptr++; /* entry for next argument in list */
! 805:
! 806: again:
! 807: while (*codptr == '@') { /* handle indirection */
! 808:
! 809: stcpy (tmp, codptr++); /* save code to restore on nameind */
! 810: expr (ARGIND);
! 811:
! 812: if (merr () > OK) goto err;
! 813:
! 814: if (((ch = (*codptr)) != SP && ch != EOL && ch != ',' && ch != ':' && ch != '=') || (ch == '@' && *(codptr + 1) == '(')) {
! 815: stcpy (code, tmp); /* restore code on nameind */
! 816: codptr = code;
! 817:
! 818: break;
! 819: }
! 820: else {
! 821: stcpy (argptr + stlen (argptr), codptr);
! 822: stcpy (code, argptr);
! 823:
! 824: codptr = code;
! 825: }
! 826: }
! 827: }
! 828:
! 829: switch (mcmnd) {
! 830:
! 831: case MAP:
! 832: merr_raise (cmd_map (&ra));
! 833: MRESCHECK(ra);
! 834: break;
! 835:
! 836: case UNMAP:
! 837: merr_raise (cmd_unmap (&ra));
! 838: MRESCHECK(ra);
! 839: break;
! 840:
! 841: case THEN:
! 842: merr_raise (cmd_then (&ra, &then_ctr));
! 843: MRESCHECK(ra);
! 844: break;
! 845:
! 846: case THROW:
! 847: merr_raise (cmd_throw (&ra));
! 848: MRESCHECK(ra);
! 849: break;
! 850:
! 851: case CONST:
! 852: merr_raise (cmd_const (&ra));
! 853: MRESCHECK(ra);
! 854: break;
! 855:
! 856: case KVALUE:
! 857: merr_raise (cmd_kvalue (&ra));
! 858: MRESCHECK(ra);
! 859: break;
! 860:
! 861: case KSUBSC:
! 862: merr_raise (cmd_ksubscripts (&ra));
! 863: MRESCHECK(ra);
! 864: break;
! 865:
! 866: case TSTART:
! 867: merr_raise (cmd_tstart (&ra));
! 868: MRESCHECK(ra);
! 869: break;
! 870:
! 871: case TCOMMIT:
! 872: merr_raise (cmd_tcommit (&ra));
! 873: MRESCHECK(ra);
! 874: break;
! 875:
! 876: case TROLLBACK:
! 877: merr_raise (cmd_trollback (&ra));
! 878: MRESCHECK(ra);
! 879: break;
! 880:
! 881: case SET:
! 882:
! 883: set0:
! 884: if ((ch = (*codptr)) >= 'A') { /* no set$piece nor multiset */
! 885: short setref = FALSE;
! 886: short stclass = SC_UNCHANGED;
! 887:
! 888: expr (NAME);
! 889: if (merr () > OK) break;
! 890: stcpy (vn, varnam);
! 891:
! 892: if (isalpha (vn[0]) && *(codptr + 1) == ':') {
! 893: char sc_string[255];
! 894: register int sci;
! 895:
! 896: codptr += 2;
! 897: expr (NAME);
! 898:
! 899: stcpy (sc_string, varnam);
! 900: for (i = 0; i < stlen (sc_string); i++) {
! 901: sc_string[i] = toupper (sc_string[i]);
! 902: }
! 903:
! 904: stcnv_m2c (sc_string);
! 905: if (strcmp (sc_string, "PRIVATE") == 0) {
! 906: stclass = SC_PRIVATE;
! 907: }
! 908: else if (strcmp (sc_string, "PUBLIC") == 0) {
! 909: stclass = SC_PUBLIC;
! 910: }
! 911: else {
! 912: merr_raise (OBJACINVALID);
! 913: break;
! 914: }
! 915: }
! 916:
! 917: if ((*++codptr != '=') || (*(codptr + 1) == '=')) {
! 918: ch = *codptr;
! 919:
! 920: /* double char symbol ** (power) is encoded by ' ' */
! 921: if (ch == '*' && *(codptr + 1) == ch) {
! 922: codptr++;
! 923: ch = ' ';
! 924: }
! 925:
! 926: /* negated boolean operator */
! 927: else if ((ch == '\'') && (*(codptr + 2) == '=')) ch = SETBIT (*++codptr);
! 928:
! 929: if (*++codptr != '=') {
! 930:
! 931: /* SET A++ or SET A-- equivalent to SET A+=1 SET A-=1 currently disabled */
! 932: //#ifdef NEVER
! 933: if ((ch == '+' || ch == '-') && ch == *codptr) {
! 934: codptr++;
! 935: setop = ch;
! 936: argptr[0] = '1';
! 937: argptr[1] = EOL;
! 938:
! 939: goto set2;
! 940: }
! 941: //#endif /* NEVER */
! 942:
! 943: merr_raise (ASSIGNER);
! 944: break;
! 945: }
! 946:
! 947: setop = ch;
! 948: }
! 949:
! 950: codptr++;
! 951:
! 952: ch = *codptr;
! 953:
! 954: if (ch == '.') {
! 955: setref = TRUE;
! 956: codptr++;
! 957: expr (NAME);
! 958: }
! 959: else {
! 960: expr (STRING);
! 961: }
! 962:
! 963:
! 964: if (merr () > OK) break;
! 965:
! 966:
! 967: set2:
! 968:
! 969: if (vn[0] == '^') {
! 970:
! 971: stcpy (an, argptr);
! 972:
! 973: if (setref == TRUE) {
! 974: merr_raise (INVREF);
! 975: goto err;
! 976: }
! 977:
! 978: if (vn[1] == '$') {
! 979: ssvn (set_sym, vn, an);
! 980: }
! 981: else {
! 982: global (set_sym, vn, an);
! 983: }
! 984:
! 985: }
! 986: else {
! 987: stcpy (an, argptr);
! 988:
! 989: if (setref == TRUE) {
! 990: symtab (new_sym, vn, "");
! 991: symtab (m_alias, vn, varnam);
! 992: codptr++;
! 993: }
! 994: else {
! 995: if (new_object == FALSE) {
! 996: symtab (set_sym, vn, an);
! 997: switch (stclass) {
! 998:
! 999: case SC_PUBLIC:
! 1000: obj_set_field_public (vn);
! 1001: break;
! 1002:
! 1003: case SC_PRIVATE:
! 1004: obj_set_field_private (vn);
! 1005: break;
! 1006:
! 1007: }
! 1008: }
! 1009: }
! 1010: }
! 1011:
! 1012: if (merr () > OK) {
! 1013: stcpy (varerr, vn);
! 1014: break;
! 1015: }
! 1016:
! 1017: if (((new_and_set == TRUE) || (new_object == TRUE)) && (*codptr != SP) && (*codptr != EOL)) {
! 1018: new_and_set = FALSE;
! 1019: new_object = FALSE;
! 1020:
! 1021: merr_raise (INEWMUL);
! 1022: goto err;
! 1023: }
! 1024:
! 1025: if (new_and_set == TRUE) new_and_set = FALSE;
! 1026: if (new_object == TRUE) new_object = FALSE;
! 1027: set1:
! 1028: if (*codptr != ',') break;
! 1029:
! 1030: if (*++codptr == '@') goto again;
! 1031:
! 1032: goto set0;
! 1033: }
! 1034:
! 1035: /****** special SET syntax: multiple SET, set$piece, special variables */
! 1036: {
! 1037: char multiset, vnset[256]; /* multiset variables */
! 1038: long arg3, arg4; /* 3rd,4th arg in set$piece */
! 1039:
! 1040: if ((multiset = (ch == '('))) {
! 1041: vnset[0] = EOL;
! 1042: codptr++;
! 1043: }
! 1044:
! 1045: set:
! 1046: if (*codptr == '$' && (*(codptr + 1) | 0140) == 'p') { /* set$piece */
! 1047:
! 1048: if (multiset) {
! 1049: merr_raise (INVREF);
! 1050: goto err;
! 1051: }
! 1052:
! 1053: setpiece = 'p';
! 1054:
! 1055: while (*++codptr != '(') {
! 1056:
! 1057: if (*codptr == EOL) {
! 1058: merr_raise (INVREF);
! 1059: goto err;
! 1060: }
! 1061:
! 1062: }
! 1063:
! 1064: codptr++;
! 1065:
! 1066: expr (NAME);
! 1067:
! 1068: if (merr () > OK) goto err;
! 1069:
! 1070: stcpy (vn, varnam);
! 1071:
! 1072: codptr++;
! 1073:
! 1074: if (*codptr++ != ',') {
! 1075: merr_raise (COMMAER);
! 1076: goto err;
! 1077: }
! 1078:
! 1079: expr (STRING);
! 1080:
! 1081: if (merr () > OK) goto err;
! 1082:
! 1083: stcpy (tmp2, argptr);
! 1084:
! 1085: if (*codptr != ')') {
! 1086:
! 1087: codptr++;
! 1088:
! 1089: expr (STRING);
! 1090:
! 1091: if (merr () > OK) goto err;
! 1092:
! 1093: arg3 = intexpr (argptr);
! 1094:
! 1095: if (merr () == MXNUM) {
! 1096: arg3 = 256;
! 1097: merr_clear ();
! 1098: }
! 1099:
! 1100: }
! 1101: else {
! 1102: arg3 = 1;
! 1103: }
! 1104:
! 1105: if (*codptr != ')') {
! 1106:
! 1107: codptr++;
! 1108:
! 1109: expr (STRING);
! 1110:
! 1111: if (merr () > OK) goto err;
! 1112:
! 1113: if (*codptr != ')') {
! 1114: merr_raise (BRAER);
! 1115: goto err;
! 1116: }
! 1117:
! 1118: arg4 = intexpr (argptr);
! 1119:
! 1120: if (merr () == MXNUM) {
! 1121: arg4 = 256;
! 1122: merr_clear ();
! 1123: }
! 1124:
! 1125: }
! 1126: else {
! 1127: arg4 = arg3;
! 1128: }
! 1129: } /* set$piece */
! 1130: else if (*codptr == '$' && (*(codptr + 1) | 0140) == 'q' && (*(codptr + 2) | 0140) == 's') { /* TODO: verify this works (jpw) was (*codptr == '$q'...*/
! 1131: /*SET $QSUBSCRIPT */
! 1132:
! 1133: if (multiset) {
! 1134: merr_raise (INVREF);
! 1135: goto err;
! 1136: }
! 1137:
! 1138: setpiece = 'q';
! 1139:
! 1140: while (*++codptr != '(') {
! 1141:
! 1142: if (*codptr == EOL) {
! 1143: merr_raise (INVREF);
! 1144: goto err;
! 1145: }
! 1146:
! 1147: }
! 1148:
! 1149: codptr++;
! 1150:
! 1151: expr (NAME);
! 1152:
! 1153: if (merr () > OK) goto err;
! 1154:
! 1155: stcpy (vn, varnam);
! 1156:
! 1157: if (*++codptr == ',') {
! 1158: codptr++;
! 1159:
! 1160: expr (STRING);
! 1161:
! 1162: if (merr () > OK) goto err;
! 1163:
! 1164: stcpy (tmp2, argptr);
! 1165: }
! 1166:
! 1167: if (*codptr != ')') {
! 1168: merr_raise (BRAER);
! 1169: goto err;
! 1170: }
! 1171:
! 1172: }
! 1173: else if (*codptr == '$' &&
! 1174: (*(codptr + 1) | 0140) == 'd' &&
! 1175: (*(codptr + 2) | 0140) == 'i') {
! 1176:
! 1177: short rb_slot;
! 1178:
! 1179: rb_slot = rbuf_slot_from_name (rou_name);
! 1180:
! 1181: while ((*(++codptr)) != '=');
! 1182:
! 1183: codptr++;
! 1184:
! 1185: expr (STRING);
! 1186:
! 1187: stcnv_m2c (argptr);
! 1188:
! 1189: if ((strcmp (argptr, "STANDARD") == 0) ||
! 1190: (strcmp (argptr, "MDS") == 0)) {
! 1191: rbuf_flags[rb_slot].standard = TRUE;
! 1192: rbuf_flags[rb_slot].dialect = D_MDS;
! 1193: }
! 1194: else if (strcmp (argptr, "M77") == 0) {
! 1195: rbuf_flags[rb_slot].standard = TRUE;
! 1196: rbuf_flags[rb_slot].dialect = D_M77;
! 1197: }
! 1198: else if (strcmp (argptr, "M84") == 0) {
! 1199: rbuf_flags[rb_slot].standard = TRUE;
! 1200: rbuf_flags[rb_slot].dialect = D_M84;
! 1201: }
! 1202: else if (strcmp (argptr, "M90") == 0) {
! 1203: rbuf_flags[rb_slot].standard = TRUE;
! 1204: rbuf_flags[rb_slot].dialect = D_M90;
! 1205: }
! 1206: else if (strcmp (argptr, "M95") == 0) {
! 1207: rbuf_flags[rb_slot].standard = TRUE;
! 1208: rbuf_flags[rb_slot].dialect = D_M95;
! 1209: }
! 1210: else if (strcmp (argptr, "M5") == 0) {
! 1211: rbuf_flags[rb_slot].standard = TRUE;
! 1212: rbuf_flags[rb_slot].dialect = D_M5;
! 1213: }
! 1214: else if ((strcmp (argptr, "FREEM") == 0) ||
! 1215: (strcmp (argptr, "EXTENDED") == 0)) {
! 1216: rbuf_flags[rb_slot].standard = TRUE;
! 1217: rbuf_flags[rb_slot].dialect = D_FREEM;
! 1218: }
! 1219: else {
! 1220: merr_raise (CMMND);
! 1221: goto err;
! 1222: }
! 1223:
! 1224: goto s_end;
! 1225:
! 1226: }
! 1227: else if (*codptr == '$' && (*(codptr + 1) | 0140) == 'e' && (*(codptr + 2) | 0140) != 't' && (*(codptr + 2) | 0140) != 'c') {
! 1228:
! 1229: /* set $extract */
! 1230: if (multiset) {
! 1231: merr_raise (INVREF);
! 1232: goto err;
! 1233: }
! 1234:
! 1235: setpiece = 'e';
! 1236:
! 1237: while (*++codptr != '(') {
! 1238:
! 1239: if (*codptr == EOL) {
! 1240: merr_raise (INVREF);
! 1241: goto err;
! 1242: }
! 1243:
! 1244: }
! 1245:
! 1246: codptr++;
! 1247:
! 1248: expr (NAME);
! 1249:
! 1250: if (merr () > OK) goto err;
! 1251:
! 1252: stcpy (vn, varnam);
! 1253:
! 1254: codptr++;
! 1255:
! 1256: if (*codptr != ')') {
! 1257: codptr++;
! 1258:
! 1259: expr (STRING);
! 1260:
! 1261: if (merr () > OK) goto err;
! 1262:
! 1263: arg3 = intexpr (argptr);
! 1264:
! 1265: if (merr () == MXNUM) {
! 1266: arg3 = 256;
! 1267: merr_clear ();
! 1268: }
! 1269: }
! 1270: else {
! 1271: arg3 = 1;
! 1272: }
! 1273:
! 1274: if (*codptr != ')') {
! 1275: codptr++;
! 1276:
! 1277: expr (STRING);
! 1278:
! 1279: if (merr () > OK) goto err;
! 1280:
! 1281: if (*codptr != ')') {
! 1282: merr_raise (BRAER);
! 1283: goto err;
! 1284: }
! 1285:
! 1286: arg4 = intexpr (argptr);
! 1287:
! 1288: if (merr () == MXNUM) {
! 1289: arg4 = 256;
! 1290: merr_clear ();
! 1291: }
! 1292:
! 1293: }
! 1294: else {
! 1295: arg4 = arg3;
! 1296: }
! 1297:
! 1298: }
! 1299: else if (*codptr == '$' && (*(codptr + 1) | 0140) == 'e' && (*(codptr + 2) | 0140) == 'c') {
! 1300: /* set $ecode */
! 1301:
! 1302: if (multiset) {
! 1303: merr_raise (INVREF);
! 1304: goto err;
! 1305: }
! 1306:
! 1307: while ((*(++codptr)) != '=');
! 1308:
! 1309: codptr++;
! 1310:
! 1311: expr (STRING);
! 1312:
! 1313: if (merr () > OK) goto err;
! 1314:
! 1315: switch (argptr[0]) {
! 1316:
! 1317: case ',':
! 1318:
! 1319: switch (argptr[1]) {
! 1320:
! 1321: case ',':
! 1322: merr_raise (M101);
! 1323: goto err;
! 1324:
! 1325: }
! 1326:
! 1327: break;
! 1328:
! 1329: }
! 1330:
! 1331: merr_raise (merr_set_ecode (argptr));
! 1332:
! 1333: #if 0
! 1334: set_io (UNIX);
! 1335: stcnv_m2c (ecode);
! 1336: stcnv_m2c (etrap);
! 1337: printf ("\n\n*** IN SET $ECODE: ecode = '%s' etrap = '%s'\n", ecode, etrap);
! 1338: stcnv_c2m (etrap);
! 1339: stcnv_c2m (ecode);
! 1340: set_io (MUMPS);
! 1341: #endif
! 1342:
! 1343: if (merr () > OK) goto err;
! 1344:
! 1345: goto s_end;
! 1346:
! 1347: }
! 1348: else if (*codptr == '$' && (*(codptr + 1) | 0140) == 'e' && (*(codptr + 2) | 0140) == 't') {
! 1349: /* set $etrap */
! 1350:
! 1351: if (multiset) {
! 1352: merr_raise (INVREF);
! 1353: goto err;
! 1354: }
! 1355:
! 1356: while ((*(++codptr)) != '=');
! 1357:
! 1358: codptr++;
! 1359:
! 1360: expr (STRING);
! 1361:
! 1362: if (merr () > OK) goto err;
! 1363:
! 1364: stcpy (etrap, argptr);
! 1365:
! 1366: #if 0
! 1367: set_io (UNIX);
! 1368: stcnv_m2c (ecode);
! 1369: stcnv_m2c (etrap);
! 1370: printf ("\n\n***IN SET $ETRAP: ecode = '%s' etrap = '%s'\n", ecode, etrap);
! 1371: stcnv_c2m (etrap);
! 1372: stcnv_c2m (ecode);
! 1373: set_io (MUMPS);
! 1374: #endif
! 1375:
! 1376: goto s_end;
! 1377:
! 1378: }
! 1379: else if (*codptr == '$' && (*(codptr + 1) | 0140) == 'g' && cset) { /* set$get */
! 1380:
! 1381: if (multiset) {
! 1382: merr_raise (INVREF);
! 1383: goto err;
! 1384: }
! 1385:
! 1386: setpiece = 'g';
! 1387:
! 1388: while (*++codptr != '(') {
! 1389:
! 1390: if (*codptr == EOL) {
! 1391: merr_raise (INVREF);
! 1392: goto err;
! 1393: }
! 1394: }
! 1395:
! 1396: codptr++;
! 1397:
! 1398: expr (NAME);
! 1399:
! 1400: if (merr () > OK) goto err;
! 1401:
! 1402: stcpy (vn, varnam);
! 1403:
! 1404: if (*++codptr == ',') {
! 1405: codptr++;
! 1406:
! 1407: expr (STRING);
! 1408:
! 1409: if (merr () > OK) goto err;
! 1410:
! 1411: stcpy (tmp2, argptr);
! 1412: }
! 1413: else {
! 1414: tmp2[0] = EOL;
! 1415: }
! 1416:
! 1417: if (*codptr != ')') {
! 1418: merr_raise (BRAER);
! 1419: goto err;
! 1420: }
! 1421: }
! 1422: else {
! 1423: if (*codptr == '$') {
! 1424: codptr++;
! 1425:
! 1426: expr (NAME);
! 1427:
! 1428: if (merr () > OK) goto err;
! 1429:
! 1430: stcpy (tmp, varnam);
! 1431:
! 1432: varnam[0] = '$';
! 1433:
! 1434: stcpy (&varnam[1], tmp);
! 1435:
! 1436: i = 0;
! 1437: while ((ch = varnam[++i]) != EOL) {
! 1438: if (ch >= 'A' && ch <= 'Z') {
! 1439: varnam[i] |= 0140; /*to lowercase */
! 1440: }
! 1441: }
! 1442: }
! 1443: else {
! 1444: expr (NAME);
! 1445:
! 1446: if (merr () > OK) goto err;
! 1447: }
! 1448:
! 1449: stcpy (vn, varnam);
! 1450: }
! 1451:
! 1452: if (multiset) {
! 1453: vnset[i = stlen (vnset)] = SOH;
! 1454:
! 1455: stcpy (&vnset[++i], vn);
! 1456:
! 1457: if (*++codptr == ',') {
! 1458: codptr++;
! 1459: goto set;
! 1460: }
! 1461:
! 1462: if (*codptr != ')') {
! 1463: merr_raise (COMMAER);
! 1464: goto err;
! 1465: }
! 1466: }
! 1467:
! 1468: if (*++codptr != '=') {
! 1469: ch = *codptr;
! 1470:
! 1471: if (!cset || *++codptr != '=' || multiset || setpiece || varnam[0] == '$') {
! 1472: merr_raise (ASSIGNER);
! 1473: break;
! 1474: }
! 1475:
! 1476: setop = ch;
! 1477: }
! 1478:
! 1479: codptr++;
! 1480:
! 1481: expr (STRING);
! 1482:
! 1483: if (merr () > OK) goto err;
! 1484:
! 1485: if (multiset)
! 1486: multi:
! 1487: {
! 1488: i = 0;
! 1489: while (vnset[i] == SOH) i++;
! 1490:
! 1491: j = 0;
! 1492: while ((vn[j] = vnset[i]) != SOH && vnset[i] != EOL) {
! 1493: vnset[i++] = SOH;
! 1494: j++;
! 1495: }
! 1496:
! 1497: vn[j] = EOL;
! 1498:
! 1499: if (j == 0) goto s_end;
! 1500: }
! 1501:
! 1502: if (setpiece == 'p') {
! 1503: long m, n;
! 1504:
! 1505: if (arg4 < arg3 || arg4 < 1) {
! 1506: setpiece = FALSE;
! 1507: break;
! 1508: }
! 1509:
! 1510: if (arg3 <= 0) arg3 = 1;
! 1511:
! 1512: if (vn[0] == '^') {
! 1513: if (vn[1] == '$') {
! 1514: ssvn (get_sym, vn, tmp3);
! 1515: }
! 1516: else {
! 1517: global (get_sym, vn, tmp3);
! 1518: }
! 1519: }
! 1520: else {
! 1521: symtab (get_sym, vn, tmp3);
! 1522: }
! 1523:
! 1524:
! 1525: if (merr () == UNDEF || merr () == M6 || merr () == M7) {
! 1526: tmp3[0] = EOL;
! 1527: merr_clear ();
! 1528: }
! 1529: else if (merr () != OK) {
! 1530: stcpy (varerr, vn);
! 1531: }
! 1532:
! 1533: ch = 0;
! 1534: m = 0;
! 1535: n = 0;
! 1536:
! 1537: j = stlen (tmp2);
! 1538:
! 1539: while (n < arg3 - 1) {
! 1540:
! 1541: if ((ch = find (&tmp3[m], tmp2)) <= 0) {
! 1542:
! 1543: while (++n < arg3) {
! 1544: if (stcat (tmp3, tmp2) == 0) {
! 1545: merr_raise (M75);
! 1546: goto err;
! 1547: }
! 1548: }
! 1549:
! 1550: arg3 = arg4 = stlen (tmp3);
! 1551:
! 1552: goto set10;
! 1553: }
! 1554:
! 1555: n++;
! 1556: m += j + ch - 1;
! 1557: }
! 1558:
! 1559: if (arg3 > 1) {
! 1560: arg3 = m;
! 1561: }
! 1562: else {
! 1563: arg3 = 0;
! 1564: }
! 1565:
! 1566: while (n++ < arg4) {
! 1567:
! 1568: if ((ch = find (&tmp3[m], tmp2)) <= 0) {
! 1569: arg4 = stlen (tmp3);
! 1570:
! 1571: goto set10;
! 1572: }
! 1573:
! 1574: m += j + ch - 1;
! 1575: }
! 1576:
! 1577: arg4 = m - j;
! 1578:
! 1579: set10:
! 1580:
! 1581: stcpy0 (tmp2, tmp3, (long) arg3);
! 1582:
! 1583: tmp2[arg3] = EOL;
! 1584:
! 1585: if (stcat (tmp2, argptr) == 0) {
! 1586: merr_raise (M75);
! 1587: goto err;
! 1588: }
! 1589:
! 1590: if (stcat (tmp2, &tmp3[arg4]) == 0) {
! 1591: merr_raise (M56); //JPW
! 1592: goto err;
! 1593: }
! 1594:
! 1595: stcpy (argptr, tmp2);
! 1596:
! 1597: setpiece = FALSE;
! 1598: }
! 1599: else if (setpiece == 'q') { /* SET$QSUBSCRIPT */
! 1600:
! 1601: setpiece = FALSE;
! 1602:
! 1603: if (vn[0] == '^') {
! 1604: if (vn[1] == '$') {
! 1605: ssvn (get_sym, vn, tmp3);
! 1606: }
! 1607: else {
! 1608: global (get_sym, vn, tmp3);
! 1609: }
! 1610: }
! 1611: else {
! 1612: symtab (get_sym, vn, tmp3);
! 1613: }
! 1614:
! 1615: if (merr () == UNDEF || merr () == M6 || merr () == M7) {
! 1616: tmp3[0] = EOL;
! 1617: merr_clear ();
! 1618: }
! 1619: else if (merr () != OK) {
! 1620: stcpy (varerr, vn);
! 1621: }
! 1622:
! 1623: if (merr () == OK) {
! 1624: /* 2nd $QS argument */
! 1625: if ((arg4 = intexpr (tmp2)) < -1) merr_raise (ARGER);
! 1626: if (merr () != OK) break;
! 1627:
! 1628: /* special if source is empty */
! 1629: if (tmp3[0] != EOL || (arg4 != 0)) {
! 1630: /* special: Set env to empty: no |""| */
! 1631: if ((arg4 == -1) && (*argptr == EOL)) {
! 1632: tmp2[0] = EOL;
! 1633: }
! 1634: else if ((arg4 != 0) && !znamenumeric (argptr)) {
! 1635: /* put replacement string in tmp2 with */
! 1636: /* quotes around env or subscript, unless numeric */
! 1637: i = 0;
! 1638: j = -1;
! 1639: tmp2[0] = '"';
! 1640:
! 1641: while ((tmp2[++i] = argptr[++j]) != EOL) {
! 1642: if (tmp2[i] == '"') tmp2[++i] = '"';
! 1643:
! 1644: if (i >= (STRLEN - 2)) {
! 1645: merr_raise (M75);
! 1646: break;
! 1647: }
! 1648: }
! 1649:
! 1650: tmp2[i] = '"';
! 1651: tmp2[++i] = EOL;
! 1652: }
! 1653: else {
! 1654: stcpy (tmp2, argptr);
! 1655: }
! 1656:
! 1657: /* source is tmp3, dest is argptr, replacement is tmp2 */
! 1658: {
! 1659: int ch, cpflag, quote, piececounter;
! 1660:
! 1661: piececounter = 0;
! 1662: i = 0;
! 1663: j = 0;
! 1664: quote = FALSE;
! 1665: cpflag = FALSE;
! 1666:
! 1667: /* if source has no env, process right now */
! 1668: if ((arg4 == -1) && (tmp3[tmp3[0] == '^'] != '|') && tmp2[0] != EOL) {
! 1669:
! 1670: if (tmp3[0] == '^') {
! 1671: argptr[j++] = '^';
! 1672: i = 1;
! 1673: }
! 1674:
! 1675: argptr[j++] = '|';
! 1676: ch = 0;
! 1677:
! 1678: while ((argptr[j] = tmp2[ch++]) != EOL) j++;
! 1679:
! 1680: argptr[j++] = '|';
! 1681:
! 1682: }
! 1683: else if (arg4 == 0) { /* '^'+name may be separated by env */
! 1684: if (tmp2[0] == '^') argptr[j++] = '^';
! 1685: if (tmp3[0] == '^') i++;
! 1686: }
! 1687:
! 1688: while ((ch = tmp3[i++]) != EOL) {
! 1689: if (ch == '"') quote = !quote;
! 1690:
! 1691: if (!quote) {
! 1692:
! 1693: if (ch == ',') {
! 1694: piececounter++;
! 1695: argptr[j++] = ch;
! 1696:
! 1697: continue;
! 1698: }
! 1699:
! 1700: if ((ch == '(' && piececounter == 0)) {
! 1701: if (!cpflag && (arg4 == 0)) {
! 1702: i--;
! 1703: }
! 1704: else {
! 1705: piececounter = 1;
! 1706: argptr[j++] = ch;
! 1707:
! 1708: continue;
! 1709: }
! 1710: }
! 1711:
! 1712: if (ch == '|') {
! 1713: if (piececounter == 0) {
! 1714: piececounter = (-1);
! 1715: }
! 1716: else if (piececounter == (-1)) {
! 1717: piececounter = 0;
! 1718: }
! 1719:
! 1720: if (tmp2[0] != EOL || piececounter > 0) argptr[j++] = ch;
! 1721:
! 1722: continue;
! 1723: }
! 1724: }
! 1725:
! 1726: if (piececounter == arg4) {
! 1727: if (cpflag) continue;
! 1728:
! 1729: cpflag = TRUE;
! 1730: ch = 0;
! 1731:
! 1732: if (arg4 == 0 && tmp2[0] == '^') ch = 1;
! 1733:
! 1734: while ((argptr[j] = tmp2[ch++]) != EOL) j++;
! 1735: }
! 1736: else {
! 1737: argptr[j++] = ch;
! 1738: }
! 1739:
! 1740: if (j >= (STRLEN - 1)) {
! 1741: merr_raise (M75);
! 1742: break;
! 1743: }
! 1744: } /* while ((ch = tmp3[i++]) != EOL) ... */
! 1745:
! 1746: if (piececounter && (piececounter == arg4)) argptr[j++] = ')';
! 1747:
! 1748: if (piececounter < arg4) {
! 1749:
! 1750: if (piececounter == 0) {
! 1751: argptr[j++] = '(';
! 1752: }
! 1753: else {
! 1754: argptr[j - 1] = ',';
! 1755: }
! 1756:
! 1757: while (++piececounter < arg4) {
! 1758: argptr[j++] = '"';
! 1759: argptr[j++] = '"';
! 1760: argptr[j++] = ',';
! 1761:
! 1762: if (j >= STRLEN) {
! 1763: merr_raise (M75);
! 1764: break;
! 1765: }
! 1766:
! 1767: }
! 1768: }
! 1769:
! 1770: ch = 0;
! 1771:
! 1772: if (argptr[j - 1] != ')') {
! 1773: while ((argptr[j++] = tmp2[ch++]) != EOL);
! 1774: argptr[j - 1] = ')';
! 1775: }
! 1776: }
! 1777:
! 1778: argptr[j] = EOL;
! 1779:
! 1780: if (j >= STRLEN) {
! 1781: merr_raise (M75);
! 1782: break;
! 1783: }
! 1784:
! 1785: }
! 1786: }
! 1787: else {
! 1788: break;
! 1789: }
! 1790: } /* set$qsubscript */
! 1791: else if (setpiece == 'e') { /* SETtable $EXTRACT *//* parameters ok?? */
! 1792:
! 1793: if (arg3 > arg4 || arg4 < 1) {
! 1794: setpiece = FALSE;
! 1795: break;
! 1796: }
! 1797:
! 1798: if (arg3 <= 0) arg3 = 1;
! 1799:
! 1800: if (arg3 > STRLEN) {
! 1801: merr_raise (M75);
! 1802: goto err;
! 1803: }
! 1804:
! 1805: /* get value of glvn */
! 1806: if (vn[0] == '^') {
! 1807: if (vn[1] == '$') {
! 1808: ssvn (get_sym, vn, tmp3);
! 1809: }
! 1810: else {
! 1811: global (get_sym, vn, tmp3);
! 1812: }
! 1813: }
! 1814: else {
! 1815: symtab (get_sym, vn, tmp3);
! 1816: }
! 1817:
! 1818:
! 1819: /* if UNDEF assume null string */
! 1820: if (merr () == UNDEF || merr () == M6 || merr () == M7) {
! 1821: tmp3[0] = EOL;
! 1822: merr_clear ();
! 1823: }
! 1824: else if (merr () != OK) {
! 1825: stcpy (varerr, vn);
! 1826: }
! 1827:
! 1828: j = stlen (tmp3);
! 1829:
! 1830: /* pad with SPaces if source string is too short */
! 1831: while (j < arg3) tmp3[j++] = SP;
! 1832:
! 1833: tmp3[j] = EOL;
! 1834:
! 1835: if (stlen (tmp3) > arg4) {
! 1836: stcpy (tmp2, &tmp3[arg4]);
! 1837: }
! 1838: else {
! 1839: tmp2[0] = EOL;
! 1840: }
! 1841:
! 1842: tmp3[arg3 - 1] = EOL;
! 1843:
! 1844: /* compose new value of glvn */
! 1845: if (stcat (tmp3, argptr) == 0) {
! 1846: merr_raise (M75);
! 1847: goto err;
! 1848: }
! 1849:
! 1850: if (stcat (tmp3, tmp2) == 0) {
! 1851: merr_raise (M75);
! 1852: goto err;
! 1853: }
! 1854:
! 1855: stcpy (argptr, tmp3);
! 1856: setpiece = FALSE;
! 1857: }
! 1858: else if (setpiece == 'g') { /* SETtable $GET */
! 1859: setpiece = FALSE;
! 1860: ch = (stcmp (tmp2, argptr) == 0) ? killone : set_sym;
! 1861:
! 1862: if (vn[0] == '^') {
! 1863: stcpy (an, argptr);
! 1864: if (vn[1] == '$') {
! 1865: ssvn (ch, vn, an);
! 1866: }
! 1867: else {
! 1868: global (ch, vn, an);
! 1869: }
! 1870: }
! 1871: else {
! 1872: stcpy (an, argptr);
! 1873: symtab (ch, vn, an);
! 1874: }
! 1875:
! 1876: if (merr () != OK) stcpy (varerr, vn);
! 1877: break;
! 1878: }
! 1879:
! 1880: if (vn[0] == '^') { /* global variables and SSVNs */
! 1881: stcpy (an, argptr);
! 1882:
! 1883: if (vn[1] == '$') {
! 1884: ssvn (set_sym, vn, an);
! 1885: }
! 1886: else {
! 1887: global (set_sym, vn, an);
! 1888: }
! 1889:
! 1890:
! 1891: if (merr () > OK) {
! 1892: stcpy (varerr, vn);
! 1893: goto err;
! 1894: }
! 1895: }
! 1896: else if (vn[0] != '$') { /* local variables */
! 1897: stcpy (an, argptr);
! 1898: symtab (set_sym, vn, an);
! 1899:
! 1900: if (merr () > OK) {
! 1901: stcpy (varerr, vn);
! 1902: goto err;
! 1903: }
! 1904: }
! 1905: else { /* $-variables */
! 1906:
! 1907: if (vn[1] == 'x') { /* set $X */
! 1908: j = intexpr (argptr);
! 1909:
! 1910: if (merr () == MXNUM) {
! 1911: j = 256;
! 1912: merr_clear ();
! 1913: }
! 1914:
! 1915: if (j < 0) {
! 1916: merr_raise (M43);
! 1917: goto err;
! 1918: }
! 1919:
! 1920: if (io == HOME) {
! 1921: argptr[0] = ESC;
! 1922: argptr[1] = '[';
! 1923: argptr[2] = EOL;
! 1924:
! 1925: if (ypos[HOME] > 1) {
! 1926: intstr (tmp3, ypos[HOME] + 1);
! 1927: stcat (argptr, tmp3);
! 1928: }
! 1929:
! 1930: if (j > 0) {
! 1931: stcat (argptr, ";\201");
! 1932: intstr (tmp3, j + 1);
! 1933: stcat (argptr, tmp3);
! 1934: }
! 1935:
! 1936: stcat (argptr, "H\201");
! 1937: write_m (argptr);
! 1938: }
! 1939:
! 1940: xpos[io] = j;
! 1941: goto s_end;
! 1942: }
! 1943: else if (vn[1] == 'y') { /* set $Y */
! 1944:
! 1945: j = intexpr (argptr);
! 1946:
! 1947: if (merr () == MXNUM) {
! 1948: j = 256;
! 1949: merr_clear ();
! 1950: }
! 1951:
! 1952: if (j < 0) {
! 1953: merr_raise (M43);
! 1954: goto err;
! 1955: }
! 1956:
! 1957: if (io == HOME) {
! 1958:
! 1959: argptr[0] = ESC;
! 1960: argptr[1] = '[';
! 1961: argptr[2] = EOL;
! 1962:
! 1963: if (j > 0) {
! 1964: intstr (tmp3, j + 1);
! 1965: stcat (argptr, tmp3);
! 1966: }
! 1967:
! 1968: if (xpos[HOME] > 0) {
! 1969: stcat (argptr, ";\201");
! 1970: intstr (tmp3, xpos[HOME] + 1);
! 1971: stcat (argptr, tmp3);
! 1972: }
! 1973:
! 1974: stcat (argptr, "H\201");
! 1975: write_m (argptr);
! 1976: }
! 1977:
! 1978: ypos[io] = j;
! 1979: goto s_end;
! 1980: }
! 1981: else if (vn[1] == 't') { /* set $t */
! 1982: test = tvexpr (argptr);
! 1983: goto s_end;
! 1984: }
! 1985: else if (vn[1] == 'j') { /* set $job */
! 1986: pid = intexpr (argptr);
! 1987: lock (" \201", -1, 's');
! 1988: goto s_end;
! 1989: }
! 1990: #if !defined(_SCO_DS)
! 1991: else if (vn[1] == 'h') { /* set $horolog */
! 1992: long int day;
! 1993: long int sec;
! 1994: struct timespec sh_ts;
! 1995:
! 1996: if (!is_horolog (argptr)) {
! 1997: merr_raise (ZINVHORO);
! 1998: goto err;
! 1999: }
! 2000:
! 2001: sec = 0L;
! 2002:
! 2003: for (i = 0; argptr[i] != EOL; i++) {
! 2004:
! 2005: if (argptr[i] == ',') {
! 2006: sec = intexpr (&argptr[i + 1]);
! 2007: break;
! 2008: }
! 2009:
! 2010: }
! 2011:
! 2012: if (sec < 0 || sec >= 86400L) {
! 2013: merr_raise (ARGER);
! 2014: goto err;
! 2015: }
! 2016:
! 2017: day = intexpr (argptr) - 47117L;
! 2018:
! 2019: if (day < 0 || day > 49710L) {
! 2020: merr_raise (ARGER);
! 2021: goto err;
! 2022: }
! 2023:
! 2024: sec += day * 86400 + timezone;
! 2025: day = timezone;
! 2026:
! 2027: sh_ts.tv_sec = sec;
! 2028:
! 2029: #if defined(__linux__)
! 2030: if (clock_settime (CLOCK_REALTIME, &sh_ts) != 0) {
! 2031: merr_raise (PROTECT);
! 2032: goto err;
! 2033: }
! 2034: #endif
! 2035:
! 2036: #ifndef LINUX
! 2037: /* daylight savings time status may have changed */
! 2038: {
! 2039: struct tm *ctdata;
! 2040: long clock;
! 2041:
! 2042: clock = time (0L);
! 2043: ctdata = localtime (&clock);
! 2044:
! 2045: if (day -= (timezone = ctdata->tm_tzadj)) {
! 2046: sec -= day;
! 2047: tzoffset += day;
! 2048: stime (&sec);
! 2049: }
! 2050: }
! 2051: #endif /* LINUX */
! 2052: goto s_end;
! 2053:
! 2054:
! 2055: }
! 2056: #endif /* _SCO_DS */
! 2057: else if ((vn[1] == 'r') || ((vn[1] == 'z') && (vn[2] == 'r') && vn[3] == EOL)) { /* set $reference */
! 2058:
! 2059: if (argptr[0] == EOL) {
! 2060: zref[0] = EOL;
! 2061: break;
! 2062: }
! 2063:
! 2064: stcpy (tmp4, codptr);
! 2065: stcpy (code, argptr);
! 2066:
! 2067: codptr = code;
! 2068:
! 2069: expr (NAME);
! 2070: stcpy (code, tmp4);
! 2071:
! 2072: codptr = code;
! 2073:
! 2074: if (argptr[0] != '^') merr_raise (INVREF);
! 2075: if (ierr <= OK) nakoffs = stcpy (zref, argptr); /* save reference */ /* SMW - TODO */
! 2076:
! 2077: goto s_end;
! 2078: }
! 2079: else if (vn[1] == 'z') { /* $Z.. variables *//* if not intrinsic: make it user defined */
! 2080:
! 2081: i = stcpy (&tmp[1], &vn[1]) + 1;
! 2082:
! 2083: if (vn[3] == DELIM) i = 3; /* set $zf() function keys */
! 2084:
! 2085: tmp[0] = SP;
! 2086: tmp[i] = SP;
! 2087: tmp[++i] = EOL;
! 2088:
! 2089: if (find (zsvn, tmp) == FALSE) {
! 2090:
! 2091: i = 2;
! 2092: while (vn[i] != EOL) {
! 2093:
! 2094: if (vn[i++] == DELIM) {
! 2095: merr_raise (INVREF);
! 2096: goto err;
! 2097: }
! 2098:
! 2099: }
! 2100:
! 2101: udfsvn (set_sym, &vn[2], argptr);
! 2102: break;
! 2103: }
! 2104:
! 2105: if ((!stcmp (&vn[2], "l\201")) || (!stcmp (&vn[2], "local\201"))) { /* set $zlocal */
! 2106:
! 2107: if (argptr[0] == EOL) {
! 2108: zloc[0] = EOL;
! 2109: break;
! 2110: }
! 2111:
! 2112: stcpy (tmp4, codptr);
! 2113: stcpy (code, argptr);
! 2114:
! 2115: codptr = code;
! 2116:
! 2117: expr (NAME);
! 2118: stcpy (code, tmp4);
! 2119:
! 2120: codptr = code;
! 2121:
! 2122: if (argptr[0] == '^') merr_raise (INVREF);
! 2123: if (ierr <= OK) stcpy (zloc, argptr); /* save reference */
! 2124:
! 2125: break;
! 2126: }
! 2127: if ((!stcmp (&vn[2], "t\201")) || (!stcmp (&vn[2], "tr\201")) || (!stcmp (&vn[2], "trap\201"))) { /* set $ztrap */
! 2128:
! 2129: if (stlen (argptr) > ZTLEN) {
! 2130: merr_raise (M75);
! 2131: goto err;
! 2132: }
! 2133:
! 2134: /* DSM V.2 error trapping */
! 2135: #ifdef DEBUG_NEWSTACK
! 2136: printf ("Setting Ztrap, DSM2err [%d]\r\n", DSM2err);
! 2137: #endif
! 2138:
! 2139:
! 2140: if (DSM2err) {
! 2141: stcpy (ztrap[NESTLEVLS + 1], argptr);
! 2142: }
! 2143: else {
! 2144: stcpy (ztrap[nstx], argptr);
! 2145: }
! 2146:
! 2147: }
! 2148: else if (!stcmp (&vn[2], "p\201") || !stcmp (&vn[2], "precision\201")) { /* set $zprecision */
! 2149:
! 2150: short tmp_zprecise;
! 2151:
! 2152: if ((tmp_zprecise = intexpr (argptr)) < 0) {
! 2153: merr_raise (MXNUM);
! 2154: goto err;
! 2155: }
! 2156:
! 2157: if (!fp_mode) {
! 2158:
! 2159: if (merr () == MXNUM) goto err;
! 2160:
! 2161: if (tmp_zprecise > 20000) {
! 2162: merr_raise (MXNUM);
! 2163: goto err;
! 2164: }
! 2165:
! 2166: }
! 2167: #if !defined(_AIX)
! 2168: else {
! 2169:
! 2170: if (tmp_zprecise > DBL_DIG) {
! 2171: merr_raise (MXNUM);
! 2172: goto err;
! 2173: }
! 2174:
! 2175: sprintf (fp_conversion, "%%.%df\201", tmp_zprecise);
! 2176:
! 2177: }
! 2178: #endif
! 2179:
! 2180: zprecise = tmp_zprecise;
! 2181:
! 2182:
! 2183: }
! 2184: else if (vn[2] == 'f' && vn[3] == DELIM) { /* set $zf() function keys */
! 2185:
! 2186: i = intexpr (&vn[4]) - 1;
! 2187:
! 2188: if (i < 0 || i > 43) {
! 2189: merr_raise (FUNARG);
! 2190: goto err;
! 2191: }
! 2192:
! 2193: if (stlen (argptr) > FUNLEN) {
! 2194: merr_raise (M75);
! 2195: goto err;
! 2196: }
! 2197:
! 2198: stcpy (zfunkey[i], argptr);
! 2199:
! 2200: }
! 2201: else if (vn[2] == 'm' && vn[4] == EOL && (vn[3] == 'c' || vn[3] == 'n' || vn[3] == 'p' || vn[3] == 'l' || vn[3] == 'u')) { /* set $zm_ loadable match; sort match code */
! 2202:
! 2203: short k;
! 2204:
! 2205: i = 0;
! 2206:
! 2207: for (ch = 0; ch <= 255; ch++) {
! 2208: j = argptr - partition;
! 2209:
! 2210: while ((k = partition[j++]) != EOL) {
! 2211:
! 2212: if (UNSIGN (k) == ch) {
! 2213: tmp[i++] = k;
! 2214: break;
! 2215: }
! 2216:
! 2217: }
! 2218:
! 2219: }
! 2220:
! 2221: tmp[i] = EOL;
! 2222:
! 2223: switch (vn[3]) {
! 2224:
! 2225: case 'c':
! 2226: stcpy (zmc, tmp);
! 2227: break;
! 2228:
! 2229: case 'n':
! 2230: stcpy (zmn, tmp);
! 2231: break;
! 2232:
! 2233: case 'p':
! 2234: stcpy (zmp, tmp);
! 2235: break;
! 2236: /* 'a': always union of zml+zmu */
! 2237:
! 2238: case 'l':
! 2239: stcpy (zml, tmp);
! 2240: break;
! 2241:
! 2242: case 'u':
! 2243: stcpy (zmu, tmp);
! 2244: break;
! 2245: /* 'e': always 'everything' */
! 2246: }
! 2247:
! 2248: }
! 2249: else {
! 2250: merr_raise (INVREF);
! 2251: break;
! 2252: }
! 2253: }
! 2254: else {
! 2255: merr_raise (INVREF);
! 2256: goto err;
! 2257: } /* end of processing for $Z.. intrinsic special variables */
! 2258: } /* svns=$vars */
! 2259:
! 2260: if (multiset) goto multi;
! 2261: } /* end of scope for special SET syntaxes */
! 2262:
! 2263: s_end:
! 2264: if (*codptr != ',') break;
! 2265: if (*++codptr == '@') goto again;
! 2266:
! 2267: goto set0;
! 2268:
! 2269: case IF:
! 2270: merr_raise (cmd_if (&ra));
! 2271: MRESCHECK(ra);
! 2272: break;
! 2273:
! 2274:
! 2275: case OO_USING:
! 2276: merr_raise (cmd_using (&ra));
! 2277: MRESCHECK(ra);
! 2278: break;
! 2279:
! 2280: case OO_WITH:
! 2281: merr_raise (cmd_with (&ra));
! 2282: MRESCHECK(ra);
! 2283: break;
! 2284:
! 2285: case WRITE:
! 2286: merr_raise (cmd_write(&ra, &i));
! 2287: MRESCHECK(ra);
! 2288: break;
! 2289:
! 2290: case READ:
! 2291: merr_raise (cmd_read (&ra));
! 2292: MRESCHECK(ra);
! 2293: break;
! 2294:
! 2295: case ELSE:
! 2296: merr_raise (cmd_else (&ra));
! 2297: MRESCHECK(ra);
! 2298: break;
! 2299:
! 2300: case ZQUIT:
! 2301:
! 2302: {
! 2303: int zq_lvlct;
! 2304:
! 2305: if (rtn_dialect () != D_FREEM) {
! 2306: merr_raise (NOSTAND);
! 2307: goto err;
! 2308: }
! 2309:
! 2310: if (*codptr == EOL) {
! 2311: zq_lvlct = nstx;
! 2312: }
! 2313: else {
! 2314: expr (STRING);
! 2315:
! 2316: zq_lvlct = intexpr (argptr);
! 2317:
! 2318: if (merr () > OK) goto err;
! 2319:
! 2320: if (zq_lvlct < 0 || zq_lvlct > nstx) {
! 2321: merr_raise (LVLERR);
! 2322: goto err;
! 2323: }
! 2324: else if (zq_lvlct != nstx) {
! 2325: repQUIT = nstx - zq_lvlct;
! 2326: }
! 2327: else {
! 2328: merr_raise (LVLERR);
! 2329: goto err;
! 2330: }
! 2331: }
! 2332:
! 2333: break;
! 2334: }
! 2335:
! 2336: case QUIT:
! 2337:
! 2338: if (tp_level > 0) {
! 2339: merr_raise (M42);
! 2340: goto err;
! 2341: }
! 2342:
! 2343: #ifdef DEBUG_NEWSTACK
! 2344: printf ("At QUIT command, checking stack...\r\n");
! 2345: #endif
! 2346:
! 2347:
! 2348:
! 2349: #ifdef DEBUG_NEWSTACK
! 2350: printf ("nestc[nstx] is (%d)\r\n", nestc[nstx]);
! 2351: #endif
! 2352:
! 2353: if (*codptr != EOL && *codptr != SP && nestc[nstx] != '$') {
! 2354: #ifdef DEBUG_NEWSTACK
! 2355: printf ("IERR\r\n");
! 2356: #endif
! 2357:
! 2358: merr_raise (ARGER);
! 2359: break;
! 2360: }
! 2361:
! 2362:
! 2363:
! 2364: if (nestc[nstx] == '$') { /* extrinsic function/variable */
! 2365:
! 2366:
! 2367: #ifdef DEBUG_NEWSTACK
! 2368: printf ("EXTRINSIC\r\n");
! 2369: #endif
! 2370: //printf (" extr_types[%d] = '%d'\r\n", nstx, extr_types[nstx]);
! 2371: if (*codptr == EOL || *codptr == SP) {
! 2372:
! 2373: #ifdef DEBUG_NEWSTACK
! 2374: printf ("CODPTR is [%d]\r\n", *codptr);
! 2375: #endif
! 2376:
! 2377: if (exfdefault[0] == EOL) {
! 2378: *argptr = EOL;
! 2379: merr_raise (NOVAL);
! 2380: }
! 2381: else { /* there is a default expression... */
! 2382: stcpy (&code[1], exfdefault);
! 2383: expr (STRING);
! 2384:
! 2385: if (ierr != OK - CTRLB && merr () != OK && merr () != INRPT) {
! 2386:
! 2387: #ifdef DEBUG_NEWSTACK
! 2388: printf ("Break at 1st IERR\r\n");
! 2389: #endif
! 2390: break;
! 2391: }
! 2392: }
! 2393: }
! 2394: else {
! 2395:
! 2396: expr (STRING);
! 2397:
! 2398: if (ierr != OK - CTRLB && merr () != OK && merr () != INRPT) {
! 2399:
! 2400: #ifdef DEBUG_NEWSTACK
! 2401: printf ("Break at 2nd IERR\r\n");
! 2402: #endif
! 2403:
! 2404: break;
! 2405: }
! 2406:
! 2407: if (dt_check (extr_types[nstx], argptr, 0) == FALSE) {
! 2408: extr_types[nstx] = DT_STRING;
! 2409: merr_raise (TYPMISMATCH);
! 2410: break;
! 2411: }
! 2412:
! 2413:
! 2414: }
! 2415:
! 2416: #ifdef DEBUG_NEWSTACK
! 2417: printf ("CHECK 01 (Stack POP)\r\n");
! 2418: #endif
! 2419:
! 2420:
! 2421:
! 2422: if (nestn[nstx]) { /* reload routine */
! 2423: namptr = nestn[nstx];
! 2424:
! 2425: stcpy (rou_name, namptr);
! 2426: zload (rou_name);
! 2427:
! 2428: ssvn_job_update ();
! 2429:
! 2430: dosave[0] = 0;
! 2431:
! 2432: namptr--;
! 2433: }
! 2434:
! 2435: if (nestnew[nstx]) unnew (); /* un-NEW variables */
! 2436:
! 2437: /* restore old pointers */
! 2438: level = nestlt[nstx]; /* pop level */
! 2439: roucur = nestr[nstx] + rouptr;
! 2440:
! 2441: extr_types[nstx] = DT_STRING;
! 2442:
! 2443: stcpy (codptr = code, cmdptr = nestp[nstx--]);
! 2444: estack--;
! 2445:
! 2446: forsw = (nestc[nstx] == FOR);
! 2447: loadsw = TRUE;
! 2448:
! 2449: return 0;
! 2450:
! 2451:
! 2452: }
! 2453:
! 2454:
! 2455: if (nestc[nstx] == BREAK) {
! 2456: merr_clear ();
! 2457: merr_set_break ();
! 2458: goto zgo;
! 2459: } /*cont. single step */
! 2460:
! 2461:
! 2462: quit0:
! 2463:
! 2464: #ifdef DEBUG_NEWSTACK
! 2465: printf ("CHECK 02 (Stack POP)\r\n");
! 2466: #endif
! 2467:
! 2468: if (evt_depth) {
! 2469:
! 2470: evt_depth--;
! 2471:
! 2472: if (evt_depth == 0 && evt_async_restore == TRUE) {
! 2473: evt_async_enabled = TRUE;
! 2474: evt_async_restore = FALSE;
! 2475: }
! 2476:
! 2477: }
! 2478:
! 2479: if (etrap_lvl) etrap_lvl--;
! 2480:
! 2481: if (nstx == 0) goto restore; /* nothing to quit */
! 2482:
! 2483: if (nestc[nstx] == FOR) {
! 2484:
! 2485: stcpy (code, cmdptr = nestp[nstx--]);
! 2486:
! 2487: estack--;
! 2488:
! 2489: codptr = code;
! 2490:
! 2491: ftyp = fortyp[--forx];
! 2492: fvar = forvar[forx];
! 2493: finc = forinc[forx];
! 2494: fpost = forpost[forx];
! 2495: flim = forlim[forx];
! 2496: fi = fori[forx];
! 2497:
! 2498: if ((forsw = (nestc[nstx] == FOR))) goto for_end;
! 2499:
! 2500: goto next_line;
! 2501: }
! 2502:
! 2503: if (nestn[nstx]) { /* reload routine */
! 2504: namptr = nestn[nstx];
! 2505:
! 2506: if ((nestc[nstx] != XECUTE) || loadsw) {
! 2507:
! 2508: stcpy (rou_name, namptr);
! 2509: zload (rou_name);
! 2510:
! 2511: ssvn_job_update ();
! 2512:
! 2513: dosave[0] = 0;
! 2514: }
! 2515:
! 2516: namptr--;
! 2517: }
! 2518:
! 2519: if (nestnew[nstx]) unnew (); /* un-NEW variables */
! 2520:
! 2521: /* restore old pointers */
! 2522: if ((mcmnd = nestc[nstx]) == BREAK) goto restore; /* cont. single step */
! 2523:
! 2524: if (mcmnd == DO_BLOCK) {
! 2525: test = nestlt[nstx];
! 2526: level--;
! 2527: }
! 2528: else { /* pop $TEST */
! 2529: level = nestlt[nstx]; /* pop level */
! 2530: }
! 2531:
! 2532: if (nstx) {
! 2533: roucur = nestr[nstx] + rouptr;
! 2534: }
! 2535: else {
! 2536: roucur = buff + (NO_OF_RBUF * PSIZE0 + 1);
! 2537: }
! 2538:
! 2539: stcpy (codptr = code, cmdptr = nestp[nstx--]);
! 2540: estack--;
! 2541: forsw = (nestc[nstx] == FOR);
! 2542:
! 2543: loadsw = TRUE;
! 2544:
! 2545: if (deferred_ierr > OK) { /* smw - TODO: how to handle deferred_ierr now */
! 2546: merr_raise (deferred_ierr);
! 2547: }
! 2548:
! 2549: #if defined(HAVE_MWAPI_MOTIF)
! 2550: if ((in_syn_event_loop == TRUE) && (nstx == syn_event_entry_nstx)) goto syn_evt_loop_bottom;
! 2551: #endif
! 2552:
! 2553: break;
! 2554:
! 2555: case FOR:
! 2556:
! 2557: if ((ch = *codptr) == EOL) goto skip_line; /* ignore empty line */
! 2558:
! 2559: #ifdef DEBUG_NEWSTACK
! 2560: printf ("CHECK 03 (Stack PUSH)\r\n");
! 2561: #endif
! 2562:
! 2563:
! 2564: if (++nstx > NESTLEVLS) {
! 2565: nstx--;
! 2566: merr_raise (STKOV);
! 2567:
! 2568: break;
! 2569: }
! 2570: else {
! 2571: estack++;
! 2572: }
! 2573:
! 2574: fvar = forvar[++forx];
! 2575: finc = forinc[forx];
! 2576: fpost = forpost[forx];
! 2577: flim = forlim[forx];
! 2578: fi = fori[forx];
! 2579: nestc[nstx] = FOR; /* stack set-up */
! 2580:
! 2581: #ifdef DEBUG_NEWSTACK
! 2582: if (!cmdptr) printf ("CMDPTR is ZERO!\r\n");
! 2583: #endif
! 2584:
! 2585: nestp[nstx] = cmdptr;
! 2586: nestn[nstx] = 0; /* no overring of routine */
! 2587: nestr[nstx] = roucur - rouptr; /* save roucur: only for $V(26) needed */
! 2588: ztrap[nstx][0] = EOL;
! 2589:
! 2590:
! 2591: forsw = TRUE;
! 2592: ftyp = 0; /* no args is FOREVER */
! 2593:
! 2594: if (ch == SP) {
! 2595: goto for_go;
! 2596: }
! 2597: else { /* find local variable */
! 2598:
! 2599: if (ch == '^') {
! 2600: merr_raise (GLOBER);
! 2601: break;
! 2602: }
! 2603:
! 2604: if (ch == '$') {
! 2605: merr_raise (INVREF);
! 2606: break;
! 2607: }
! 2608:
! 2609: if (*(codptr + 1) == '=') { /* single char local variable */
! 2610:
! 2611: if ((ch < 'A' && ch != '%') || (ch > 'Z' && ch < 'a') || ch > 'z') {
! 2612: merr_raise (INVREF);
! 2613: break;
! 2614: }
! 2615:
! 2616: fvar[0] = ch;
! 2617: fvar[1] = EOL;
! 2618:
! 2619: codptr += 2;
! 2620: }
! 2621: else {
! 2622: expr (NAME);
! 2623:
! 2624: if (*++codptr != '=') merr_raise (ASSIGNER);
! 2625: if (merr () != OK) break;
! 2626:
! 2627: stcpy (fvar, varnam);
! 2628:
! 2629: codptr++;
! 2630: }
! 2631:
! 2632: ftyp++;
! 2633: }
! 2634:
! 2635: for_nxt_arg:
! 2636:
! 2637: expr (STRING);
! 2638:
! 2639: if (merr () != OK) break;
! 2640:
! 2641: stcpy (tmp, argptr);
! 2642:
! 2643: if ((ch = *codptr) != ':') {
! 2644:
! 2645: if (ch == ',' || ch == SP || ch == EOL) {
! 2646: ftyp = 1;
! 2647: goto for_init;
! 2648: }
! 2649:
! 2650: merr_raise (ARGLIST);
! 2651: break;
! 2652: }
! 2653:
! 2654: numlit (tmp); /* numeric interpretation */
! 2655:
! 2656: codptr++;
! 2657: expr (STRING);
! 2658:
! 2659: if (merr () != OK) break;
! 2660:
! 2661: numlit (argptr);
! 2662: stcpy (finc, argptr); /* increment */
! 2663:
! 2664: if ((ch = *codptr) != ':') {
! 2665:
! 2666: if (ch == ',' || ch == EOL || ch == SP) {
! 2667: ftyp = 2;
! 2668: goto for_init;
! 2669: }
! 2670:
! 2671: merr_raise (ARGLIST);
! 2672: break;
! 2673:
! 2674: }
! 2675:
! 2676: codptr++;
! 2677:
! 2678: expr (STRING);
! 2679: if (merr () != OK) break;
! 2680:
! 2681: numlit (argptr);
! 2682: stcpy (flim, argptr); /* limit */
! 2683:
! 2684: ftyp = 3;
! 2685:
! 2686: if ((ch = *codptr) != ',' && ch != SP && ch != EOL) {
! 2687: merr_raise (ARGLIST);
! 2688: break;
! 2689: }
! 2690:
! 2691: if ((*finc != '-' && comp (flim, tmp)) || (*finc == '-' && comp (tmp, flim))) {
! 2692:
! 2693: symtab (set_sym, fvar, tmp);
! 2694:
! 2695: if (merr () > OK) {
! 2696: stcpy (varerr, vn);
! 2697: break;
! 2698: }
! 2699:
! 2700: goto for_quit;
! 2701: }
! 2702:
! 2703: for_init:
! 2704:
! 2705: symtab (set_sym, fvar, tmp);
! 2706:
! 2707: if (merr () > OK) {
! 2708: stcpy (varerr, fvar);
! 2709: break;
! 2710: }
! 2711:
! 2712: /* optimize frequent special case: */
! 2713: /* increment by one and no additional FOR arguments */
! 2714: /* if limit value it must be a positive integer */
! 2715: if (ftyp > 1 && finc[0] == '1' && finc[1] == EOL) {
! 2716: j = TRUE;
! 2717:
! 2718: if (ftyp == 3) {
! 2719: i = 0;
! 2720:
! 2721: while ((ch = flim[i]) != EOL) {
! 2722:
! 2723: if (ch < '0' || ch > '9') j = FALSE;
! 2724:
! 2725: i++;
! 2726: }
! 2727:
! 2728: fi = i;
! 2729: fori[forx] = i;
! 2730: }
! 2731:
! 2732: if (j && ((ch = *codptr) == SP || ch == EOL)) {
! 2733: ftyp += 2;
! 2734: if (ch == SP) codptr++;
! 2735: }
! 2736: }
! 2737:
! 2738: for_go:
! 2739:
! 2740: fortyp[forx] = ftyp;
! 2741:
! 2742:
! 2743: #ifdef DEBUG_NEWSTACK
! 2744: if (!cmdptr) printf ("CMDPTR is ZERO!\r\n");
! 2745: #endif
! 2746:
! 2747: nestp[nstx] = cmdptr;
! 2748:
! 2749: cmdptr += stcpy (cmdptr, codptr) + 1;
! 2750:
! 2751: if (ftyp > 3) goto next_cmnd;
! 2752:
! 2753: /* skip following for arguments if there are any */
! 2754:
! 2755: for10:
! 2756:
! 2757: if (*codptr == SP) goto next_cmnd;
! 2758:
! 2759: i = 0;
! 2760:
! 2761: while ((((ch = *codptr) != SP) || i) && ch != EOL) {
! 2762: if (ch == '"') i = !i;
! 2763:
! 2764: codptr++;
! 2765: } /* skip rest of FOR list */
! 2766:
! 2767: goto next_cmnd;
! 2768:
! 2769: for_end: /* end of line return */
! 2770:
! 2771: #ifdef DEBUG_NEWSTACK
! 2772: printf ("For_end: nstx: %d, Nestp: (%d)\r\n", nstx, nestp[nstx]);
! 2773: #endif
! 2774:
! 2775: stcpy (codptr = code, nestp[nstx]); /* restore old pointers */
! 2776:
! 2777:
! 2778:
! 2779: switch (ftyp) {
! 2780:
! 2781: case 5: /* frequent special case: increment 1 */
! 2782: symtab (getinc, fvar, tmp);
! 2783:
! 2784: /* compare fvar-value to flim-value */
! 2785: /* fi: i=0; while (flim[i]>='0') i++; */
! 2786: /* Note: EOL<'-'<'.'<'0' tmp has at least one character */
! 2787: ch = '0';
! 2788: j = 1;
! 2789:
! 2790: while (tmp[j] >= ch) j++;
! 2791:
! 2792: if (j < fi) goto next_cmnd;
! 2793:
! 2794: if (j == fi) {
! 2795: j = 0;
! 2796:
! 2797: while (tmp[j] == flim[j]) {
! 2798: if (tmp[j] == EOL) goto next_cmnd;
! 2799: j++;
! 2800: }
! 2801:
! 2802: if (tmp[j] <= flim[j]) goto next_cmnd;
! 2803: }
! 2804:
! 2805: if (flim[0] != '-' && tmp[0] == '-') goto next_cmnd;
! 2806:
! 2807: stcpy (tmp2, "-1\201"); /* correct last inc */
! 2808: add (tmp, tmp2);
! 2809: symtab (set_sym, fvar, tmp);
! 2810:
! 2811: goto for_quit;
! 2812:
! 2813: case 4: /* frequent special case: increment 1 without limit */
! 2814: symtab (getinc, fvar, tmp);
! 2815:
! 2816:
! 2817: case 0: /* argumentless FOR */
! 2818:
! 2819: if(argless_forsw_quit == TRUE) {
! 2820: /* if we have a positive QUIT condition, bail from the FOR loop */
! 2821: argless_forsw_quit = FALSE;
! 2822: goto for_quit;
! 2823: }
! 2824: else {
! 2825:
! 2826: /* otherwise, just keep on truckin' */
! 2827: goto next_cmnd;
! 2828: }
! 2829:
! 2830: case 3: /* FOR with increment and limit test */
! 2831: symtab (get_sym, fvar, tmp);
! 2832: numlit (tmp);
! 2833: stcpy (tmp2, finc); /* add may change forinc */
! 2834: add (tmp, tmp2);
! 2835:
! 2836: if (*finc != '-') {
! 2837: if (comp (flim, tmp)) goto for_quit;
! 2838: }
! 2839: else {
! 2840: if (comp (tmp, flim)) goto for_quit;
! 2841: }
! 2842:
! 2843: symtab (set_sym, fvar, tmp);
! 2844:
! 2845: goto for10;
! 2846:
! 2847: case 2: /* FOR with increment without limit test */
! 2848: symtab (get_sym, fvar, tmp);
! 2849: numlit (tmp);
! 2850: stcpy (tmp2, finc); /* add may change forinc */
! 2851: add (tmp, tmp2);
! 2852:
! 2853: symtab (set_sym, fvar, tmp);
! 2854: goto for10;
! 2855: } /* end switch */
! 2856:
! 2857: for_quit:
! 2858:
! 2859: cmdptr = nestp[nstx];
! 2860:
! 2861:
! 2862: if (*codptr++ == ',') goto for_nxt_arg;
! 2863:
! 2864: forpost[forx][0] = '\0';
! 2865:
! 2866: nstx--;
! 2867: estack--;
! 2868:
! 2869: forx--;
! 2870: ftyp = fortyp[forx];
! 2871: fvar = forvar[forx];
! 2872: finc = forinc[forx];
! 2873: flim = forlim[forx];
! 2874: fi = fori[forx];
! 2875:
! 2876:
! 2877: if ((forsw = (nestc[nstx] == FOR))) goto for_end;
! 2878:
! 2879: if (sigint_in_for) {
! 2880: merr_raise (INRPT);
! 2881: sigint_in_for = FALSE;
! 2882: }
! 2883:
! 2884: if (merr () > OK) goto err;
! 2885: goto next_line;
! 2886:
! 2887: case MERGE:
! 2888:
! 2889: {
! 2890: char lhs[256];
! 2891: char rhs[256];
! 2892:
! 2893: char k_buf[STRLEN];
! 2894:
! 2895: if ((rtn_dialect () != D_M95) &&
! 2896: (rtn_dialect () != D_MDS) &&
! 2897: (rtn_dialect () != D_M5) &&
! 2898: (rtn_dialect () != D_FREEM)) {
! 2899: merr_raise (NOSTAND);
! 2900: goto err;
! 2901: }
! 2902:
! 2903: expr (NAME);
! 2904: if (merr () > OK) break;
! 2905:
! 2906: key_to_name (lhs, varnam, 255);
! 2907: stcnv_c2m (lhs);
! 2908:
! 2909: if (*++codptr != '=') {
! 2910: merr_raise (ASSIGNER);
! 2911: break;
! 2912: }
! 2913:
! 2914: codptr++;
! 2915:
! 2916: expr (NAME);
! 2917: if (merr () > OK) break;
! 2918:
! 2919: codptr++;
! 2920:
! 2921: key_to_name (rhs, varnam, 255);
! 2922: stcnv_c2m (rhs);
! 2923:
! 2924: stcpy (k_buf, "%INTMERGELHS\201\201");
! 2925: symtab (set_sym, k_buf, lhs);
! 2926:
! 2927: stcpy (k_buf, "%INTMERGERHS\201\201");
! 2928: symtab (set_sym, k_buf, rhs);
! 2929:
! 2930: stcpy (&tmp3[1], "SYSWMERGE \201");
! 2931: goto private;
! 2932:
! 2933: break;
! 2934:
! 2935: }
! 2936:
! 2937:
! 2938: case RLOAD:
! 2939: if ((rtn_dialect () != D_MDS) &&
! 2940: (rtn_dialect () != D_FREEM)) {
! 2941: merr_raise (NOSTAND);
! 2942: goto err;
! 2943: }
! 2944: stcpy (&tmp3[1], "zrload \201");
! 2945: goto private;
! 2946:
! 2947:
! 2948: case RSAVE:
! 2949: if ((rtn_dialect () != D_MDS) &&
! 2950: (rtn_dialect () != D_FREEM)) {
! 2951: merr_raise (NOSTAND);
! 2952: goto err;
! 2953: }
! 2954:
! 2955: stcpy (&tmp3[1], "zrsave \201");
! 2956: goto private;
! 2957:
! 2958:
! 2959: case XECUTE:
! 2960:
! 2961:
! 2962: do_xecute:
! 2963: expr (STRING);
! 2964:
! 2965: if (merr () > OK) break;
! 2966:
! 2967: stcpy (tmp, argptr);
! 2968:
! 2969: if (*codptr == ':') { /* argument postcond */
! 2970: codptr++;
! 2971: expr (STRING);
! 2972:
! 2973: if (merr () > OK) break;
! 2974: if (tvexpr (argptr) == FALSE) break;
! 2975: }
! 2976:
! 2977: if (++nstx > NESTLEVLS) {
! 2978: nstx--;
! 2979: merr_raise (STKOV);
! 2980:
! 2981: break;
! 2982: }
! 2983: else {
! 2984: estack++;
! 2985: }
! 2986:
! 2987:
! 2988: #ifdef DEBUG_NEWSTACK
! 2989: if (!cmdptr) printf ("CMDPTR is ZERO!\r\n");
! 2990: #endif
! 2991:
! 2992: nestc[nstx] = XECUTE;
! 2993: nestp[nstx] = cmdptr; /* command stack address */
! 2994: nestr[nstx] = roucur - rouptr; /* save roucur */
! 2995: nestlt[nstx] = level;
! 2996:
! 2997: level = 0; /* save level */
! 2998: nestnew[nstx] = 0;
! 2999: ztrap[nstx][0] = EOL;
! 3000:
! 3001: while ((*(namptr++)) != EOL);
! 3002:
! 3003: stcpy ((nestn[nstx] = namptr), rou_name); /* save routine name */
! 3004:
! 3005: forsw = FALSE;
! 3006: loadsw = FALSE;
! 3007: cmdptr += stcpy (cmdptr, codptr) + 1;
! 3008:
! 3009: stcpy (code, tmp);
! 3010:
! 3011: roucur = buff + (NO_OF_RBUF * PSIZE0 + 1);
! 3012: codptr = code;
! 3013:
! 3014: goto next_cmnd;
! 3015:
! 3016:
! 3017: case DO:
! 3018:
! 3019: if (evt_async_initial == TRUE) {
! 3020: evt_async_initial = FALSE;
! 3021: }
! 3022: else {
! 3023: evt_depth++;
! 3024: }
! 3025:
! 3026: rouoldc = roucur - rouptr;
! 3027: namold = 0;
! 3028:
! 3029: case GOTO:
! 3030:
! 3031: do_goto:
! 3032:
! 3033: offset = 0;
! 3034: label[0] = routine[0] = EOL;
! 3035: dofram0 = 0;
! 3036:
! 3037: if (((ch = *codptr) != '+') && (ch != '^')) { /* parse label */
! 3038:
! 3039: if (ch == SP || ch == EOL) { /* no args: blockstructured DO */
! 3040:
! 3041: if (mcmnd != DO) {
! 3042: merr_raise (ARGLIST);
! 3043: break;
! 3044: }
! 3045:
! 3046: /* direct mode: DO +1 */
! 3047:
! 3048:
! 3049: if (nstx == 0 && roucur >= rouend) {
! 3050: roucu0 = rouptr;
! 3051: goto off1;
! 3052: }
! 3053:
! 3054: mcmnd = DO_BLOCK;
! 3055: roucu0 = roucur; /* continue with next line */
! 3056: forsw = FALSE;
! 3057:
! 3058: goto off2;
! 3059: }
! 3060:
! 3061: expr (LABEL);
! 3062:
! 3063: if (merr () > OK) goto err;
! 3064:
! 3065: stcpy (label, varnam);
! 3066:
! 3067: ch = *++codptr;
! 3068: }
! 3069:
! 3070: if (ch == '+') { /* parse offset */
! 3071:
! 3072: codptr++;
! 3073: expr (OFFSET);
! 3074:
! 3075: if (merr () > OK) goto err;
! 3076:
! 3077: offset = intexpr (argptr);
! 3078: dosave[0] = EOL;
! 3079:
! 3080: /* unless argument is numeric, expr returns wrong codptr */
! 3081: if ((ch = *codptr) != SP && (ch != EOL) && (ch != ',') && (ch != '^')) ch = *++codptr;
! 3082:
! 3083: }
! 3084:
! 3085: if (ch == '^') { /* parse routine */
! 3086: codptr++;
! 3087: expr (LABEL);
! 3088:
! 3089: if (merr () > OK) goto err;
! 3090:
! 3091: stcpy (routine, varnam);
! 3092:
! 3093: dosave[0] = EOL;
! 3094: ch = *++codptr;
! 3095: loadsw = TRUE;
! 3096: }
! 3097:
! 3098: if (ch == '(' && mcmnd == DO) { /* parse parameter */
! 3099:
! 3100: if (offset) {
! 3101: merr_raise (ARGLIST);
! 3102: goto err;
! 3103: }
! 3104:
! 3105: if (*++codptr == ')') {
! 3106: ch = *++codptr;
! 3107: }
! 3108: else {
! 3109: dofram0 = dofrmptr;
! 3110: i = 0;
! 3111:
! 3112: for (;;) {
! 3113: setpiece = TRUE; /* to avoid error on closing bracket */
! 3114:
! 3115: if (*codptr == '.' && (*(codptr + 1) < '0' || *(codptr + 1) > '9')) {
! 3116: codptr++;
! 3117:
! 3118: expr (NAME);
! 3119: codptr++;
! 3120:
! 3121: *dofrmptr++ = DELIM; /* to indicate call by name */
! 3122: dofrmptr += stcpy (dofrmptr, varnam) + 1;
! 3123: }
! 3124: else {
! 3125: expr (STRING);
! 3126: dofrmptr += stcpy (dofrmptr, argptr) + 1;
! 3127: }
! 3128:
! 3129: setpiece = FALSE;
! 3130: i++;
! 3131:
! 3132: if (merr () > OK) {
! 3133: dofrmptr = dofram0;
! 3134: goto err;
! 3135: }
! 3136:
! 3137: ch = *codptr++;
! 3138: if (ch == ',') continue;
! 3139:
! 3140: if (ch != ')') {
! 3141: merr_raise (COMMAER);
! 3142: dofrmptr = dofram0;
! 3143:
! 3144: goto err;
! 3145: }
! 3146:
! 3147: ch = *codptr;
! 3148: break;
! 3149: }
! 3150: }
! 3151: }
! 3152:
! 3153: if (ch == ':') { /* parse postcond */
! 3154:
! 3155: codptr++;
! 3156: expr (STRING);
! 3157:
! 3158: if (merr () > OK) {
! 3159: if (dofram0) dofrmptr = dofram0; /* reset frame pointer */
! 3160: goto err;
! 3161: }
! 3162:
! 3163: if (tvexpr (argptr) == FALSE) {
! 3164: if (*codptr != ',') mcmnd = 0; /* avoid false LEVEL Error */
! 3165: if (dofram0) dofrmptr = dofram0; /* reset frame pointer */
! 3166:
! 3167: break;
! 3168: }
! 3169: }
! 3170:
! 3171: if (mcmnd == GOTO) { /* GOTO: clear FORs from stack */
! 3172:
! 3173: #ifdef DEBUG_NEWSTACK
! 3174: printf ("CHECK 05 Multi-POP on FOR\r\n");
! 3175: #endif
! 3176:
! 3177:
! 3178:
! 3179: while (nestc[nstx] == FOR) {
! 3180:
! 3181: #ifdef DEBUG_NEWSTACK
! 3182: printf ("POP");
! 3183: #endif
! 3184:
! 3185: cmdptr = nestp[nstx--];
! 3186: estack--;
! 3187:
! 3188: forx--;
! 3189: ftyp = fortyp[forx];
! 3190: fvar = forvar[forx];
! 3191: finc = forinc[forx];
! 3192: flim = forlim[forx];
! 3193: fi = fori[forx];
! 3194: }
! 3195:
! 3196: #ifdef DEBUG_NEWSTACK
! 3197: printf ("\r\n");
! 3198: #endif
! 3199:
! 3200:
! 3201: loadsw = TRUE;
! 3202: }
! 3203:
! 3204: job_entry: /* entry called from successful JOB */
! 3205:
! 3206: if (routine[0] != EOL) {
! 3207:
! 3208: #ifdef DEBUG_NEWSTACK
! 3209: printf ("CHECK 06\r\n");
! 3210: #endif
! 3211:
! 3212: if (mcmnd == DO) {
! 3213:
! 3214: while ((*(namptr++)) != EOL);
! 3215:
! 3216: namold = namptr;
! 3217: stcpy (namptr, rou_name);
! 3218:
! 3219: ssvn_job_update ();
! 3220:
! 3221: }
! 3222:
! 3223: /* if (GOTO label^rou) under a (DO label) */
! 3224: /* save away old routine to restore on quit */
! 3225:
! 3226:
! 3227:
! 3228: else if (nstx > 0) {
! 3229:
! 3230: #ifdef DEBUG_NEWSTACK
! 3231: printf ("CHECK 06, stack is greater than 0\r\n");
! 3232: #endif
! 3233:
! 3234: while (nestc[nstx] == FOR) {
! 3235: #ifdef DEBUG_NEWSTACK
! 3236: printf ("POP");
! 3237: #endif
! 3238:
! 3239: nstx--;
! 3240: estack--;
! 3241: forx--;
! 3242: ftyp = fortyp[forx];
! 3243: fvar = forvar[forx];
! 3244: finc = forinc[forx];
! 3245: flim = forlim[forx];
! 3246: fi = fori[forx];
! 3247: }
! 3248:
! 3249: if (nestn[nstx] == 0) {
! 3250: while ((*(namptr++)) != EOL);
! 3251:
! 3252: stcpy ((nestn[nstx] = namptr), rou_name);
! 3253: }
! 3254: }
! 3255:
! 3256: zload (routine);
! 3257: if (merr () > OK) goto err; /* load file */
! 3258:
! 3259: ssvn_job_update ();
! 3260:
! 3261: } /* if (routine[0] != EOL) */
! 3262: {
! 3263: char *reg, *reg1;
! 3264:
! 3265: reg1 = rouptr;
! 3266: reg = reg1;
! 3267:
! 3268: if (label[0] != EOL) {
! 3269:
! 3270: if (forsw && mcmnd == DO && stcmp (label, dosave) == 0) {
! 3271: roucu0 = xdosave;
! 3272: goto off1;
! 3273: }
! 3274:
! 3275: while (reg < rouend) {
! 3276: reg++;
! 3277: j = 0;
! 3278:
! 3279: while (*reg == label[j]) {
! 3280: reg++;
! 3281: j++;
! 3282: }
! 3283:
! 3284: if (label[j] == EOL) {
! 3285:
! 3286: if (*reg == TAB || *reg == SP) goto off;
! 3287:
! 3288: /* call of procedure without specifying a parameter list */
! 3289: if (*reg == '(') {
! 3290: if (dofram0 == 0) dofram0 = dofrmptr;
! 3291: goto off;
! 3292: }
! 3293:
! 3294: }
! 3295:
! 3296: reg = (reg1 = reg1 + UNSIGN (*reg1) + 2);
! 3297: }
! 3298: {
! 3299: merr_raise (M13);
! 3300: stcpy (varerr, label); /* to be included in error message */
! 3301:
! 3302: if (dofram0) dofrmptr = dofram0; /* reset frame pointer */
! 3303:
! 3304: zload (rou_name);
! 3305: ssvn_job_update ();
! 3306: goto err;
! 3307: }
! 3308: }
! 3309: off:
! 3310: if (label[0] == EOL && offset > 0) offset--;
! 3311: while (offset-- > 0) reg1 = reg1 + (UNSIGN (*reg1) + 2);
! 3312:
! 3313: if (forsw) {
! 3314: xdosave = reg1;
! 3315: stcpy (dosave, label);
! 3316: }
! 3317:
! 3318: roucu0 = reg1;
! 3319: }
! 3320:
! 3321: if (roucu0 >= rouend) {
! 3322: merr_raise (M13);
! 3323: stcpy (varerr, label); /* to be included in error message */
! 3324:
! 3325: if (dofram0) dofrmptr = dofram0; /* reset frame pointer */
! 3326:
! 3327: zload (rou_name);
! 3328: ssvn_job_update ();
! 3329: goto err;
! 3330: }
! 3331:
! 3332: off1:
! 3333: if (routine[0] != EOL) stcpy (rou_name, routine);
! 3334:
! 3335: ssvn_job_update ();
! 3336:
! 3337: roucu0++;
! 3338: forsw = FALSE;
! 3339:
! 3340: if (mcmnd != DO) { /* i.e. GOTO or JOB */
! 3341: roucur = roucu0;
! 3342: goto off3;
! 3343: }
! 3344:
! 3345: off2:
! 3346:
! 3347: #ifdef DEBUG_NEWSTACK
! 3348: printf ("CHECK 07 (Stack PUSH)\r\n");
! 3349: #endif
! 3350:
! 3351:
! 3352:
! 3353: if (++nstx > NESTLEVLS) {
! 3354: nstx--;
! 3355: merr_raise (STKOV);
! 3356:
! 3357: goto err;
! 3358: }
! 3359: else {
! 3360: on_frame_entry ();
! 3361: estack++;
! 3362: }
! 3363:
! 3364: nestc[nstx] = mcmnd;
! 3365:
! 3366: #ifdef DEBUG_NEWSTACK
! 3367: if (!cmdptr) printf ("CMDPTR is ZERO!\r\n");
! 3368: #endif
! 3369:
! 3370: nestp[nstx] = cmdptr;
! 3371: nestn[nstx] = namold;
! 3372: nestr[nstx] = rouoldc;
! 3373: nestnew[nstx] = 0;
! 3374:
! 3375: if (mcmnd != DO_BLOCK) {
! 3376: nestlt[nstx] = level;
! 3377: level = 0;
! 3378: }
! 3379: else { /* push level ; clr level */
! 3380: nestlt[nstx] = test;
! 3381: level++;
! 3382: } /* push $TEST ; inc level */
! 3383:
! 3384: ztrap[nstx][0] = EOL;
! 3385:
! 3386:
! 3387: cmdptr += stcpy (cmdptr, codptr) + 1;
! 3388: roucur = roucu0;
! 3389:
! 3390: /* processing for private Z-Command: */
! 3391: if (privflag) {
! 3392:
! 3393:
! 3394:
! 3395: #ifdef DEBUG_NEWPTR
! 3396: printf ("Xecline 01 (using NEWPTR): ");
! 3397: printf ("[nstx] is [%d], [nestnew] is [%d]", nstx, nestnew[nstx]);
! 3398: printf ("- Initialized to newptr\r\n");
! 3399: #endif /* Debug */
! 3400:
! 3401: nestnew[nstx] = newptr;
! 3402:
! 3403:
! 3404: stcpy (vn, zargdefname);
! 3405:
! 3406: /*was: vn[0] = '%'; vn[1] = EOL; */
! 3407:
! 3408: symtab (new_sym, vn, "");
! 3409: /*djw change 'input variable for Z command' to get value of $V(202) */
! 3410: /*was: vn[0] = '%'; vn[1] = EOL; */
! 3411:
! 3412: stcpy (vn, zargdefname);
! 3413: symtab (set_sym, vn, tmp2);
! 3414:
! 3415: privflag = FALSE;
! 3416: }
! 3417:
! 3418: off3:
! 3419:
! 3420: if (dofram0) {
! 3421: char *reg, *reg1;
! 3422:
! 3423: reg = roucu0;
! 3424: reg1 = dofram0;
! 3425:
! 3426: while ((ch = (*reg++)) != '(') {
! 3427: if (ch == SP || ch == TAB || ch == EOL) break;
! 3428: }
! 3429:
! 3430: if (ch != '(') {
! 3431: merr_raise (TOOPARA);
! 3432: dofrmptr = dofram0;
! 3433:
! 3434: goto err;
! 3435: }
! 3436:
! 3437: j = 0;
! 3438:
! 3439: while ((ch = (*reg++)) != EOL) {
! 3440:
! 3441: if ((ch == ',' && j) || ch == ')') {
! 3442: varnam[j] = EOL;
! 3443:
! 3444:
! 3445:
! 3446: #ifdef DEBUG_NEWPTR
! 3447: printf ("Xecline 02: ");
! 3448: printf ("[nstx] is [%d], [nestnew] is [%d]\r\n", nstx, nestnew[nstx]);
! 3449: #endif
! 3450:
! 3451: if (nestnew[nstx] == 0) nestnew[nstx] = newptr;
! 3452:
! 3453:
! 3454:
! 3455: if (reg1 < dofrmptr) {
! 3456:
! 3457: if (*reg1 == DELIM) { /* call by reference */
! 3458:
! 3459: if (stcmp (reg1 + 1, varnam)) { /* are they different?? */
! 3460: symtab (new_sym, varnam, "");
! 3461: symtab (m_alias, varnam, reg1 + 1);
! 3462: }
! 3463:
! 3464: }
! 3465: else {
! 3466: symtab (new_sym, varnam, ""); /* call by value */
! 3467: symtab (set_sym, varnam, reg1);
! 3468: }
! 3469:
! 3470: reg1 += stlen (reg1) + 1;
! 3471: }
! 3472: else {
! 3473: symtab (new_sym, varnam, "");
! 3474: }
! 3475:
! 3476: if (ch == ')') break;
! 3477:
! 3478: j = 0;
! 3479: continue;
! 3480: }
! 3481:
! 3482: if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9' && j) || (ch == '%' && j == 0)) {
! 3483: varnam[j++] = ch;
! 3484: continue;
! 3485: }
! 3486:
! 3487: merr_raise (ARGLIST);
! 3488: dofrmptr = dofram0; /* reset frame pointer */
! 3489:
! 3490: goto err;
! 3491: }
! 3492:
! 3493: if (reg1 < dofrmptr) {
! 3494: merr_raise (TOOPARA);
! 3495: dofrmptr = dofram0;
! 3496:
! 3497: goto err;
! 3498: }
! 3499:
! 3500: dofrmptr = dofram0;
! 3501: }
! 3502:
! 3503: goto next_line;
! 3504:
! 3505: /* ZJOB *//* same as JOB, but without timeout */
! 3506: /* not recommended; just for backward compatibility */
! 3507: case ZJOB:
! 3508: if (is_standard ()) {
! 3509: merr_raise (NOSTAND);
! 3510: goto err;
! 3511: }
! 3512:
! 3513: case JOB:
! 3514:
! 3515: if (rtn_dialect () == D_M77) {
! 3516: merr_raise (NOSTAND);
! 3517: goto err;
! 3518: }
! 3519:
! 3520: if (*codptr == SP || *codptr == EOL) {
! 3521: merr_raise (M13);
! 3522: varerr[0] = EOL; /* to be included in error message */
! 3523:
! 3524: break;
! 3525: }
! 3526:
! 3527: loadsw = TRUE;
! 3528: offset = 0;
! 3529: frm_timeout = (-1L);
! 3530: label[0] = routine[0] = EOL;
! 3531:
! 3532: if (((ch = *codptr) != '+') && (ch != '^')) { /* parse label */
! 3533: expr (LABEL);
! 3534: if (merr () > OK) goto err;
! 3535:
! 3536: stcpy (label, varnam);
! 3537:
! 3538: ch = *++codptr;
! 3539: }
! 3540:
! 3541: if (ch == '+') { /* parse offset */
! 3542: codptr++;
! 3543:
! 3544: expr (OFFSET);
! 3545: if (merr () > OK) goto err;
! 3546:
! 3547: offset = intexpr (argptr);
! 3548:
! 3549: /* unless argument is numeric, expr returns wrong codptr */
! 3550: if ((ch = *codptr) != SP && (ch != EOL) && (ch != ',') && (ch != '^')) ch = *++codptr;
! 3551:
! 3552: }
! 3553:
! 3554: if (ch == '^') { /* parse routine */
! 3555: codptr++;
! 3556:
! 3557: expr (LABEL);
! 3558: if (merr () > OK) goto err;
! 3559:
! 3560: stcpy (routine, varnam);
! 3561:
! 3562: dosave[0] = EOL;
! 3563: ch = *++codptr;
! 3564: }
! 3565:
! 3566: dofram0 = NULL;
! 3567: if (ch == '(') { /* parse parameter */
! 3568:
! 3569: if (offset) {
! 3570: merr_raise (ARGLIST);
! 3571: goto err;
! 3572: }
! 3573:
! 3574: codptr++;
! 3575: dofram0 = dofrmptr;
! 3576:
! 3577: i = 0;
! 3578: for (;;) {
! 3579: setpiece = TRUE; /* to avoid error on closing bracket */
! 3580:
! 3581: if (*codptr == '.' && (*(codptr + 1) < '0' || *(codptr + 1) > '9')) {
! 3582: codptr++;
! 3583:
! 3584: expr (NAME);
! 3585:
! 3586: codptr++;
! 3587:
! 3588: *dofrmptr++ = DELIM; /* to indicate call by name */
! 3589: dofrmptr += stcpy (dofrmptr, varnam) + 1;
! 3590: }
! 3591: else {
! 3592: expr (STRING);
! 3593: dofrmptr += stcpy (dofrmptr, argptr) + 1;
! 3594: }
! 3595:
! 3596: setpiece = FALSE;
! 3597: i++;
! 3598:
! 3599: if (merr () > OK) {
! 3600: dofrmptr = dofram0;
! 3601: goto err;
! 3602: }
! 3603:
! 3604: ch = *codptr++;
! 3605: if (ch == ',') continue;
! 3606:
! 3607: if (ch != ')') {
! 3608: merr_raise (COMMAER);
! 3609: dofrmptr = dofram0;
! 3610:
! 3611: goto err;
! 3612: }
! 3613:
! 3614: ch = *codptr;
! 3615: break;
! 3616: }
! 3617: }
! 3618:
! 3619: if (ch == ':' && *(codptr + 1) == ch) {
! 3620: codptr++; /* timeout,no jobparams */
! 3621: }
! 3622: else if (ch == ':' && *(codptr + 1) == '(') { /* parse any 'job parameters', but ignore them otherwise */
! 3623: codptr++;
! 3624: setpiece = TRUE; /* to avoid bracket error at end of jobparameters */
! 3625:
! 3626: for (;;) {
! 3627: if (*++codptr != ':') expr (STRING);
! 3628: if (*codptr == ':') continue;
! 3629: if (*codptr++ != ')') merr_raise (ARGER);
! 3630:
! 3631: break;
! 3632: }
! 3633:
! 3634: setpiece = FALSE;
! 3635: ch = (*codptr);
! 3636: }
! 3637:
! 3638: if (ch == ':') { /* timeout */
! 3639: codptr++;
! 3640: expr (STRING);
! 3641:
! 3642: if ((frm_timeout = intexpr (argptr)) < 0L) frm_timeout = 0L;
! 3643: if (merr () > OK) goto err;
! 3644:
! 3645: test = TRUE;
! 3646: }
! 3647:
! 3648: if (mcmnd == ZJOB) frm_timeout = 0L; /* ZJOB-command has timeout 0 */
! 3649:
! 3650: close_all_globals (); /* close all globals */
! 3651: j = getpid (); /* job number of father process */
! 3652:
! 3653: if (lonelyflag) { /* single user */
! 3654: if (frm_timeout < 0L) {
! 3655: merr_raise (PROTECT); /* error without timeout */
! 3656: }
! 3657: else {
! 3658: test = FALSE; /* timeout always fails */
! 3659: }
! 3660:
! 3661: break;
! 3662: }
! 3663:
! 3664: while ((i = fork ()) == -1) {
! 3665:
! 3666: if (frm_timeout == 0L) {
! 3667: test = FALSE;
! 3668: break;
! 3669: }
! 3670:
! 3671: if (frm_timeout > 0L) frm_timeout--;
! 3672:
! 3673: sleep (1);
! 3674:
! 3675: }
! 3676:
! 3677: if (mcmnd == ZJOB && zjobflag) {
! 3678:
! 3679: if (i == 0) { /* we are in child process */
! 3680: intstr (zb, j); /* $JOB of father job */
! 3681:
! 3682: father = j;
! 3683: pid = getpid (); /* this is our new job number */
! 3684:
! 3685: jobtime = time (0L);;
! 3686:
! 3687:
! 3688: nstx = 0; /* clear stack */
! 3689: estack = 0;
! 3690:
! 3691: forx = 0;
! 3692: forsw = FALSE;
! 3693: level = 0;
! 3694: cmdptr = cmdstack; /* - command stack pointer */
! 3695: namptr = namstck; /* - routine name stack pointer */
! 3696: usermode = 0; /* application mode */
! 3697: merr_clear ();
! 3698:
! 3699: lock (" \201", -1, 'j'); /* tell lock about JOB */
! 3700: goto job_entry;
! 3701: }
! 3702:
! 3703: /* ignore signal while here */
! 3704: sig_attach (SIGUSR1, SIG_IGN);
! 3705:
! 3706: while (wait (&zsystem) != i);
! 3707:
! 3708: sig_attach (SIGUSR1, &oncld); /* restore handler */
! 3709:
! 3710: merr_clear (); /* there might be a INRPT from other job */
! 3711:
! 3712: set_io (MUMPS);
! 3713: break;
! 3714: }
! 3715:
! 3716: if (i == 0) { /* we are in child process */
! 3717:
! 3718: intstr (zb, j); /* $JOB of father job */
! 3719: father = j;
! 3720:
! 3721: pid = getpid (); /* $J = process ID */
! 3722: usermode = 0; /* no programmer mode */
! 3723: DSW |= BIT0; /* disable echo */
! 3724: zbreakon = DISABLE; /* disable CTRL/B */
! 3725: breakon = DISABLE; /* disable CTRL/C */
! 3726: hardcopy = DISABLE; /* disable hardcopy function */
! 3727:
! 3728: fclose (stdin); /* close normal input */
! 3729:
! 3730: jour_flag = 0; /* no protocol */
! 3731:
! 3732:
! 3733: nstx = 0; /* clear stack */
! 3734: estack = 0;
! 3735:
! 3736: forx = 0;
! 3737: forsw = FALSE;
! 3738: level = 0;
! 3739:
! 3740: cmdptr = cmdstack; /* - command stack pointer */
! 3741: namptr = namstck; /* - routine name stack pointer */
! 3742:
! 3743: /* init random number */
! 3744: if ((nrandom = time (0L) * getpid ()) < 0) nrandom = (-nrandom);
! 3745:
! 3746: merr_clear ();
! 3747: lock (" \201", -1, 'j'); /* tell lock about JOB */
! 3748:
! 3749: goto job_entry;
! 3750: }
! 3751:
! 3752: intstr (zb, i); /* $JOB of the process just started */
! 3753: break;
! 3754:
! 3755: case KILL:
! 3756:
! 3757: /* argumentless: KILL all local variables */
! 3758: if (((ch = *codptr) == SP) || ch == EOL) {
! 3759: symtab (kill_all, "", "");
! 3760: break;
! 3761: }
! 3762:
! 3763: if (ch != '(') {
! 3764: char destc[255];
! 3765: register int cd;
! 3766:
! 3767: destc[0] = '\0';
! 3768:
! 3769: expr (NAME);
! 3770:
! 3771: /* aviod a disaster if someone types KILL ^PATDAT[TEST] ! */
! 3772: if (((ch = *++codptr) != SP) && ch != EOL && ch != ',') merr_raise (INVREF);
! 3773: if (merr () > OK) goto err;
! 3774:
! 3775: if (varnam[0] == '^') {
! 3776: if (varnam[1] != '$') {
! 3777: global (kill_sym, varnam, tmp);
! 3778: }
! 3779: else {
! 3780: ssvn (kill_sym, varnam, tmp);
! 3781: }
! 3782: break;
! 3783: }
! 3784:
! 3785: symtab (kill_sym, varnam, tmp);
! 3786:
! 3787: if (destructor_ct) {
! 3788:
! 3789: for (cd = 0; cd < destructor_ct; cd++) {
! 3790: strcat (destc, destructors[cd]);
! 3791: strcat (destc, ",");
! 3792: }
! 3793:
! 3794: destructor_ct = 0;
! 3795: destc[strlen(destc) - 1] = '\201';
! 3796:
! 3797: stcpy (&tmp3[1], destc);
! 3798: destructor_run = TRUE;
! 3799:
! 3800: goto private;
! 3801: }
! 3802:
! 3803:
! 3804: break;
! 3805: }
! 3806:
! 3807: /* exclusive kill */
! 3808: tmp[0] = SP;
! 3809: tmp[1] = EOL;
! 3810:
! 3811: for (;;) {
! 3812:
! 3813: codptr++;
! 3814: expr (NAME);
! 3815:
! 3816: if (merr () > OK) goto err;
! 3817:
! 3818: if (varnam[0] == '^') {
! 3819: merr_raise (GLOBER);
! 3820: goto err;
! 3821: }
! 3822:
! 3823: i = 0;
! 3824: while (varnam[i] != EOL) {
! 3825:
! 3826: if (varnam[i] == DELIM) {
! 3827: merr_raise (SBSCR);
! 3828: goto err;
! 3829: }
! 3830:
! 3831: i++;
! 3832: }
! 3833:
! 3834: if (stcat (tmp, varnam) == 0) {
! 3835: merr_raise (M75);
! 3836: goto err;
! 3837: }
! 3838:
! 3839: if (stcat (tmp, " \201") == 0) {
! 3840: merr_raise (M75);
! 3841: goto err;
! 3842: }
! 3843:
! 3844: if ((ch = *++codptr) == ')') {
! 3845: codptr++;
! 3846: break;
! 3847: }
! 3848:
! 3849: if (ch != ',') {
! 3850: merr_raise (COMMAER);
! 3851: goto err;
! 3852: }
! 3853: }
! 3854:
! 3855: symtab (killexcl, tmp, "");
! 3856: break;
! 3857:
! 3858: case NEWCMD:
! 3859: if ((rtn_dialect () == D_M77) ||
! 3860: (rtn_dialect () == D_M84)) {
! 3861: merr_raise (NOSTAND);
! 3862: goto err;
! 3863: }
! 3864: /*case ZNEW:*/
! 3865:
! 3866: /* argumentless: NEW all local variables */
! 3867: if (((ch = *codptr) == SP) || ch == EOL) {
! 3868: ch = nstx;
! 3869:
! 3870: while (nestc[ch] == FOR) ch--; /* FOR does not define a NEW level */
! 3871:
! 3872: #ifdef DEBUG_NEWPTR
! 3873: printf ("Xecline 03: (TODO - NEW ALL) ");
! 3874: printf ("[ch] is %d, [nestnew] is %d\r\n", ch, nestnew[ch]);
! 3875: #endif
! 3876:
! 3877: if (nestnew[ch] == 0) nestnew[ch] = newptr;
! 3878:
! 3879: symtab (new_all, "", "");
! 3880: break;
! 3881: }
! 3882:
! 3883: if (ch != '(') {
! 3884: expr (NAME);
! 3885:
! 3886: if (merr () > OK) goto err;
! 3887:
! 3888: codptr++;
! 3889:
! 3890: if (varnam[0] == '^') {
! 3891: merr_raise (GLOBER);
! 3892: goto err;
! 3893: }
! 3894:
! 3895: if (varnam[0] == '$') {
! 3896: i = 0;
! 3897:
! 3898: while ((ch = varnam[++i]) != EOL) if (ch >= 'A' && ch <= 'Z') varnam[i] = ch + 32;
! 3899:
! 3900: /* set $reference */
! 3901: if ((stcmp (&varnam[1], "r\201")) && (stcmp (&varnam[1], "reference\201")) && (stcmp (&varnam[1], "zr\201")) && (stcmp (&varnam[1], "zreference\201")) &&
! 3902: (stcmp (&varnam[1], "t\201")) && (stcmp (&varnam[1], "test\201")) && (stcmp (&varnam[1], "j\201")) && (stcmp (&varnam[1], "job\201")) &&
! 3903: (stcmp (&varnam[1], "zi\201")) && (stcmp (&varnam[1], "zinrpt\201")) && (stcmp (&varnam[1], "et\201")) && (stcmp (&varnam[1], "etrap\201")) &&
! 3904: (stcmp (&varnam[1], "es\201")) && (stcmp (&varnam[1], "estack\201"))) {
! 3905: merr_raise (INVREF);
! 3906: goto err;
! 3907: }
! 3908: }
! 3909:
! 3910: /* new and set, new object */
! 3911: if (*codptr == '=') {
! 3912:
! 3913: if ((rtn_dialect () != D_FREEM)) {
! 3914: merr_raise (NOSTAND);
! 3915: goto err;
! 3916: }
! 3917:
! 3918: codptr++;
! 3919: stcpy (vn, varnam);
! 3920:
! 3921: if (*codptr != '$') {
! 3922: /* this is a new-and-set */
! 3923: expr (STRING);
! 3924: new_and_set = TRUE;
! 3925: }
! 3926: else {
! 3927: if ((*codptr == '$') &&
! 3928: (*(codptr + 1) == '#') &&
! 3929: (*(codptr + 2) == '^')) {
! 3930:
! 3931: char class[255];
! 3932: char constructor[255];
! 3933: char objvar[255];
! 3934: char datres[5];
! 3935: int dat_res;
! 3936:
! 3937: stcpy (objvar, vn);
! 3938:
! 3939: symtab (dat, objvar, datres);
! 3940: dat_res = atoi (datres);
! 3941:
! 3942: if (dat_res > 0) {
! 3943: merr_raise (OBJCONFLICT);
! 3944: goto err;
! 3945: }
! 3946:
! 3947: stcnv_m2c (objvar);
! 3948:
! 3949: codptr += 2;
! 3950:
! 3951: /* this is probably an object instantiation */
! 3952: expr (NAME);
! 3953: if (merr () > OK) goto err;
! 3954:
! 3955: stcpy (class, varnam);
! 3956: stcnv_m2c (class);
! 3957: new_object = TRUE;
! 3958: codptr++;
! 3959:
! 3960: obj_get_constructor (constructor, class, objvar);
! 3961:
! 3962: for (dat_res = 0; dat_res < strlen (class); dat_res++) {
! 3963: if (class[dat_res] == '\202') {
! 3964: class[dat_res] = '\0';
! 3965: break;
! 3966: }
! 3967: }
! 3968:
! 3969: obj_create_symbols (objvar, class);
! 3970:
! 3971: if (merr () > OK) goto err;
! 3972:
! 3973: snprintf (&tmp3[1], 255, "%s\201", &constructor[1]);
! 3974: goto private;
! 3975:
! 3976: }
! 3977: else {
! 3978: if (*codptr == '$') {
! 3979: expr (STRING);
! 3980: new_and_set = TRUE;
! 3981: }
! 3982: else {
! 3983: merr_raise (ILLFUN);
! 3984: goto err;
! 3985: }
! 3986: }
! 3987: }
! 3988:
! 3989:
! 3990: goto set2;
! 3991: }
! 3992:
! 3993: post_new:
! 3994:
! 3995: ch = nstx;
! 3996:
! 3997: while (nestc[ch] == FOR) ch--; /* FOR does not define a NEW level */
! 3998:
! 3999: #ifdef DEBUG_NEWPTR
! 4000: printf ("Xecline 04 (DANGER): ");
! 4001: printf ("[ch] is %d, [nestnew] is %d\r\n", ch, nestnew[ch]);
! 4002: #endif
! 4003:
! 4004: if (nestnew[ch] == 0) nestnew[ch] = newptr;
! 4005:
! 4006: symtab (new_sym, varnam, "");
! 4007: break;
! 4008: }
! 4009:
! 4010: /* exclusive new */
! 4011: tmp[0] = SP;
! 4012: tmp[1] = EOL;
! 4013:
! 4014: for (;;) {
! 4015: codptr++;
! 4016: expr (NAME);
! 4017:
! 4018: if (merr () > OK) goto err;
! 4019:
! 4020: if (varnam[0] == '^') {
! 4021: merr_raise (GLOBER);
! 4022: goto err;
! 4023: }
! 4024:
! 4025: if (varnam[0] == '$') {
! 4026: merr_raise (INVREF);
! 4027: goto err;
! 4028: }
! 4029:
! 4030: i = 0;
! 4031: while (varnam[i] != EOL) {
! 4032:
! 4033: if (varnam[i] == DELIM) {
! 4034: merr_raise (SBSCR);
! 4035: goto err;
! 4036: }
! 4037:
! 4038: i++;
! 4039: }
! 4040:
! 4041: if (stcat (tmp, varnam) == 0) {
! 4042: merr_raise (M75);
! 4043: goto err;
! 4044: }
! 4045:
! 4046: if (stcat (tmp, " \201") == 0) {
! 4047: merr_raise (M75);
! 4048: goto err;
! 4049: }
! 4050:
! 4051: if ((ch = *++codptr) == ')') {
! 4052: codptr++;
! 4053: break;
! 4054: }
! 4055:
! 4056: if (ch != ',') {
! 4057: merr_raise (COMMAER);
! 4058: goto err;
! 4059: }
! 4060: }
! 4061:
! 4062: ch = nstx;
! 4063: while (nestc[ch] == FOR) ch--; /* FOR does not define a NEW level */
! 4064:
! 4065: #ifdef DEBUG_NEWPTR
! 4066: printf ("Xecline 05 (TODO): ");
! 4067: printf ("[ch] is %d, [nestnew] is %d\r\n", ch, nestnew[ch]);
! 4068: #endif
! 4069:
! 4070: if (nestnew[ch] == 0) nestnew[ch] = newptr;
! 4071:
! 4072: symtab (newexcl, tmp, "");
! 4073: break;
! 4074:
! 4075: case LOCK:
! 4076:
! 4077: /* argumentless: UNLOCK */
! 4078: if ((ch = *codptr) == SP || ch == EOL) {
! 4079: locktab_unlock_all ();
! 4080: break;
! 4081: }
! 4082:
! 4083: if (ch == '+' || ch == '-') {
! 4084:
! 4085: if ((rtn_dialect () == D_M77) ||
! 4086: (rtn_dialect () == D_M84)) {
! 4087: merr_raise (NOSTAND);
! 4088: goto err;
! 4089: }
! 4090:
! 4091: tmp[0] = ch;
! 4092: ch = (*++codptr);
! 4093: }
! 4094: else {
! 4095: tmp[0] = SP;
! 4096: }
! 4097:
! 4098: if (ch != '(') {
! 4099: expr (NAME);
! 4100:
! 4101: if (merr () > OK) goto err;
! 4102:
! 4103: stcpy (&tmp[1], varnam);
! 4104: stcat (tmp, "\001\201");
! 4105: }
! 4106: else { /* multiple lock */
! 4107: tmp[1] = EOL;
! 4108:
! 4109: for (;;) {
! 4110: codptr++;
! 4111: expr (NAME);
! 4112:
! 4113: if (merr () > OK) goto err;
! 4114:
! 4115: stcat (tmp, varnam);
! 4116: stcat (tmp, "\001\201");
! 4117:
! 4118: if ((ch = *++codptr) == ')') break;
! 4119:
! 4120: if (ch != ',') {
! 4121: merr_raise (COMMAER);
! 4122: goto err;
! 4123: }
! 4124: }
! 4125:
! 4126: }
! 4127:
! 4128: frm_timeout = (-1L); /* no timeout */
! 4129:
! 4130: if (*++codptr == ':') {
! 4131: codptr++;
! 4132: expr (STRING);
! 4133:
! 4134: frm_timeout = intexpr (argptr);
! 4135:
! 4136: if (merr () > OK) goto err;
! 4137: if (frm_timeout < 0L) frm_timeout = 0L;
! 4138: }
! 4139:
! 4140: lock (tmp, frm_timeout, LOCK);
! 4141: break;
! 4142:
! 4143: case USE:
! 4144:
! 4145: if (*codptr == SP || *codptr == EOL) {
! 4146: merr_raise (ARGER);
! 4147: goto err;
! 4148: }
! 4149:
! 4150: expr (STRING);
! 4151: j = intexpr (argptr);
! 4152:
! 4153: if (j > MAXSEQ && j < MAXDEV) {
! 4154: io = j;
! 4155: goto use_socket;
! 4156: }
! 4157:
! 4158: if (j < 0 || j > MAXDEV) {
! 4159: merr_raise (NODEVICE);
! 4160: }
! 4161: else if (j != HOME && devopen[j] == 0) {
! 4162: merr_raise (NOPEN);
! 4163: }
! 4164:
! 4165: if (merr () > OK) goto err;
! 4166:
! 4167: io = j;
! 4168:
! 4169: if (io == HOME && *codptr == ':' && *(codptr + 1) == '(') {
! 4170:
! 4171: use0: /* entry point for processing of device parameters */
! 4172:
! 4173: codptr += 2;
! 4174: j = 1;
! 4175: setpiece = TRUE; /* so a surplus closing bracket will not be an error */
! 4176:
! 4177: while (*codptr != ')') {
! 4178:
! 4179: if (*codptr == ':') {
! 4180: codptr++;
! 4181: j++;
! 4182:
! 4183: continue;
! 4184: }
! 4185:
! 4186: expr (STRING);
! 4187:
! 4188: if (merr () > OK) {
! 4189: setpiece = FALSE;
! 4190: goto err;
! 4191: }
! 4192:
! 4193: switch (j) {
! 4194:
! 4195: case 1:
! 4196: i = intexpr (argptr);
! 4197:
! 4198: if (i < 0) i = 0;
! 4199: if (i > 255) i = 255;
! 4200:
! 4201: RightMargin = i;
! 4202: break;
! 4203:
! 4204: case 3:
! 4205: i = intexpr (argptr);
! 4206:
! 4207: if (i < 0) i = 0;
! 4208: if (i > 255) i = 255;
! 4209:
! 4210: InFieldLen = i;
! 4211: break;
! 4212:
! 4213: case 5:
! 4214: DSW = intexpr (argptr);
! 4215: break;
! 4216:
! 4217: case 7:
! 4218: i = intexpr (argptr);
! 4219: ypos[HOME] = i / 256;
! 4220: xpos[HOME] = i % 256;
! 4221:
! 4222: if (DSW & BIT7) {
! 4223:
! 4224: i = io;
! 4225: io = HOME;
! 4226: argptr[0] = ESC;
! 4227: argptr[1] = '[';
! 4228: argptr[2] = EOL;
! 4229:
! 4230: if (ypos[HOME]) {
! 4231: intstr (&argptr[2], ypos[HOME] + 1);
! 4232: }
! 4233:
! 4234: if (xpos[HOME]) {
! 4235: tmp3[0] = ';';
! 4236:
! 4237: intstr (&tmp3[1], xpos[HOME] + 1);
! 4238: stcat (argptr, tmp3);
! 4239: }
! 4240:
! 4241: stcat (argptr, "H\201");
! 4242: write_m (argptr);
! 4243:
! 4244: io = i;
! 4245: }
! 4246: break;
! 4247:
! 4248: case 9:
! 4249: i = 0;
! 4250: j = 0;
! 4251:
! 4252: while ((ch = argptr[i++]) != EOL) LineTerm[j++] = ch;
! 4253:
! 4254: LineTerm[j] = EOL;
! 4255: break;
! 4256:
! 4257: case 10:
! 4258: BrkKey = (*argptr);
! 4259:
! 4260: /* make new break active */
! 4261: set_io (UNIX);
! 4262: set_io (MUMPS);
! 4263: }
! 4264: }
! 4265:
! 4266: setpiece = FALSE;
! 4267: codptr++;
! 4268:
! 4269: break;
! 4270: }
! 4271: else if (*codptr == ':') {
! 4272: codptr++;
! 4273:
! 4274: if (io == HOME) { /* old syntax: enable/disable echo */
! 4275: expr (STRING);
! 4276:
! 4277: if (merr () > OK) goto err;
! 4278:
! 4279: if (tvexpr (argptr)) {
! 4280: DSW &= ~BIT0;
! 4281: }
! 4282: else {
! 4283: DSW |= BIT0;
! 4284: }
! 4285:
! 4286: }
! 4287: else {
! 4288:
! 4289: if (*codptr == '(') {
! 4290: codptr++;
! 4291: setpiece = TRUE;
! 4292: }
! 4293:
! 4294: j = 1;
! 4295:
! 4296: while (*codptr != ')') {
! 4297:
! 4298: if (*codptr == ':') {
! 4299: codptr++;
! 4300: j++;
! 4301:
! 4302: continue;
! 4303: }
! 4304: else if (setpiece == FALSE) {
! 4305: merr_raise (SPACER);
! 4306: goto err;
! 4307: }
! 4308:
! 4309: expr (STRING);
! 4310:
! 4311: if (merr () > OK) {
! 4312: setpiece = FALSE;
! 4313: goto err;
! 4314: }
! 4315:
! 4316: switch (j) {
! 4317:
! 4318: case 1:
! 4319: fseek (opnfile[io], (long) intexpr (argptr), 0);
! 4320: break;
! 4321:
! 4322: case 2:
! 4323: crlf[io] = tvexpr (argptr);
! 4324: break;
! 4325:
! 4326: case 3:
! 4327: fm_nodelay[io] = tvexpr (argptr);
! 4328: break;
! 4329: }
! 4330:
! 4331: if (setpiece == FALSE) break;
! 4332: }
! 4333:
! 4334: if (setpiece) {
! 4335: codptr++;
! 4336: setpiece = FALSE;
! 4337: }
! 4338:
! 4339: break;
! 4340: }
! 4341: }
! 4342: break;
! 4343:
! 4344:
! 4345: use_socket:
! 4346: {
! 4347: char use_parm[256];
! 4348: int upct = 0;
! 4349:
! 4350: if (*codptr == ':') {
! 4351: codptr++;
! 4352: }
! 4353: else {
! 4354: while ((ch = *(codptr++)) != SP && ch != EOL);
! 4355: codptr--;
! 4356: break;
! 4357: }
! 4358:
! 4359: if (*codptr != '/') {
! 4360: merr_raise (ARGLIST);
! 4361: goto err;
! 4362: }
! 4363:
! 4364: codptr++;
! 4365:
! 4366: while ((ch = *codptr++) != SP && ch != EOL && isalpha (ch)) {
! 4367: use_parm[upct++] = ch;
! 4368: }
! 4369:
! 4370: use_parm[upct] = NUL;
! 4371:
! 4372: for (upct = 0; upct < strlen (use_parm); upct++) {
! 4373: use_parm[upct] = toupper (use_parm[upct]);
! 4374: }
! 4375:
! 4376: if (strcmp (use_parm, "CONNECT") == 0) {
! 4377:
! 4378: msck_connect (io);
! 4379:
! 4380: if (merr () > OK) goto err;
! 4381:
! 4382: }
! 4383: else if (strcmp (use_parm, "BIND") == 0) {
! 4384: write_m("BIND\r\n\201");
! 4385: }
! 4386: else {
! 4387: merr_raise (ARGLIST);
! 4388: goto err;
! 4389: }
! 4390:
! 4391: break;
! 4392:
! 4393: }
! 4394:
! 4395: case OPEN:
! 4396:
! 4397: {
! 4398: short k;
! 4399:
! 4400: if (*codptr == SP || *codptr == EOL) {
! 4401: merr_raise (FILERR);
! 4402: goto err;
! 4403: }
! 4404:
! 4405: expr (STRING);
! 4406: k = intexpr (argptr);
! 4407:
! 4408: if (merr () > OK) goto err;
! 4409:
! 4410:
! 4411: if (k < 0 || k > MAXDEV) {
! 4412: merr_raise (NODEVICE);
! 4413: goto err;
! 4414: }
! 4415:
! 4416: if (k > MAXSEQ) goto open_socket;
! 4417:
! 4418: if (restricted_mode) {
! 4419: merr_raise (NOSTAND);
! 4420: goto err;
! 4421: }
! 4422:
! 4423: /* need to evaluate the following 6 lines carefully - smw 2023-10-15 */
! 4424: if (k != HOME) {
! 4425: crlf[k] = FALSE;
! 4426: fm_nodelay[k] = FALSE;
! 4427: xpos[k] = 0;
! 4428: ypos[k] = 0;
! 4429: }
! 4430:
! 4431: /* OPEN implies a previous CLOSE on same channel */
! 4432: if ((k != HOME) && devopen[k]) {
! 4433:
! 4434: fclose (opnfile[k]);
! 4435: devopen[k] = 0;
! 4436:
! 4437: if (io == k) io = HOME;
! 4438: }
! 4439:
! 4440: /* process device parameters on HOME at USE command. */
! 4441: if (k == HOME && *codptr == ':' && *(codptr + 1) == '(') goto use0;
! 4442:
! 4443: if (*codptr != ':') {
! 4444:
! 4445: if (k == HOME) break;
! 4446:
! 4447: if (dev[k][0] == EOL) {
! 4448: merr_raise (FILERR);
! 4449: merr_set_iochan_err (k, FILERR, "file not found");
! 4450: goto err;
! 4451: }
! 4452:
! 4453: goto open10;
! 4454: }
! 4455:
! 4456: codptr++;
! 4457:
! 4458: if (k == HOME) {
! 4459:
! 4460: if (*codptr != ':') { /* turn echo on/off */
! 4461:
! 4462: expr (STRING);
! 4463:
! 4464: if (merr () > OK) goto err;
! 4465:
! 4466: if (tvexpr (argptr)) {
! 4467: DSW &= ~BIT0;
! 4468: }
! 4469: else {
! 4470: DSW |= BIT0;
! 4471: }
! 4472: }
! 4473:
! 4474: if (*codptr == ':') { /* dummy timeout on HOME */
! 4475: codptr++;
! 4476:
! 4477: if (*codptr != SP && *codptr != EOL) {
! 4478: expr (STRING);
! 4479:
! 4480: if (merr () > OK) goto err;
! 4481:
! 4482: test = TRUE;
! 4483: break;
! 4484: }
! 4485: else {
! 4486: merr_raise (INVEXPR);
! 4487: goto err;
! 4488: }
! 4489: }
! 4490: }
! 4491: else {
! 4492: int op_pos;
! 4493:
! 4494: expr (STRING);
! 4495:
! 4496: if (merr () > OK) goto err;
! 4497:
! 4498: stcpy (dev[k], argptr);
! 4499: frm_timeout = (-1L);
! 4500:
! 4501: if (*codptr == ':') {
! 4502:
! 4503: codptr++;
! 4504:
! 4505: expr (STRING);
! 4506: frm_timeout = intexpr (argptr);
! 4507:
! 4508: if (merr () > OK) goto err;
! 4509: if (frm_timeout < 0L) frm_timeout = 0L;
! 4510: }
! 4511:
! 4512: open10:
! 4513:
! 4514: j = stcpy (tmp, dev[k]);
! 4515: i = dev[k][j - 1];
! 4516:
! 4517: while (--j >= 0) {
! 4518: if (dev[k][j] == '/') break;
! 4519: }
! 4520:
! 4521: stcpy (tmp2, dev[k]);
! 4522:
! 4523: if (j <= 0) {
! 4524: tmp2[stlen (tmp2)] = NUL;
! 4525: tmp[1] = 'r';
! 4526: i = '+';
! 4527: }
! 4528: else { /* default is read+write */
! 4529: tmp2[j] = NUL;
! 4530:
! 4531: j = stcpy (&tmp[1], &tmp[j + 1]);
! 4532:
! 4533: tmp[0] = SP;
! 4534: tmp[j + 1] = SP;
! 4535: tmp[j + 2] = EOL;
! 4536:
! 4537: j = 0;
! 4538:
! 4539: while ((ch = tmp[++j]) != EOL) if (ch >= 'A' && ch <= 'Z') tmp[j] = ch + 32;
! 4540:
! 4541: if (find (" r w a r+ w+ a+ read write append read+ write+ append+ \201", tmp) == FALSE) {
! 4542: tmp[1] = 'r';
! 4543: i = '+';
! 4544:
! 4545: tmp2[strlen (tmp2)] = '/';
! 4546: }
! 4547: }
! 4548:
! 4549: tmp[0] = tmp[1];
! 4550: tmp[1] = NUL; /* NUL not EOL !!! */
! 4551:
! 4552: if (i == '+') {
! 4553: tmp[1] = i;
! 4554: tmp[2] = NUL;
! 4555: }
! 4556:
! 4557: op_pos = 0;
! 4558:
! 4559: open20:
! 4560:
! 4561: if (oucpath[op_pos] != EOL) {
! 4562:
! 4563: j = stlen (dev[k]);
! 4564:
! 4565: while (--j >= 0) if (dev[k][j] == '/') break;
! 4566: while (--j >= 0) if (dev[k][j] == '/') break;
! 4567:
! 4568: if (j < 0) {
! 4569:
! 4570: strcpy (tmp3, tmp2);
! 4571: stcpy (tmp2, &oucpath[op_pos]);
! 4572:
! 4573: j = 0;
! 4574: while (tmp2[j] != ':' && tmp2[j] != EOL) j++;
! 4575:
! 4576: tmp2[j] = EOL;
! 4577:
! 4578: stcpy (act_oucpath[k], tmp2);
! 4579: op_pos += j;
! 4580:
! 4581: if (j) tmp2[j++] = '/';
! 4582:
! 4583: strcpy (&tmp2[j], tmp3);
! 4584: }
! 4585: }
! 4586:
! 4587: /* r = READ only access;
! 4588: * w = WRITE new file;
! 4589: * a = WRITE append;
! 4590: * r+ = READ/WRITE access;
! 4591: * w+ = WRITE new file;
! 4592: * a+ = WRITE append;
! 4593: */
! 4594: j = tmp[0];
! 4595: sq_modes[k] = j;
! 4596:
! 4597: if (j == 'r' && tmp[1] == '+') {
! 4598: sq_modes[k] = '+';
! 4599: }
! 4600:
! 4601: if (j == 'r' && frm_timeout < 0L) {
! 4602:
! 4603: errno = 0;
! 4604:
! 4605: while ((opnfile[k] = fopen (tmp2, tmp)) == NULL) {
! 4606:
! 4607: if (errno == EINTR) {
! 4608: errno = 0;
! 4609: continue;
! 4610: } /* interrupt */
! 4611:
! 4612: if (errno == EMFILE || errno == ENFILE) {
! 4613: close_all_globals ();
! 4614: continue;
! 4615: }
! 4616:
! 4617: if (dev[k][0] != '/' && oucpath[op_pos++] != EOL) {
! 4618: strcpy (tmp2, tmp3);
! 4619: goto open20;
! 4620: }
! 4621:
! 4622: act_oucpath[k][0] = EOL;
! 4623: merr_raise ((errno == ENOENT ? FILERR : PROTECT));
! 4624:
! 4625: switch (merr ()) {
! 4626:
! 4627: case FILERR:
! 4628: merr_set_iochan_err (k, FILERR, "file not found");
! 4629: break;
! 4630:
! 4631: case PROTECT:
! 4632: merr_set_iochan_err (k, PROTECT, "file protection violation");
! 4633: break;
! 4634:
! 4635: }
! 4636:
! 4637: goto err;
! 4638: }
! 4639:
! 4640: ssvn_job_add_device (k, tmp2);
! 4641:
! 4642: devopen[k] = ((i == '+') ? i : j);
! 4643: break;
! 4644: }
! 4645:
! 4646: if (j == 'r' || j == 'w' || j == 'a') {
! 4647:
! 4648: if (frm_timeout >= 0L) {
! 4649:
! 4650: test = TRUE;
! 4651:
! 4652: if (setjmp (sjbuf)) {
! 4653: test = FALSE;
! 4654: goto endopn;
! 4655: }
! 4656:
! 4657: sig_attach (SIGALRM, &ontimo);
! 4658: alarm ((unsigned) (frm_timeout < 3 ? 3 : frm_timeout));
! 4659: }
! 4660:
! 4661: for (;;) {
! 4662: errno = 0;
! 4663:
! 4664: if ((opnfile[k] = fopen (tmp2, tmp)) != NULL) break;
! 4665: if (merr () == INRPT) goto err;
! 4666: if (errno == EINTR) continue; /* interrupt */
! 4667:
! 4668: if (errno == EMFILE || errno == ENFILE) {
! 4669: close_all_globals ();
! 4670: continue;
! 4671: }
! 4672:
! 4673: if (frm_timeout < 0L) {
! 4674:
! 4675: if (dev[k][0] != '/' && oucpath[op_pos++] != EOL) {
! 4676: strcpy (tmp2, tmp3);
! 4677: goto open20;
! 4678: }
! 4679:
! 4680: if (errno == ENOENT) continue;
! 4681:
! 4682: act_oucpath[k][0] = EOL;
! 4683: merr_raise (PROTECT);
! 4684:
! 4685: merr_set_iochan_err (k, PROTECT, "file protection violation");
! 4686:
! 4687: goto err;
! 4688: }
! 4689:
! 4690: if (frm_timeout == 0L) {
! 4691: test = FALSE;
! 4692: goto endopn;
! 4693: }
! 4694:
! 4695: sleep (1);
! 4696: frm_timeout--;
! 4697: }
! 4698:
! 4699: devopen[k] = ((i == '+') ? i : j);
! 4700: endopn:;
! 4701:
! 4702: alarm (0); /* reset alarm request */
! 4703: }
! 4704: else {
! 4705: merr_raise (ARGLIST);
! 4706: merr_set_iochan_err (k, ARGLIST, "invalid argument");
! 4707: goto err;
! 4708: }
! 4709: }
! 4710:
! 4711:
! 4712: open_socket:
! 4713: if (*codptr != ':') {
! 4714: if (j == 'w') {
! 4715: merr_raise (FILEXWR);
! 4716: merr_set_iochan_err (k, FILEXWR, "cannot open existing file for WRITE");
! 4717: }
! 4718: else {
! 4719: merr_raise (ARGLIST);
! 4720: merr_set_iochan_err (k, ARGLIST, "invalid argument");
! 4721: }
! 4722: goto err;
! 4723: }
! 4724:
! 4725: codptr++;
! 4726: expr (STRING);
! 4727:
! 4728: if (merr () > OK) goto err;
! 4729:
! 4730:
! 4731: stcpy (vn, argptr);
! 4732: stcnv_m2c (vn);
! 4733:
! 4734: msck_open (k, vn);
! 4735:
! 4736: if (merr () > OK) goto err;
! 4737:
! 4738: ssvn_job_add_device (k, vn);
! 4739:
! 4740: break;
! 4741: }
! 4742: break;
! 4743:
! 4744:
! 4745:
! 4746:
! 4747:
! 4748: case CLOSE:
! 4749:
! 4750: /* no arguments: close all exept HOME */
! 4751: if (*codptr == SP || *codptr == EOL) {
! 4752:
! 4753: if (rtn_dialect () != D_FREEM) {
! 4754: merr_raise (NOSTAND);
! 4755: break;
! 4756: }
! 4757:
! 4758: j = 1;
! 4759:
! 4760: while (j <= MAXDEV) {
! 4761:
! 4762: if (j < FIRSTSCK) {
! 4763: if (jour_flag && (j == 2)) {
! 4764: j++;
! 4765: continue;
! 4766: }
! 4767:
! 4768: if (devopen[j]) fclose (opnfile[j]);
! 4769:
! 4770: ssvn_job_remove_device (j);
! 4771:
! 4772: devopen[j++] = 0;
! 4773: }
! 4774: else {
! 4775: msck_close (j++);
! 4776: }
! 4777:
! 4778: }
! 4779:
! 4780: io = HOME;
! 4781: break;
! 4782: }
! 4783:
! 4784: expr (STRING);
! 4785: j = intexpr (argptr);
! 4786:
! 4787: if (merr () > OK) break;
! 4788:
! 4789: if (j >= FIRSTSCK && j < MAXDEV) {
! 4790: msck_close (j);
! 4791: ssvn_job_remove_device (j);
! 4792: break;
! 4793: }
! 4794:
! 4795: /*ignore close on illgal units */
! 4796: if ((j >= 0 && j <= MAXDEV && j != HOME) && (jour_flag == 0 || (j != 2))) { /*ignore close on protocol channel */
! 4797:
! 4798: if (devopen[j]) fclose (opnfile[j]);
! 4799:
! 4800: devopen[j] = 0;
! 4801:
! 4802: ssvn_job_remove_device (j);
! 4803:
! 4804: if (io == j) io = HOME;
! 4805:
! 4806: }
! 4807:
! 4808: /* parse any 'device parameters', but ignore them otherwise */
! 4809: if (*codptr == ':') {
! 4810: if (*++codptr != '(') {
! 4811: expr (STRING);
! 4812: }
! 4813: else {
! 4814: setpiece = TRUE; /* to avoid bracket error at end of deviceparameters */
! 4815: for (;;)
! 4816: {
! 4817: if (*++codptr != ':')
! 4818: expr (STRING);
! 4819: if (*codptr == ':')
! 4820: continue;
! 4821: if (*codptr++ != ')')
! 4822: merr_raise (ARGER);
! 4823: break;
! 4824: }
! 4825: setpiece = FALSE;
! 4826: }
! 4827: }
! 4828:
! 4829: break;
! 4830:
! 4831: case ZHALT: /* ZHALT */
! 4832:
! 4833: if (is_standard ()) {
! 4834: merr_raise (NOSTAND);
! 4835: goto err;
! 4836: }
! 4837:
! 4838: case HA: /* HALT or HANG */
! 4839:
! 4840:
! 4841: /* no arguments: HALT */
! 4842: if (*codptr == SP || *codptr == EOL || mcmnd == ZHALT) {
! 4843:
! 4844: if (mcmnd == ZHALT && *codptr != SP && *codptr != EOL) {
! 4845: expr (STRING);
! 4846: i = intexpr (argptr);
! 4847:
! 4848: if (merr () > OK) break;
! 4849: }
! 4850: else {
! 4851: halt:i = 0;
! 4852: }
! 4853:
! 4854: cleanup ();
! 4855:
! 4856: if (father) { /* advertise death to parent *//* make sure father is waiting !!! */
! 4857: if ((time (0L) - jobtime) < 120) sleep (2);
! 4858:
! 4859: kill (father, SIGUSR1);
! 4860: }
! 4861:
! 4862: exit (i); /* terminate mumps */
! 4863: };
! 4864: /* with arguments: HANG */
! 4865:
! 4866:
! 4867: case HANG: /* HANG */
! 4868:
! 4869: {
! 4870: unsigned long int waitsec;
! 4871: int millisec;
! 4872:
! 4873: #ifdef USE_GETTIMEOFDAY
! 4874: struct timeval timebuffer;
! 4875: #else
! 4876: struct timeb timebuffer;
! 4877: #endif
! 4878:
! 4879: expr (STRING);
! 4880: numlit (argptr);
! 4881:
! 4882: if (merr () > OK) break;
! 4883:
! 4884: #if !defined(__linux__)
! 4885: if (argptr[0] == '-') break; /* negative values without effect */
! 4886: if (argptr[0] == '0') break; /* zero without effect */
! 4887: #else
! 4888: /* on linux, return scheduler timeslice to kernel scheduler for hang 0 and hang with negative values
! 4889: for compatibility with Reference Standard M, only when process is using a realtime scheduling policy */
! 4890: if ((argptr[0] == '-') || (argptr[0] == '0')) {
! 4891: int policy;
! 4892:
! 4893: policy = sched_getscheduler (0);
! 4894: if ((policy == -1) || ((policy != SCHED_FIFO) && (policy != SCHED_RR))) break;
! 4895:
! 4896: sched_yield ();
! 4897: }
! 4898: #endif
! 4899:
! 4900: waitsec = 0;
! 4901: millisec = 0;
! 4902: i = 0;
! 4903:
! 4904: for (;;) { /* get integer and fractional part */
! 4905:
! 4906: if ((ch = argptr[i++]) == EOL) break;
! 4907:
! 4908: if (ch == '.') {
! 4909: millisec = (argptr[i++] - '0') * 100;
! 4910:
! 4911: if ((ch = argptr[i++]) != EOL) {
! 4912: millisec += (ch - '0') * 10;
! 4913:
! 4914: if ((ch = argptr[i]) != EOL) {
! 4915: millisec += (ch - '0');
! 4916: }
! 4917: }
! 4918:
! 4919: break;
! 4920: }
! 4921:
! 4922: waitsec = waitsec * 10 + ch - '0';
! 4923: }
! 4924:
! 4925: if ((i = waitsec) > 2) i -= 2;
! 4926:
! 4927: #ifdef USE_GETTIMEOFDAY
! 4928: gettimeofday (&timebuffer, NULL); /* get current time */
! 4929:
! 4930: waitsec += timebuffer.tv_sec; /* calculate target time */
! 4931: millisec += timebuffer.tv_usec;
! 4932: #else
! 4933: ftime (&timebuffer); /* get current time */
! 4934:
! 4935: waitsec += timebuffer.time; /* calculate target time */
! 4936: millisec += timebuffer.millitm;
! 4937: #endif
! 4938:
! 4939: if (millisec >= 1000) {
! 4940: waitsec++;
! 4941: millisec -= 1000;
! 4942: }
! 4943:
! 4944: /* do the bulk of the waiting with sleep() */
! 4945: while (i > 0) {
! 4946: j = time (0L);
! 4947: sleep ((unsigned) (i > 32767 ? 32767 : i)); /* sleep max. 2**15-1 sec */
! 4948: i -= time (0L) - j; /* subtract actual sleeping time */
! 4949:
! 4950: if (merr () == INRPT) goto err;
! 4951:
! 4952: if (evt_async_enabled && (merr () == ASYNC)) goto err;
! 4953: }
! 4954:
! 4955: /* do the remainder of the waiting watching the clock */
! 4956: for (;;) {
! 4957:
! 4958: #ifdef USE_GETTIMEOFDAY
! 4959:
! 4960: gettimeofday (&timebuffer, NULL);
! 4961:
! 4962: if (timebuffer.tv_sec > waitsec) break;
! 4963: if (timebuffer.tv_sec == waitsec && timebuffer.tv_usec >= millisec) break;
! 4964: #else
! 4965: ftime (&timebuffer);
! 4966:
! 4967: if (timebuffer.time > waitsec) break;
! 4968: if (timebuffer.time == waitsec && timebuffer.millitm >= millisec) break;
! 4969: #endif
! 4970: if (merr () == INRPT) goto err;
! 4971:
! 4972: }
! 4973: }
! 4974: break;
! 4975:
! 4976:
! 4977: case HALT: /* HALT */
! 4978:
! 4979: if (*codptr == SP || *codptr == EOL) goto halt;
! 4980:
! 4981: merr_raise (ARGLIST);
! 4982: break;
! 4983:
! 4984:
! 4985: case BREAK:
! 4986:
! 4987:
! 4988: if (*codptr == SP || *codptr == EOL) {
! 4989:
! 4990: if (breakon == FALSE) break; /* ignore BREAK */
! 4991:
! 4992: if (usermode == 0) {
! 4993: merr_raise (BKERR);
! 4994: goto err;
! 4995: }
! 4996:
! 4997: zbflag = TRUE;
! 4998: merr_raise (OK - CTRLB);
! 4999: zb_entry:loadsw = TRUE;
! 5000:
! 5001: #ifdef DEBUG_NEWSTACK
! 5002: printf ("CHECK 08 (Stack PUSH)\r\n");
! 5003: #endif
! 5004:
! 5005:
! 5006:
! 5007: if (++nstx > NESTLEVLS) {
! 5008: nstx--;
! 5009: merr_raise (STKOV);
! 5010:
! 5011: goto err;
! 5012: }
! 5013: else {
! 5014: estack++;
! 5015: }
! 5016:
! 5017: nestc[nstx] = BREAK;
! 5018:
! 5019: #ifdef DEBUG_NEWSTACK
! 5020:
! 5021: if (!cmdptr) printf ("CMDPTR is ZERO!\r\n");
! 5022:
! 5023: #endif
! 5024:
! 5025: nestp[nstx] = cmdptr; /* command stack address */
! 5026: nestn[nstx] = 0; /*!!! save name */
! 5027: nestr[nstx] = roucur - rouptr; /* save roucur */
! 5028: nestnew[nstx] = 0;
! 5029: ztrap[nstx][0] = EOL;
! 5030: nestlt[nstx] = level;
! 5031: level = 0; /* save level */
! 5032: /* save BREAK information */
! 5033: brkstk[nstx] = (((ECHOON ? 1 : 0) << 1) | test) << 3 | io;
! 5034:
! 5035: io = HOME;
! 5036: forsw = FALSE;
! 5037: cmdptr += stcpy (cmdptr, codptr) + 1;
! 5038: zerr = BKERR;
! 5039: goto restart;
! 5040: }
! 5041:
! 5042: if (is_standard ()) {
! 5043: merr_raise (NOSTAND);
! 5044: goto err;
! 5045: }
! 5046:
! 5047: expr (STRING);
! 5048: if (merr () > OK) break;
! 5049:
! 5050: switch (intexpr (argptr)) {
! 5051:
! 5052: case 2:
! 5053: DSM2err = TRUE;
! 5054: break; /* enable DSM V 2 error processing */
! 5055:
! 5056: case -2:
! 5057: DSM2err = FALSE;
! 5058: break; /* enable normal error processing */
! 5059:
! 5060: case 0:
! 5061: breakon = FALSE;
! 5062: break; /* disable CTRL/C */
! 5063:
! 5064: default:
! 5065: breakon = TRUE;
! 5066: break; /* enable CTRL/C */
! 5067: }
! 5068: break;
! 5069:
! 5070: case VIEW:
! 5071:
! 5072: view_com ();
! 5073:
! 5074: if (repQUIT) { /* VIEW 26: repeated QUIT action */
! 5075:
! 5076: while (repQUIT-- > 0) {
! 5077:
! 5078: #ifdef DEBUG_NEWSTACK
! 5079: printf ("CHECK 09 (Stack POP)\r\n");
! 5080: #endif
! 5081:
! 5082: if (nestc[nstx] == BREAK) {
! 5083: // printf ("nestc[nstx] was BREAK\r\n");
! 5084: if (repQUIT) continue;
! 5085: merr_raise (OK - CTRLB);
! 5086:
! 5087: goto zgo; /*cont. single step */
! 5088: }
! 5089: // else {
! 5090: // printf ("nestc[nstx] was _not_ BREAK\r\n");
! 5091: // }
! 5092:
! 5093: if (nestc[nstx] == FOR) {
! 5094:
! 5095: stcpy (code, cmdptr = nestp[nstx--]);
! 5096: estack--;
! 5097:
! 5098: codptr = code;
! 5099: ftyp = fortyp[--forx];
! 5100: fvar = forvar[forx];
! 5101: finc = forinc[forx];
! 5102: flim = forlim[forx];
! 5103: fi = fori[forx];
! 5104:
! 5105: if (repQUIT) continue;
! 5106: if ((forsw = (nestc[nstx] == FOR))) goto for_end;
! 5107:
! 5108: goto next_line;
! 5109: }
! 5110:
! 5111: if (nestn[nstx]) { /* reload routine */
! 5112: namptr = nestn[nstx];
! 5113:
! 5114: if ((nestc[nstx] != XECUTE) || loadsw) {
! 5115: stcpy (rou_name, namptr);
! 5116: zload (rou_name);
! 5117:
! 5118: ssvn_job_update ();
! 5119:
! 5120: dosave[0] = 0;
! 5121: }
! 5122:
! 5123: namptr--;
! 5124: }
! 5125:
! 5126: if (nestnew[nstx]) unnew (); /* un-NEW variables */
! 5127:
! 5128: /* restore old pointers */
! 5129: if ((mcmnd = nestc[nstx]) == BREAK) {
! 5130: if (repQUIT) continue;
! 5131:
! 5132: goto restore;
! 5133: } /*cont. single step */
! 5134:
! 5135: if (mcmnd == DO_BLOCK) {
! 5136: test = nestlt[nstx];
! 5137: level--;
! 5138: }
! 5139: else { /* pop $TEST */
! 5140: level = nestlt[nstx]; /* pop level */
! 5141: }
! 5142:
! 5143: roucur = nestr[nstx] + rouptr;
! 5144: stcpy (codptr = code, cmdptr = nestp[nstx--]);
! 5145: estack--;
! 5146: forsw = (nestc[nstx] == FOR);
! 5147:
! 5148:
! 5149: loadsw = TRUE;
! 5150:
! 5151: if (mcmnd == '$') {
! 5152: if (repQUIT) return 0;
! 5153: merr_raise (NOVAL);
! 5154: }
! 5155: }
! 5156: repQUIT = 0;
! 5157: }
! 5158: break;
! 5159:
! 5160: /* Z-COMMANDS */
! 5161: case ZGO:
! 5162:
! 5163: /* ZGO with arguments: same as GOTO but with BREAK on */
! 5164: if (*codptr != EOL && *codptr != SP) {
! 5165: mcmnd = GOTO;
! 5166: zbflag = TRUE;
! 5167: merr_raise (OK - CTRLB);
! 5168:
! 5169: goto do_goto;
! 5170: }
! 5171:
! 5172: /* argumentless ZGO resume execution after BREAK */
! 5173:
! 5174: if (nestc[nstx] != BREAK) {
! 5175: merr_raise (LVLERR);
! 5176: break;
! 5177: }
! 5178:
! 5179:
! 5180:
! 5181: merr_clear (); /* stop BREAKing */
! 5182:
! 5183: zgo:
! 5184:
! 5185: #ifdef DEBUG_NEWSTACK
! 5186: printf ("Zgoing: (Stack POP)\r\n");
! 5187: #endif
! 5188:
! 5189:
! 5190:
! 5191: if (nestn[nstx]) { /* reload routine */
! 5192: stcpy (rou_name, (namptr = nestn[nstx]));
! 5193: zload (rou_name);
! 5194:
! 5195: ssvn_job_update ();
! 5196:
! 5197: if (merr () > OK) break;
! 5198: }
! 5199:
! 5200: level = nestlt[nstx];
! 5201: roucur = nestr[nstx] + rouptr;
! 5202: io = brkstk[nstx];
! 5203:
! 5204: if (io & 020) {
! 5205: DSW &= ~BIT0;
! 5206: }
! 5207: else {
! 5208: DSW |= BIT0; /* restore echo state */
! 5209: }
! 5210:
! 5211: test = (io & 010) >> 3; /* restore $TEST */
! 5212:
! 5213: /* restore $IO; default to HOME if channel not OPEN */
! 5214: if ((io &= 07) != HOME && devopen[io] == 0) io = HOME;
! 5215:
! 5216: stcpy (codptr = code, cmdptr = nestp[nstx--]);
! 5217: estack--;
! 5218:
! 5219: forsw = (nestc[nstx] == FOR);
! 5220:
! 5221:
! 5222: loadsw = TRUE;
! 5223: zbflag = FALSE;
! 5224:
! 5225: goto next0;
! 5226:
! 5227:
! 5228: case ZBREAK:
! 5229:
! 5230: if (*codptr == SP || *codptr == EOL) {
! 5231: merr_raise (ARGLIST);
! 5232: break;
! 5233: }
! 5234:
! 5235: expr (STRING);
! 5236: if (merr () > OK) break;
! 5237:
! 5238: zbreakon = tvexpr (argptr);
! 5239: if (hardcopy == DISABLE) set_zbreak (zbreakon ? STX : -1); /* enable/disable CTRL/B */
! 5240:
! 5241: zbflag = FALSE;
! 5242: break;
! 5243:
! 5244:
! 5245:
! 5246:
! 5247: case ZLOAD:
! 5248:
! 5249: if (*codptr == EOL || *codptr == SP) {
! 5250: stcpy (varnam, rou_name);
! 5251: }
! 5252: else {
! 5253: expr (NAME);
! 5254:
! 5255: if (merr () > OK) break;
! 5256:
! 5257: codptr++;
! 5258: }
! 5259:
! 5260: dosave[0] = EOL;
! 5261:
! 5262: if (varnam[0] == EOL) {
! 5263: varerr[0] = EOL;
! 5264: merr_raise (NOPGM);
! 5265: break;
! 5266: } /*error */
! 5267:
! 5268: loadsw = TRUE;
! 5269:
! 5270: /* a ZLOAD on the active routine always loads from disk */
! 5271: if (stcmp (varnam, rou_name) == 0) {
! 5272: for (i = 0; i < NO_OF_RBUF; i++) {
! 5273:
! 5274: if (rouptr == (buff + (i * PSIZE0))) {
! 5275: pgms[i][0] = EOL;
! 5276:
! 5277: break;
! 5278: }
! 5279: }
! 5280: }
! 5281:
! 5282: zload (varnam);
! 5283:
! 5284: if (merr () > OK) break; /* load file */
! 5285:
! 5286: stcpy (rou_name, varnam);
! 5287: ssvn_job_update ();
! 5288:
! 5289: break;
! 5290:
! 5291: case ZSAVE:
! 5292:
! 5293: if (*codptr == EOL || *codptr == SP) {
! 5294:
! 5295: if (rou_name[0] == EOL) {
! 5296: varerr[0] = EOL;
! 5297: merr_raise (NOPGM);
! 5298:
! 5299: break;
! 5300: } /*error */
! 5301:
! 5302: stcpy (varnam, rou_name);
! 5303: }
! 5304: else {
! 5305: expr (NAME);
! 5306:
! 5307: if (varnam[0] == '^') merr_raise (GLOBER);
! 5308: if (varnam[0] == '$') merr_raise (INVREF);
! 5309: if (merr () > OK) break;
! 5310:
! 5311: stcpy (rou_name, varnam);
! 5312: ssvn_job_update ();
! 5313:
! 5314: codptr++;
! 5315: }
! 5316:
! 5317: zsave (varnam);
! 5318: break;
! 5319:
! 5320:
! 5321: case ZREMOVE:
! 5322:
! 5323: {
! 5324: char *beg, *end;
! 5325:
! 5326: dosave[0] = EOL;
! 5327:
! 5328: if (*codptr == SP || *codptr == EOL) { /* no args is ZREMOVE all */
! 5329: loadsw = TRUE;
! 5330:
! 5331: for (i = 0; i < NO_OF_RBUF; i++) {
! 5332:
! 5333: if (rouptr == buff + (i * PSIZE0)) {
! 5334: pgms[i][0] = EOL;
! 5335: break;
! 5336: }
! 5337:
! 5338: }
! 5339:
! 5340: rouptr = buff + (i * PSIZE0);
! 5341: rouend = rouins = rouptr;
! 5342: roucur = buff + (NO_OF_RBUF * PSIZE0 + 1);
! 5343:
! 5344: *(rouptr) = EOL;
! 5345: *(rouptr + 1) = EOL;
! 5346: *(rouptr + 2) = EOL;
! 5347:
! 5348: argptr = partition;
! 5349: rou_name[0] = EOL;
! 5350:
! 5351: ssvn_job_update ();
! 5352:
! 5353: break;
! 5354: }
! 5355: if (*codptr == ':') {
! 5356: beg = rouptr;
! 5357: }
! 5358: else if (*codptr == '*') {
! 5359: beg = rouptr;
! 5360:
! 5361: while ((end = (beg + UNSIGN (*beg) + 2)) < rouins) beg = end;
! 5362:
! 5363: codptr++;
! 5364: }
! 5365: else {
! 5366: lineref (&beg);
! 5367: if (merr () > OK) break;
! 5368: }
! 5369:
! 5370: if ((end = beg) == 0) {
! 5371: merr_raise (M13);
! 5372: break;
! 5373: }
! 5374:
! 5375: if (*codptr == ':') { /* same as above */
! 5376: codptr++;
! 5377:
! 5378: if (*codptr == '*') {
! 5379: end = rouins;
! 5380: codptr++;
! 5381: }
! 5382: else if (*codptr == ',' || *codptr == SP || *codptr == EOL) {
! 5383: end = rouend;
! 5384: }
! 5385: else {
! 5386: lineref (&end);
! 5387:
! 5388: if (end == 0) merr_raise (M13);
! 5389: if (merr () > OK) break;
! 5390:
! 5391: end = end + UNSIGN (*end) + 2;
! 5392: }
! 5393: }
! 5394: else {
! 5395: end = end + UNSIGN (*end) + 2;
! 5396: }
! 5397:
! 5398: if (beg < rouend) { /* else there's nothing to zremove */
! 5399:
! 5400: if (end >= rouend) {
! 5401: end = rouend = beg;
! 5402: }
! 5403: else {
! 5404: rouins = beg;
! 5405:
! 5406: while (end <= rouend) *beg++ = (*end++);
! 5407:
! 5408: i = beg - end;
! 5409: rouend += i;
! 5410:
! 5411: if (roucur > end) roucur += i;
! 5412: }
! 5413:
! 5414: *end = EOL;
! 5415: *(end + 1) = EOL;
! 5416:
! 5417: for (i = 0; i < NO_OF_RBUF; i++) {
! 5418: if (rouptr == (buff + (i * PSIZE0))) {
! 5419: ends[i] = rouend;
! 5420: break;
! 5421: }
! 5422: }
! 5423:
! 5424: }
! 5425: break;
! 5426: }
! 5427:
! 5428: case ZINSERT:
! 5429:
! 5430: {
! 5431: char *beg;
! 5432:
! 5433: if (*codptr == EOL || *codptr == SP) {
! 5434: merr_raise (ARGLIST);
! 5435: break;
! 5436: } /*error */
! 5437:
! 5438: dosave[0] = EOL;
! 5439:
! 5440: /* parse stringlit */
! 5441: expr (STRING);
! 5442:
! 5443: if (merr () > OK) break;
! 5444:
! 5445: if (*codptr != ':') {
! 5446: zi (argptr, rouins);
! 5447: break;
! 5448: }
! 5449:
! 5450: stcpy (tmp, argptr);
! 5451: codptr++;
! 5452: lineref (&beg);
! 5453:
! 5454: if (merr () > OK) break; /* parse label */
! 5455:
! 5456: if (beg) {
! 5457: beg = beg + UNSIGN (*beg) + 2;
! 5458: }
! 5459: else {
! 5460: beg = rouptr;
! 5461: }
! 5462:
! 5463: if (beg > rouend + 1) {
! 5464: merr_raise (M13);
! 5465: break;
! 5466: }
! 5467:
! 5468: /* insert stuff */
! 5469: zi (tmp, beg);
! 5470: break;
! 5471: }
! 5472:
! 5473:
! 5474: /* PRINT is convenient -
! 5475: * but non-standard ZPRINT should be used instead */
! 5476: case 'p':
! 5477:
! 5478: if (is_standard ()) {
! 5479: merr_raise (NOSTAND);
! 5480: break;
! 5481: }
! 5482:
! 5483:
! 5484: case ZPRINT:
! 5485:
! 5486: {
! 5487: char *beg, *end;
! 5488:
! 5489: if (*codptr == SP || *codptr == EOL) { /* no args is ZPRINT all */
! 5490: beg = rouptr;
! 5491: end = rouend;
! 5492: }
! 5493: else {
! 5494: if (*codptr == ':') {
! 5495: beg = rouptr; /* from begin */
! 5496: }
! 5497: else if (*codptr == '*') { /* from 'linepointer' */
! 5498: beg = rouptr;
! 5499:
! 5500: while ((end = (beg + UNSIGN (*beg) + 2)) < rouins) beg = end;
! 5501: codptr++;
! 5502: }
! 5503: else {
! 5504: lineref (&beg);
! 5505: if (merr () > OK) break;
! 5506: } /* line reference */
! 5507:
! 5508: if (beg == 0) {
! 5509: beg = rouptr;
! 5510: rouins = beg;
! 5511:
! 5512: if (*codptr != ':') break;
! 5513: }
! 5514:
! 5515: if (*codptr == ':') {
! 5516: codptr++; /* to end */
! 5517:
! 5518: if (*codptr == SP || *codptr == ',' || *codptr == EOL)
! 5519: end = rouend;
! 5520: else {
! 5521: if (*codptr == '*') {
! 5522: end = rouins;
! 5523: codptr++;
! 5524: }
! 5525: else { /* to 'linepointer' */
! 5526: lineref (&end);
! 5527:
! 5528: if (merr () > OK) break; /* line reference */
! 5529: end = end + UNSIGN (*end) + 2;
! 5530: }
! 5531: }
! 5532: }
! 5533: else {
! 5534: end = beg + 1;
! 5535: }
! 5536: }
! 5537: if (rouend < end) end = rouend - 1;
! 5538:
! 5539: for (; beg < end; beg += UNSIGN (*beg) + 2) {
! 5540:
! 5541: if (crlf[io]) {
! 5542: write_m ("\012\201");
! 5543: }
! 5544: else {
! 5545: write_m ("\012\015\201");
! 5546: }
! 5547:
! 5548: if ((*(beg + 1)) == EOL) break;
! 5549:
! 5550: write_m (beg + 1);
! 5551: if (merr () > OK) break;
! 5552: }
! 5553:
! 5554: rouins = beg;
! 5555: }
! 5556:
! 5557: if (crlf[io]) {
! 5558: write_m ("\012\201");
! 5559: }
! 5560: else {
! 5561: write_m ("\012\015\201");
! 5562: }
! 5563:
! 5564: break;
! 5565:
! 5566: case WATCH:
! 5567: {
! 5568: char op;
! 5569:
! 5570:
! 5571: if (((ch = *codptr) == SP) || ch == EOL) {
! 5572:
! 5573: set_io(UNIX);
! 5574:
! 5575: if (dbg_enable_watch) {
! 5576: printf ("Watchpoints disabled.\n");
! 5577: dbg_enable_watch = 0;
! 5578: }
! 5579: else {
! 5580: printf ("Watchpoints enabled.\n");
! 5581: dbg_enable_watch = 1;
! 5582: }
! 5583:
! 5584: break;
! 5585:
! 5586: }
! 5587:
! 5588: if ((ch = *codptr) == '(') {
! 5589: merr_raise (ARGLIST);
! 5590: goto err;
! 5591: }
! 5592:
! 5593: for (;;) {
! 5594:
! 5595: switch (ch) {
! 5596:
! 5597: case '?':
! 5598: case '+':
! 5599: case '-':
! 5600: op = ch;
! 5601: codptr++;
! 5602: break;
! 5603:
! 5604: default:
! 5605: merr_raise (ARGLIST);
! 5606: goto err;
! 5607: }
! 5608:
! 5609: expr (NAME); /* try to interpret an mname */
! 5610:
! 5611: if (merr () > OK) goto err;
! 5612:
! 5613: stcpy (vn, varnam);
! 5614:
! 5615: switch (op) {
! 5616:
! 5617: case '+':
! 5618: dbg_add_watch (vn);
! 5619: break;
! 5620:
! 5621: case '-':
! 5622: dbg_remove_watch (vn);
! 5623: break;
! 5624:
! 5625: case '?':
! 5626: dbg_dump_watch (vn);
! 5627: break;
! 5628:
! 5629: }
! 5630:
! 5631: if (merr () > OK) goto err;
! 5632:
! 5633: if ((ch = *(codptr + 1)) == EOL) {
! 5634: codptr++;
! 5635: break;
! 5636: }
! 5637: else if ((ch = *(codptr + 1)) == ',') {
! 5638: codptr += 2;
! 5639: ch = *codptr;
! 5640: }
! 5641: else {
! 5642: merr_raise (ARGLIST);
! 5643: goto err;
! 5644: }
! 5645: }
! 5646:
! 5647:
! 5648: break;
! 5649: }
! 5650:
! 5651:
! 5652: case ASSERT_TKN:
! 5653: {
! 5654: expr (STRING);
! 5655:
! 5656: if (merr () > OK) goto err;
! 5657:
! 5658: if (tvexpr (argptr) == 0) {
! 5659: merr_raise (ASSERT);
! 5660: goto err;
! 5661: }
! 5662:
! 5663: break;
! 5664: }
! 5665:
! 5666: case ZWRITE:
! 5667:
! 5668:
! 5669: zwrite:
! 5670: {
! 5671: short k;
! 5672: char w_tmp[512];
! 5673: char zwmode;
! 5674:
! 5675:
! 5676: if (io != HOME && devopen[io] == 'r') {
! 5677: merr_raise (NOWRITE);
! 5678: goto err;
! 5679: }
! 5680:
! 5681: tmp3[0] = SP;
! 5682: tmp3[1] = EOL;
! 5683:
! 5684: if ((ch = (*codptr)) == '(') { /* exclusive zwrite */
! 5685:
! 5686: for (;;) {
! 5687:
! 5688: codptr++;
! 5689: expr (NAME);
! 5690:
! 5691: if (merr () > OK) goto err;
! 5692: if (varnam[0] == '^') {
! 5693: merr_raise (GLOBER);
! 5694: goto err;
! 5695: }
! 5696:
! 5697: i = 0;
! 5698:
! 5699: while (varnam[i] != EOL) {
! 5700:
! 5701: if (varnam[i] == DELIM) {
! 5702: merr_raise (SBSCR);
! 5703: goto err;
! 5704: }
! 5705:
! 5706: i++;
! 5707: }
! 5708:
! 5709: if (stcat (tmp3, varnam) == 0) {
! 5710: merr_raise (M75);
! 5711: goto err;
! 5712: }
! 5713:
! 5714: if (stcat (tmp3, " \201") == 0) {
! 5715: merr_raise (M75);
! 5716: goto err;
! 5717: }
! 5718:
! 5719: if ((ch = *++codptr) == ')') {
! 5720: codptr++;
! 5721: break;
! 5722: }
! 5723:
! 5724: if (ch != ',') {
! 5725: merr_raise (COMMAER);
! 5726: goto err;
! 5727: }
! 5728: }
! 5729: }
! 5730: else {
! 5731: if (ch != SP && ch != EOL) goto zwritep;
! 5732: }
! 5733:
! 5734: /* no arguments: write local symbol table. */
! 5735: stcpy (tmp, " $\201");
! 5736:
! 5737: for (;;) {
! 5738: ordercnt = 1L;
! 5739:
! 5740: symtab (bigquery, &tmp[1], tmp2);
! 5741:
! 5742: if (*tmp2 == EOL || merr () == INRPT) break;
! 5743: w_tmp[0] = '=';
! 5744:
! 5745: /* subscripts: internal format different from external one */
! 5746: k = 0;
! 5747: i = 1;
! 5748: j = 0;
! 5749:
! 5750: while ((ch = tmp2[k++]) != EOL) {
! 5751:
! 5752: if (ch == '"') {
! 5753:
! 5754: if (j && tmp2[k] == ch) {
! 5755: k++;
! 5756: }
! 5757: else {
! 5758: toggle (j);
! 5759: continue;
! 5760: }
! 5761:
! 5762: }
! 5763:
! 5764: if (j == 0) {
! 5765:
! 5766: if (ch == '(' || ch == ',') {
! 5767: tmp[i++] = DELIM;
! 5768:
! 5769: continue;
! 5770: }
! 5771:
! 5772: if (ch == ')') break;
! 5773: }
! 5774:
! 5775: tmp[i++] = ch;
! 5776: }
! 5777:
! 5778: tmp[i] = EOL;
! 5779: if (kill_ok (tmp3, tmp) == 0) continue;
! 5780:
! 5781: write_m (tmp2);
! 5782: symtab (get_sym, &tmp[1], &w_tmp[1]);
! 5783: write_m (w_tmp);
! 5784: write_m ("\012\015\201");
! 5785: }
! 5786:
! 5787: break;
! 5788:
! 5789: zwritep:
! 5790:
! 5791: expr (NAME);
! 5792:
! 5793: //if (varnam[0] == '^') merr_raise (GLOBER);
! 5794: if (merr () > OK) goto err;
! 5795:
! 5796: codptr++;
! 5797:
! 5798: if (varnam[0] == '$') {
! 5799:
! 5800: if ((varnam[1] | 0140) == 'z' && (varnam[2] | 0140) == 'f') {
! 5801: w_tmp[0] = '$';
! 5802: w_tmp[1] = 'Z';
! 5803: w_tmp[2] = 'F';
! 5804: w_tmp[3] = '(';
! 5805:
! 5806: for (i = 0; i < 44; i++) {
! 5807:
! 5808: if (zfunkey[i][0] != EOL) {
! 5809: intstr (&w_tmp[4], i + 1);
! 5810: stcat (w_tmp, ")=\201");
! 5811: write_m (w_tmp);
! 5812: write_m (zfunkey[i]);
! 5813: write_m ("\012\015\201");
! 5814: }
! 5815:
! 5816: }
! 5817:
! 5818: break;
! 5819: }
! 5820: else {
! 5821: break; /* do not zwrite special variables etc. other than $ZF */
! 5822: }
! 5823: }
! 5824:
! 5825: if (varnam[0] != '^') {
! 5826: symtab (dat, varnam, tmp2);
! 5827: zwmode = 'L';
! 5828: }
! 5829: else {
! 5830: if (varnam[1] == '$') {
! 5831: ssvn (dat, varnam, tmp2);
! 5832: zwmode = '$';
! 5833: }
! 5834: else {
! 5835: global (dat, varnam, tmp2);
! 5836: zwmode = '^';
! 5837: }
! 5838: }
! 5839:
! 5840: if (tmp2[0] == '0') break; /* variable not defined */
! 5841:
! 5842: /* if $D(@varnam)=10 get next entry */
! 5843: if (tmp2[1] == '0') {
! 5844: ordercnt = 1L;
! 5845:
! 5846: if (varnam[0] != '^') {
! 5847: symtab (fra_query, varnam, tmp2);
! 5848: zwmode = 'L';
! 5849: }
! 5850: else {
! 5851: if (varnam[1] == '$') {
! 5852: ssvn (fra_query, varnam, tmp2);
! 5853: zwmode = '$';
! 5854: }
! 5855: else {
! 5856: global (fra_query, varnam, tmp2);
! 5857: zwmode = '^';
! 5858: }
! 5859: }
! 5860: }
! 5861: else {
! 5862: k = 0;
! 5863: i = 0;
! 5864: j = 0;
! 5865:
! 5866: while ((ch = varnam[k++]) != EOL) {
! 5867:
! 5868: if (ch == DELIM) {
! 5869:
! 5870: if (j) {
! 5871: tmp2[i++] = '"';
! 5872: tmp2[i++] = ',';
! 5873: tmp2[i++] = '"';
! 5874:
! 5875: continue;
! 5876: }
! 5877:
! 5878: j++;
! 5879:
! 5880: tmp2[i++] = '(';
! 5881: tmp2[i++] = '"';
! 5882:
! 5883: continue;
! 5884: }
! 5885:
! 5886: if ((tmp2[i++] = ch) == '"')
! 5887: tmp2[i++] = ch;
! 5888: }
! 5889:
! 5890: if (j) {
! 5891: tmp[i++] = '"';
! 5892: tmp2[i++] = ')';
! 5893: }
! 5894:
! 5895: tmp2[i] = EOL;
! 5896: }
! 5897:
! 5898: for (;;) { /* subscripts: internal format different from external one */
! 5899: k = 0;
! 5900: i = 0;
! 5901: j = 0;
! 5902:
! 5903: while ((ch = tmp2[k++]) != EOL) {
! 5904:
! 5905: if (ch == '"') {
! 5906: if (j && tmp2[k] == ch)
! 5907: k++;
! 5908: else {
! 5909: toggle (j);
! 5910: continue;
! 5911: }
! 5912: }
! 5913:
! 5914: if (j == 0) {
! 5915:
! 5916: if (ch == '(' || ch == ',') {
! 5917: tmp[i++] = DELIM;
! 5918:
! 5919: continue;
! 5920: }
! 5921:
! 5922: if (ch == ')') break;
! 5923: }
! 5924:
! 5925: tmp[i++] = ch;
! 5926: }
! 5927:
! 5928: tmp[i] = EOL;
! 5929: i = 0;
! 5930:
! 5931: while (tmp[i] == varnam[i]) {
! 5932:
! 5933: if (varnam[i] == EOL) break;
! 5934:
! 5935: i++;
! 5936: }
! 5937:
! 5938: if (varnam[i] != EOL) break;
! 5939: if (tmp[i] != EOL && tmp[i] != DELIM) break;
! 5940:
! 5941: tmp3[0] = EOL;
! 5942:
! 5943: switch (zwmode) {
! 5944:
! 5945: case 'L':
! 5946: symtab (dat, tmp, tmp3);
! 5947: symtab (get_sym, tmp, &w_tmp[1]);
! 5948:
! 5949: break;
! 5950:
! 5951:
! 5952: case '$':
! 5953: ssvn (dat, tmp, tmp3);
! 5954: ssvn (get_sym, tmp, &w_tmp[1]);
! 5955:
! 5956: break;
! 5957:
! 5958:
! 5959: case '^':
! 5960: global (dat, tmp, tmp3);
! 5961: global (get_sym, tmp, &w_tmp[1]);
! 5962:
! 5963: break;
! 5964: }
! 5965:
! 5966: if (tmp3[0] != '0' && tmp3[1] != '0') {
! 5967:
! 5968: write_m (tmp2);
! 5969:
! 5970: w_tmp[0] = '=';
! 5971:
! 5972: write_m (w_tmp);
! 5973: write_m ("\012\015\201");
! 5974:
! 5975: }
! 5976:
! 5977: ordercnt = 1L;
! 5978:
! 5979: switch (zwmode) {
! 5980:
! 5981: case 'L':
! 5982: symtab (fra_query, tmp, tmp2);
! 5983:
! 5984: break;
! 5985:
! 5986:
! 5987: case '$':
! 5988: ssvn (fra_query, tmp, tmp2);
! 5989:
! 5990: break;
! 5991:
! 5992:
! 5993: case '^':
! 5994: global (fra_query, tmp, tmp2);
! 5995:
! 5996: break;
! 5997:
! 5998: }
! 5999:
! 6000: if (merr () == INRPT) break;
! 6001: }
! 6002:
! 6003: break;
! 6004: }
! 6005:
! 6006:
! 6007: case ZTRAP:
! 6008:
! 6009: if (*codptr == SP || *codptr == EOL) {
! 6010: merr_raise (ZTERR);
! 6011: varnam[0] = EOL;
! 6012:
! 6013: break;
! 6014: }
! 6015:
! 6016: expr (NAME);
! 6017: stcpy (varerr, varnam);
! 6018:
! 6019: if (merr ()) break;
! 6020:
! 6021: if (*++codptr == ':') { /* parse postcond */
! 6022: codptr++;
! 6023:
! 6024: expr (STRING);
! 6025:
! 6026: if (merr () > OK) goto err;
! 6027:
! 6028: if (tvexpr (argptr) == FALSE) break;
! 6029: }
! 6030:
! 6031: merr_raise (ZTERR);
! 6032: break;
! 6033:
! 6034:
! 6035: case ZALLOCATE:
! 6036:
! 6037: /* argumentless is not permitted */
! 6038: if (*codptr == SP || *codptr == EOL) {
! 6039: merr_raise (ARGLIST);
! 6040: break;
! 6041: }
! 6042:
! 6043: expr (NAME);
! 6044:
! 6045: if (merr () > OK) goto err;
! 6046:
! 6047: tmp[0] = SP;
! 6048: stcpy (&tmp[1], varnam);
! 6049: stcat (tmp, "\001\201");
! 6050:
! 6051: frm_timeout = (-1L); /* no timeout */
! 6052:
! 6053: if (*++codptr == ':') {
! 6054: codptr++;
! 6055:
! 6056: expr (STRING);
! 6057:
! 6058: frm_timeout = intexpr (argptr);
! 6059:
! 6060: if (merr () > OK) goto err;
! 6061: if (frm_timeout < 0L) frm_timeout = 0L;
! 6062: }
! 6063:
! 6064: lock (tmp, frm_timeout, ZALLOCATE);
! 6065: break;
! 6066:
! 6067:
! 6068: case ZDEALLOCATE:
! 6069:
! 6070: tmp[0] = SP;
! 6071:
! 6072: if (*codptr == SP || *codptr == EOL) {
! 6073: tmp[1] = EOL;
! 6074: }
! 6075: else {
! 6076: expr (NAME);
! 6077:
! 6078: if (merr () > OK) goto err;
! 6079:
! 6080: stcpy (&tmp[1], varnam);
! 6081:
! 6082: codptr++;
! 6083: }
! 6084:
! 6085: lock (tmp, -1L, ZDEALLOCATE); /* -1: no timeout */
! 6086: break;
! 6087:
! 6088: /* user defined Z-COMMAND */
! 6089:
! 6090:
! 6091: case PRIVATE:
! 6092:
! 6093: private: /* for in-MUMPS defined commands */
! 6094: i = 0;
! 6095: j = 0;
! 6096: ch = 0;
! 6097:
! 6098: while ((tmp2[i] = *codptr) != EOL) {
! 6099:
! 6100: if (tmp2[i] == SP && !j) {
! 6101: tmp2[i] = EOL;
! 6102: break;
! 6103: }
! 6104:
! 6105: if (tmp2[i] == '"') j = (!j);
! 6106:
! 6107: if (!j) {
! 6108:
! 6109: if (tmp2[i] == '(') ch++;
! 6110: if (tmp2[i] == ')') ch--;
! 6111:
! 6112: if (!ch && tmp2[i] == ',') { /* next argument: */
! 6113:
! 6114: tmp2[i] = EOL; /* call afterwards again */
! 6115: i = 0;
! 6116:
! 6117: while (tmp3[i] != EOL) i++;
! 6118:
! 6119: j = i;
! 6120: ch = 1;
! 6121:
! 6122: while (ch < i) tmp3[j++] = tmp3[ch++];
! 6123:
! 6124: tmp3[j - 1] = SP;
! 6125: tmp3[j] = EOL;
! 6126:
! 6127: codptr++;
! 6128:
! 6129: j = 0;
! 6130: ch = 0;
! 6131:
! 6132: break;
! 6133: }
! 6134: }
! 6135:
! 6136: i++;
! 6137: codptr++;
! 6138: }
! 6139:
! 6140: if (j || ch) {
! 6141: merr_raise (INVREF);
! 6142: goto err;
! 6143: }
! 6144:
! 6145: stcat (tmp3, codptr);
! 6146:
! 6147: if (destructor_run) {
! 6148: stcpy (code, "d \201");
! 6149: destructor_run = FALSE;
! 6150: }
! 6151: else {
! 6152: if (new_object) {
! 6153: stcpy (code, "d ^\201");
! 6154: new_object = FALSE;
! 6155: }
! 6156: else {
! 6157: stcpy (code, "d ^%\201");
! 6158: }
! 6159: }
! 6160:
! 6161: stcat (code, &tmp3[1]);
! 6162:
! 6163: codptr = code;
! 6164: privflag = TRUE;
! 6165:
! 6166: goto next_cmnd;
! 6167:
! 6168: evthandler: /* for event handlers */
! 6169: i = 0;
! 6170: j = 0;
! 6171: ch = 0;
! 6172:
! 6173: while ((tmp2[i] = *codptr) != EOL) {
! 6174:
! 6175: if (tmp2[i] == SP && !j) {
! 6176: tmp2[i] = EOL;
! 6177: break;
! 6178: }
! 6179:
! 6180: if (tmp2[i] == '"') j = (!j);
! 6181:
! 6182: if (!j) {
! 6183:
! 6184: if (tmp2[i] == '(') ch++;
! 6185: if (tmp2[i] == ')') ch--;
! 6186:
! 6187: if (!ch && tmp2[i] == ',') { /* next argument: */
! 6188:
! 6189: tmp2[i] = EOL; /* call afterwards again */
! 6190: i = 0;
! 6191:
! 6192: while (tmp3[i] != EOL) i++;
! 6193:
! 6194: j = i;
! 6195: ch = 1;
! 6196:
! 6197: while (ch < i) tmp3[j++] = tmp3[ch++];
! 6198:
! 6199: tmp3[j - 1] = SP;
! 6200: tmp3[j] = EOL;
! 6201:
! 6202: codptr++;
! 6203:
! 6204: j = 0;
! 6205: ch = 0;
! 6206:
! 6207: break;
! 6208: }
! 6209: }
! 6210:
! 6211: i++;
! 6212: codptr++;
! 6213: }
! 6214:
! 6215: if (j || ch) {
! 6216: merr_raise (INVREF);
! 6217: goto err;
! 6218: }
! 6219:
! 6220: stcpy (code, "d \201");
! 6221: stcat (code, tmp3);
! 6222:
! 6223: codptr = code;
! 6224: privflag = TRUE;
! 6225:
! 6226: goto next_cmnd;
! 6227:
! 6228: case ABLOCK:
! 6229: case AUNBLOCK:
! 6230: {
! 6231: short evt_mask[EVT_MAX];
! 6232:
! 6233: if ((rtn_dialect () != D_MDS) &&
! 6234: (rtn_dialect () != D_FREEM)) {
! 6235: merr_raise (NOSTAND);
! 6236: goto err;
! 6237: }
! 6238:
! 6239: /* declare and initialize table of events to be blocked/unblocked with this command */
! 6240:
! 6241:
! 6242: for (i = 0; i < EVT_MAX; i++) evt_mask[i] = 0;
! 6243:
! 6244:
! 6245: /* argumentless ABLOCK/AUNBLOCK: block/unblock everything */
! 6246: if (((ch = *codptr) == SP) || ch == EOL) {
! 6247:
! 6248: for (i = 0; i < EVT_MAX; i++) evt_mask[i] = 1;
! 6249:
! 6250: }
! 6251: else if (*codptr == '(') {
! 6252: /* exclusive ABLOCK/AUNBLOCK */
! 6253:
! 6254: short evt_exclusions[EVT_MAX];
! 6255:
! 6256: codptr++;
! 6257:
! 6258:
! 6259: for (i = 0; i < EVT_MAX; i++) evt_exclusions[i] = FALSE;
! 6260:
! 6261: for (;;) {
! 6262:
! 6263: expr (STRING);
! 6264:
! 6265: if (merr () == BRAER) merr_clear ();
! 6266: if (merr () > OK) goto err;
! 6267:
! 6268: codptr++;
! 6269:
! 6270: stcpy (vn, argptr);
! 6271:
! 6272: if (stcmp (vn, "COMM\201") == 0) {
! 6273: evt_exclusions[EVT_CLS_COMM] = TRUE;
! 6274: }
! 6275: else if (stcmp (vn, "HALT\201") == 0) {
! 6276: evt_exclusions[EVT_CLS_HALT] = TRUE;
! 6277: }
! 6278: else if (stcmp (vn, "IPC\201") == 0) {
! 6279: evt_exclusions[EVT_CLS_IPC] = TRUE;
! 6280: }
! 6281: else if (stcmp (vn, "INTERRUPT\201") == 0) {
! 6282: evt_exclusions[EVT_CLS_INTERRUPT] = TRUE;
! 6283: }
! 6284: else if (stcmp (vn, "POWER\201") == 0) {
! 6285: evt_exclusions[EVT_CLS_POWER] = TRUE;
! 6286: }
! 6287: else if (stcmp (vn, "TIMER\201") == 0) {
! 6288: evt_exclusions[EVT_CLS_TIMER] = TRUE;
! 6289: }
! 6290: else if (stcmp (vn, "USER\201") == 0) {
! 6291: evt_exclusions[EVT_CLS_USER] = TRUE;
! 6292: }
! 6293: else if (stcmp (vn, "WAPI\201") == 0) {
! 6294: evt_exclusions[EVT_CLS_WAPI] = TRUE;
! 6295: }
! 6296: else {
! 6297: merr_raise (CMMND);
! 6298: goto err;
! 6299: }
! 6300:
! 6301: if ((ch = *(codptr + 1)) == EOL || ch == SP) {
! 6302: codptr++;
! 6303: break;
! 6304: }
! 6305: if ((ch = *(codptr + 1)) == ')') {
! 6306: codptr++;
! 6307: break;
! 6308: }
! 6309:
! 6310: }
! 6311:
! 6312: for (i = 0; i < EVT_MAX; i++) {
! 6313:
! 6314: if (evt_exclusions[i] == FALSE) evt_mask[i] = 1;
! 6315:
! 6316: }
! 6317:
! 6318: }
! 6319: else {
! 6320: /* inclusive ABLOCK/AUNBLOCK */
! 6321:
! 6322: for (;;) {
! 6323:
! 6324: expr (STRING); /* try to interpret a string */
! 6325: if (merr () > OK) goto err;
! 6326:
! 6327: codptr++;
! 6328:
! 6329: stcpy (vn, argptr);
! 6330:
! 6331: if (stcmp (vn, "COMM\201") == 0) {
! 6332: evt_mask[EVT_CLS_COMM] = 1;
! 6333: }
! 6334: else if (stcmp (vn, "HALT\201") == 0) {
! 6335: evt_mask[EVT_CLS_HALT] = 1;
! 6336: }
! 6337: else if (stcmp (vn, "IPC\201") == 0) {
! 6338: evt_mask[EVT_CLS_IPC] = 1;
! 6339: }
! 6340: else if (stcmp (vn, "INTERRUPT\201") == 0) {
! 6341: evt_mask[EVT_CLS_INTERRUPT] = 1;
! 6342: }
! 6343: else if (stcmp (vn, "POWER\201") == 0) {
! 6344: evt_mask[EVT_CLS_POWER] = 1;
! 6345: }
! 6346: else if (stcmp (vn, "TIMER\201") == 0) {
! 6347: evt_mask[EVT_CLS_TIMER] = 1;
! 6348: }
! 6349: else if (stcmp (vn, "TRIGGER\201") == 0) {
! 6350: evt_mask[EVT_CLS_TRIGGER] = 1;
! 6351: }
! 6352: else if (stcmp (vn, "USER\201") == 0) {
! 6353: evt_mask[EVT_CLS_USER] = 1;
! 6354: }
! 6355: else if (stcmp (vn, "WAPI\201") == 0) {
! 6356: evt_mask[EVT_CLS_WAPI] = 1;
! 6357: }
! 6358: else {
! 6359: merr_raise (CMMND);
! 6360: goto err;
! 6361: }
! 6362:
! 6363: if (merr () > OK) goto err;
! 6364:
! 6365:
! 6366: if ((ch = *(codptr)) == EOL || ch == SP) {
! 6367: break;
! 6368: }
! 6369:
! 6370: }
! 6371:
! 6372: }
! 6373:
! 6374: for (i = 0; i < EVT_MAX; i++) {
! 6375:
! 6376: if (evt_mask[i] > 0) {
! 6377:
! 6378: if (mcmnd == ABLOCK) {
! 6379: evt_ablock (i);
! 6380: }
! 6381: else {
! 6382: evt_aunblock (i);
! 6383: }
! 6384: }
! 6385:
! 6386: }
! 6387:
! 6388:
! 6389: break;
! 6390: }
! 6391:
! 6392:
! 6393: case ASSIGN:
! 6394: merr_raise (CMMND);
! 6395: break;
! 6396:
! 6397:
! 6398: case ASTOP:
! 6399: case ASTART:
! 6400: {
! 6401: short evt_mask[EVT_MAX];
! 6402: short new_status;
! 6403:
! 6404: if ((rtn_dialect () != D_MDS) &&
! 6405: (rtn_dialect () != D_FREEM)) {
! 6406: merr_raise (NOSTAND);
! 6407: goto err;
! 6408: }
! 6409:
! 6410: /* declare and initialize table of events to be enabled with this command */
! 6411:
! 6412: if (mcmnd == ASTART) {
! 6413: new_status = EVT_S_ASYNC;
! 6414: }
! 6415: else {
! 6416: new_status = EVT_S_DISABLED;
! 6417: }
! 6418:
! 6419:
! 6420: for (i = 0; i < EVT_MAX; i++) evt_mask[i] = EVT_S_NOMODIFY;
! 6421:
! 6422:
! 6423: /* argumentless ASTART/ASTOP: enable/disable everything */
! 6424: if (((ch = *codptr) == SP) || ch == EOL) {
! 6425:
! 6426: for (i = 0; i < EVT_MAX; i++) evt_mask[i] = new_status;
! 6427:
! 6428: }
! 6429: else if (*codptr == '(') {
! 6430: /* exclusive ASTART */
! 6431:
! 6432: short evt_exclusions[EVT_MAX];
! 6433:
! 6434: codptr++;
! 6435:
! 6436: for (i = 0; i < EVT_MAX; i++) evt_exclusions[i] = FALSE;
! 6437:
! 6438: for (;;) {
! 6439:
! 6440: expr (STRING);
! 6441:
! 6442: if (merr () == BRAER) merr_clear ();
! 6443: if (merr () > OK) goto err;
! 6444:
! 6445: codptr++;
! 6446:
! 6447: stcpy (vn, argptr);
! 6448:
! 6449: if (stcmp (vn, "COMM\201") == 0) {
! 6450: evt_exclusions[EVT_CLS_COMM] = TRUE;
! 6451: }
! 6452: else if (stcmp (vn, "HALT\201") == 0) {
! 6453: evt_exclusions[EVT_CLS_HALT] = TRUE;
! 6454: }
! 6455: else if (stcmp (vn, "IPC\201") == 0) {
! 6456: evt_exclusions[EVT_CLS_IPC] = TRUE;
! 6457: }
! 6458: else if (stcmp (vn, "INTERRUPT\201") == 0) {
! 6459: evt_exclusions[EVT_CLS_INTERRUPT] = TRUE;
! 6460: }
! 6461: else if (stcmp (vn, "POWER\201") == 0) {
! 6462: evt_exclusions[EVT_CLS_POWER] = TRUE;
! 6463: }
! 6464: else if (stcmp (vn, "TIMER\201") == 0) {
! 6465: evt_exclusions[EVT_CLS_TIMER] = TRUE;
! 6466: }
! 6467: else if (stcmp (vn, "USER\201") == 0) {
! 6468: evt_exclusions[EVT_CLS_USER] = TRUE;
! 6469: }
! 6470: else if (stcmp (vn, "WAPI\201") == 0) {
! 6471: evt_exclusions[EVT_CLS_WAPI] = TRUE;
! 6472: }
! 6473: else if (stcmp (vn, "TRIGGER\201") == 0) {
! 6474: evt_exclusions[EVT_CLS_TRIGGER] = TRUE;
! 6475: }
! 6476: else {
! 6477: merr_raise (CMMND);
! 6478: goto err;
! 6479: }
! 6480:
! 6481: if ((ch = *(codptr + 1)) == EOL || ch == SP) {
! 6482: codptr++;
! 6483: break;
! 6484: }
! 6485: if ((ch = *(codptr + 1)) == ')') {
! 6486: codptr++;
! 6487: break;
! 6488: }
! 6489:
! 6490: }
! 6491:
! 6492: for (i = 0; i < EVT_MAX; i++) {
! 6493:
! 6494: if (evt_exclusions[i] == FALSE) evt_mask[i] = new_status;
! 6495:
! 6496: }
! 6497:
! 6498: }
! 6499: else {
! 6500: /* inclusive ASTART */
! 6501:
! 6502: for (;;) {
! 6503:
! 6504: expr (STRING); /* try to interpret a string */
! 6505: if (merr () > OK) goto err;
! 6506:
! 6507: codptr++;
! 6508:
! 6509: stcpy (vn, argptr);
! 6510:
! 6511: if (stcmp (vn, "COMM\201") == 0) {
! 6512: evt_mask[EVT_CLS_COMM] = new_status;
! 6513: }
! 6514: else if (stcmp (vn, "HALT\201") == 0) {
! 6515: evt_mask[EVT_CLS_HALT] = new_status;
! 6516: }
! 6517: else if (stcmp (vn, "IPC\201") == 0) {
! 6518: evt_mask[EVT_CLS_IPC] = new_status;
! 6519: }
! 6520: else if (stcmp (vn, "INTERRUPT\201") == 0) {
! 6521: evt_mask[EVT_CLS_INTERRUPT] = new_status;
! 6522: }
! 6523: else if (stcmp (vn, "POWER\201") == 0) {
! 6524: evt_mask[EVT_CLS_POWER] = new_status;
! 6525: }
! 6526: else if (stcmp (vn, "TIMER\201") == 0) {
! 6527: evt_mask[EVT_CLS_TIMER] = new_status;
! 6528: }
! 6529: else if (stcmp (vn, "USER\201") == 0) {
! 6530: evt_mask[EVT_CLS_USER] = new_status;
! 6531: }
! 6532: else if (stcmp (vn, "WAPI\201") == 0) {
! 6533: evt_mask[EVT_CLS_WAPI] = new_status;
! 6534: }
! 6535: else if (stcmp (vn, "TRIGGER\201") == 0) {
! 6536: evt_mask[EVT_CLS_TRIGGER] = new_status;
! 6537: }
! 6538: else {
! 6539: merr_raise (CMMND);
! 6540: goto err;
! 6541: }
! 6542:
! 6543: if (merr () > OK) goto err;
! 6544:
! 6545:
! 6546: if ((ch = *(codptr)) == EOL || ch == SP) {
! 6547: break;
! 6548: }
! 6549:
! 6550: }
! 6551:
! 6552: }
! 6553:
! 6554: for (i = 0; i < EVT_MAX; i++) {
! 6555:
! 6556: if (evt_status[i] == EVT_S_SYNC && evt_mask[i] == EVT_S_ASYNC) {
! 6557:
! 6558: /* cannot enable both synchronous and asynchronous
! 6559: event processing on the same event class at the
! 6560: same time */
! 6561:
! 6562: merr_raise (M102);
! 6563: goto err;
! 6564:
! 6565: }
! 6566: else {
! 6567:
! 6568: if (evt_mask[i] > EVT_S_NOMODIFY) {
! 6569: evt_status[i] = evt_mask[i];
! 6570: }
! 6571:
! 6572: }
! 6573:
! 6574: }
! 6575:
! 6576: if (mcmnd == ASTART) {
! 6577: evt_async_enabled = TRUE;
! 6578: }
! 6579: else {
! 6580: short disabled_evt_count = 0;
! 6581:
! 6582: for (i = 0; i < EVT_MAX; i++) {
! 6583: if (evt_status[i] == EVT_S_DISABLED) {
! 6584: disabled_evt_count++;
! 6585: }
! 6586: }
! 6587:
! 6588: if (disabled_evt_count == (EVT_MAX - 1)) evt_async_enabled = FALSE;
! 6589:
! 6590: }
! 6591:
! 6592: break;
! 6593: }
! 6594:
! 6595:
! 6596:
! 6597:
! 6598: case ETRIGGER:
! 6599:
! 6600: merr_raise (CMMND);
! 6601: break;
! 6602:
! 6603:
! 6604: #if defined(HAVE_MWAPI_MOTIF)
! 6605: case ESTART:
! 6606: if ((rtn_dialect () != D_MDS) &&
! 6607: (rtn_dialect () != D_FREEM)) {
! 6608: merr_raise (NOSTAND);
! 6609: goto err;
! 6610: }
! 6611:
! 6612: {
! 6613: if (in_syn_event_loop == TRUE) break;
! 6614:
! 6615: int evt_count;
! 6616: char *syn_handlers = (char *) malloc (STRLEN * sizeof (char));
! 6617:
! 6618: /* stack ^$EVENT */
! 6619: char key[100] = "^$EVENT\202\201";
! 6620: symtab (new_sym, key, " \201");
! 6621:
! 6622: evt_sync_enabled = TRUE;
! 6623: in_syn_event_loop = TRUE;
! 6624:
! 6625: while (evt_sync_enabled) {
! 6626:
! 6627:
! 6628: /* run the next iteration of GTK's event loop */
! 6629: //TODO: replace with libXt event loop
! 6630: //gtk_main_iteration_do (TRUE);
! 6631:
! 6632: /* dequeue any events */
! 6633: evt_count = mwapi_dequeue_events (syn_handlers);
! 6634:
! 6635: if (evt_count) {
! 6636: /* write them out */
! 6637: //printf ("event handlers = '%s'\r\n", syn_handlers);
! 6638:
! 6639: syn_event_entry_nstx = nstx;
! 6640:
! 6641: stcnv_c2m (syn_handlers);
! 6642: stcpy (tmp3, syn_handlers);
! 6643:
! 6644: syn_handlers[0] = '\0';
! 6645:
! 6646: goto evthandler;
! 6647: }
! 6648:
! 6649: syn_evt_loop_bottom:
! 6650: continue;
! 6651: }
! 6652:
! 6653: in_syn_event_loop = FALSE;
! 6654: evt_sync_enabled = FALSE;
! 6655:
! 6656: break;
! 6657: }
! 6658:
! 6659:
! 6660: case ESTOP:
! 6661: if ((rtn_dialect () != D_MDS) &&
! 6662: (rtn_dialect () != D_FREEM)) {
! 6663: merr_raise (NOSTAND);
! 6664: goto err;
! 6665: }
! 6666:
! 6667: evt_sync_enabled = FALSE;
! 6668: break;
! 6669: #endif
! 6670:
! 6671:
! 6672: default:
! 6673: merr_raise (CMMND);
! 6674:
! 6675: } /* command switch */
! 6676:
! 6677: if ((ch = *codptr) == EOL) {
! 6678: if (merr () != OK) goto err;
! 6679: if (forsw) goto for_end;
! 6680:
! 6681: mcmnd = 0;
! 6682:
! 6683: goto next_line;
! 6684: }
! 6685:
! 6686: if (ch == SP) {
! 6687: if (merr () == OK) goto next0;
! 6688:
! 6689: goto err;
! 6690: }
! 6691:
! 6692: if (ch != ',' && merr () == OK) {
! 6693: merr_raise (SPACER);
! 6694: }
! 6695: else if ((ierr <= OK) || (debug_mode == TRUE)) {
! 6696: if (debug_mode) goto direct_mode;
! 6697: if (*++codptr != SP && *codptr != EOL) goto again;
! 6698:
! 6699: merr_raise (ARGLIST);
! 6700: }
! 6701:
! 6702: /* else goto err; */
! 6703:
! 6704: /* error */
! 6705: err:
! 6706:
! 6707: /* avoid infinite loops resulting from errors in argumentless FOR loops */
! 6708: if (merr () != OK && merr () != ASYNC && forsw && ftyp == 0) {
! 6709: argless_forsw_quit = TRUE;
! 6710: goto for_end;
! 6711: }
! 6712:
! 6713: /*
! 6714: * ierr == ASYNC means that the previous command was interrupted by
! 6715: * an async event. It is not a real error, so just go on to the next
! 6716: * command after resetting ierr = OK.
! 6717: */
! 6718: if (merr () == ASYNC) {
! 6719: merr_clear ();
! 6720: goto next_cmnd;
! 6721: }
! 6722:
! 6723: if (merr () > OK) {
! 6724: job_set_status (pid, JSTAT_ERROR);
! 6725: }
! 6726:
! 6727: if (ierr < 0) {
! 6728:
! 6729: ierr += CTRLB;
! 6730:
! 6731: if (merr () == OK) {
! 6732: zbflag = TRUE;
! 6733:
! 6734: goto zb_entry;
! 6735: }
! 6736: }
! 6737:
! 6738: if (merr () > OK ) {
! 6739:
! 6740: char er_buf[ERRLEN];
! 6741:
! 6742: merr_set_ecode_ierr ();
! 6743:
! 6744: stcpy (er_buf, errmes[merr ()]);
! 6745: stcnv_m2c (er_buf);
! 6746:
! 6747: #if !defined(MSDOS)
! 6748: m_log (LOG_ERR, er_buf);
! 6749: #endif
! 6750:
! 6751: }
! 6752:
! 6753: zerr = ierr;
! 6754: merr_clear ();
! 6755:
! 6756: /* goto restart; */
! 6757:
! 6758:
! 6759: restart:
! 6760:
! 6761: if (param) goto restore;
! 6762:
! 6763: dosave[0] = EOL;
! 6764: setpiece = FALSE;
! 6765: setop = 0;
! 6766: privflag = FALSE;
! 6767:
! 6768: if (merr () == INRPT) goto err;
! 6769: if (zerr == STORE) symtab (kill_all, "", "");
! 6770:
! 6771: if (errfunlvl > 0) {
! 6772: errfunlvl--;
! 6773: }
! 6774: else {
! 6775:
! 6776: if (zerr == OK) {
! 6777: zerror[0] = EOL; /* reset error */
! 6778: }
! 6779: else {
! 6780:
! 6781: #ifdef DEBUG_STACK
! 6782: printf ("Storing NESTERR\r\n");
! 6783: #endif
! 6784:
! 6785: nesterr = nstx; /* save stack information at error */
! 6786:
! 6787: for (i = 1; i <= nstx; i++) getraddress (callerr[i], i);
! 6788:
! 6789: zerror[0] = '<';
! 6790:
! 6791: if (etxtflag) {
! 6792: stcpy (&zerror[1], errmes[zerr]);
! 6793: }
! 6794: else {
! 6795: intstr (&zerror[1], zerr);
! 6796: }
! 6797:
! 6798: stcat (zerror, ">\201");
! 6799:
! 6800: if (rou_name[0] != EOL) {
! 6801: char *j0;
! 6802: char *j1;
! 6803: char tmp1[256];
! 6804:
! 6805:
! 6806:
! 6807: if (nestc[nstx] == XECUTE) {
! 6808:
! 6809: if (nestn[nstx]) { /* reload routine */
! 6810: zload (nestn[nstx]);
! 6811: merr_clear ();
! 6812: }
! 6813:
! 6814: roucur = nestr[nstx] + rouptr; /* restore roucur */
! 6815: }
! 6816:
! 6817:
! 6818:
! 6819: j0 = (rouptr - 1);
! 6820: j = 0;
! 6821: tmp1[0] = EOL;
! 6822: j0++;
! 6823:
! 6824: if (roucur < rouend) {
! 6825:
! 6826: while (j0 < (roucur - 1)) {
! 6827:
! 6828: j1 = j0++;
! 6829: j++;
! 6830:
! 6831: if ((*j0 != TAB) && (*j0 != SP)) {
! 6832:
! 6833: j = 0;
! 6834:
! 6835: while ((tmp1[j] = (*(j0++))) > SP) {
! 6836:
! 6837: if (tmp1[j] == '(') tmp1[j] = EOL;
! 6838:
! 6839: j++;
! 6840: }
! 6841:
! 6842: tmp1[j] = EOL;
! 6843: j = 0;
! 6844: }
! 6845:
! 6846: j0 = j1;
! 6847: j0 += (UNSIGN (*j1)) + 2;
! 6848: }
! 6849: }
! 6850:
! 6851: stcat (zerror, tmp1);
! 6852:
! 6853: if (j > 0) {
! 6854: i = stlen (zerror);
! 6855: zerror[i++] = '+';
! 6856:
! 6857: intstr (&zerror[i], j);
! 6858: }
! 6859:
! 6860: stcat (zerror, "^\201");
! 6861:
! 6862:
! 6863:
! 6864: if (nestc[nstx] == XECUTE) {
! 6865:
! 6866: if (nestn[nstx]) { /* reload routine */
! 6867: zload (rou_name);
! 6868:
! 6869: ssvn_job_update ();
! 6870:
! 6871: merr_clear ();
! 6872: }
! 6873:
! 6874: stcat (zerror, nestn[nstx]);
! 6875: }
! 6876: else
! 6877: stcat (zerror, rou_name);
! 6878: }
! 6879:
! 6880: if (zerr == UNDEF) zerr = M6;
! 6881:
! 6882: /* undefined: report variable name */
! 6883: if (zerr == UNDEF || zerr == SBSCR || zerr == NAKED || zerr == ZTERR || zerr == DBDGD || zerr == LBLUNDEF || zerr == NOPGM || zerr == M6 || zerr == M7 || zerr == M13) {
! 6884:
! 6885: int f; /* include erroneous reference */
! 6886:
! 6887: f = stlen (zerror);
! 6888: zerror[f++] = SP;
! 6889: zname (&zerror[f], varerr);
! 6890: } /* end varnam section */
! 6891: }
! 6892: }
! 6893:
! 6894: roucur = buff + (NO_OF_RBUF * PSIZE0 + 1);
! 6895: tmp4[0] = EOL;
! 6896:
! 6897: while (ierr != (OK - CTRLB)) {
! 6898:
! 6899:
! 6900: /* standard error handling */
! 6901: if (etrap[0] != EOL && stcmp (ecode, "") != 0) {
! 6902:
! 6903: on_frame_entry ();
! 6904:
! 6905: /* disable $ZTRAP error handling */
! 6906: ztrap[nstx][0] = EOL;
! 6907:
! 6908: stcpy (tmp4, etrap);
! 6909: stcat (tmp4, " quit:$quit \"\" quit\201");
! 6910:
! 6911: if (etrap_lvl > 1) {
! 6912: /* we've encountered an error within an error handler.
! 6913: save off the error code at merr_stack[nstx + 1].ECODE */
! 6914:
! 6915: stcpy (merr_stack[nstx + 1].ECODE, ecode);
! 6916: merr_topstk = nstx + 1;
! 6917: etrap_lvl++;
! 6918:
! 6919: }
! 6920: else {
! 6921: merr_topstk = nstx;
! 6922: etrap_lvl++;
! 6923: }
! 6924:
! 6925: break;
! 6926:
! 6927: }
! 6928:
! 6929:
! 6930:
! 6931: if (ztrap[nstx][0] != EOL && !DSM2err) {
! 6932:
! 6933: #ifdef DEBUG_NEWSTACK
! 6934:
! 6935: printf ("Dropped into Ztrap [");
! 6936:
! 6937: for (loop = 0; loop < 20 && ztrap[nstx][loop] != EOL; loop++) {
! 6938: printf ("%c", ztrap[nstx][loop]);
! 6939: }
! 6940:
! 6941: printf ("]\r\n");
! 6942:
! 6943: #endif
! 6944:
! 6945: tmp4[0] = GOTO;
! 6946: tmp4[1] = SP;
! 6947: stcpy (&tmp4[2], ztrap[nstx]);
! 6948: ztrap[nstx][0] = EOL;
! 6949:
! 6950: #ifdef DEBUG_NEWSTACK
! 6951:
! 6952: printf ("Set tmp4 to [");
! 6953: for (loop = 0; tmp4[loop] != EOL; loop++) printf ("%c", tmp4[loop]);
! 6954: printf ("]\r\n");
! 6955:
! 6956: #endif
! 6957:
! 6958: break;
! 6959: }
! 6960:
! 6961:
! 6962:
! 6963: if (nstx == 0) {
! 6964:
! 6965: #ifdef DEBUG_NEWSTACK
! 6966: printf ("Nestx was Zero\r\n");
! 6967: #endif
! 6968:
! 6969: forx = 0;
! 6970: cmdptr = cmdstack;
! 6971: namptr = namstck;
! 6972: level = 0;
! 6973: errfunlvl = 0;
! 6974: io = HOME; /* trap to direct mode: USE 0 */
! 6975:
! 6976: if (zerr == INRPT && frm_filter) {
! 6977: tmp4[0] = 'h';
! 6978: tmp4[1] = EOL;
! 6979: }
! 6980:
! 6981: if (DSM2err && (ztrap[NESTLEVLS + 1][0] != EOL)) { /* DSM V.2 error trapping */
! 6982:
! 6983: #ifdef DEBUG_NEWSTACK
! 6984: printf ("Ztrap 2\r\n");
! 6985: #endif
! 6986:
! 6987: tmp4[0] = GOTO;
! 6988: tmp4[1] = SP; /* GOTO errorhandling */
! 6989:
! 6990: stcpy (&tmp4[2], ztrap[NESTLEVLS + 1]);
! 6991: ztrap[NESTLEVLS + 1][0] = EOL;
! 6992:
! 6993: }
! 6994:
! 6995: break;
! 6996: }
! 6997:
! 6998: #ifdef DEBUG_NEWSTACK
! 6999: printf ("Nestc[nstx] is [%d]\r\n", nestc[nstx]);
! 7000: #endif
! 7001:
! 7002: if (nestc[nstx] == BREAK) break;
! 7003:
! 7004: if (merr () > OK) goto err;
! 7005:
! 7006: if (nestc[nstx] == FOR) {
! 7007: if (forx == 0) goto for_quit;
! 7008: ftyp = fortyp[--forx];
! 7009: fvar = forvar[forx];
! 7010: finc = forinc[forx];
! 7011: flim = forlim[forx];
! 7012: fi = fori[forx];
! 7013: }
! 7014: else {
! 7015:
! 7016: if (nestc[nstx] == DO_BLOCK) {
! 7017: test = nestlt[nstx];
! 7018: level--;
! 7019: }
! 7020: else { /* pop $TEST */
! 7021: level = nestlt[nstx]; /* pop level */
! 7022: }
! 7023:
! 7024: #ifdef DEBUG_NEWSTACK
! 7025: printf ("Nestn[nstx] is [%d]\r\n", nestn[nstx]);
! 7026: #endif
! 7027:
! 7028: if (nestn[nstx]) { /* 'reload' routine */
! 7029: namptr = nestn[nstx];
! 7030: stcpy (rou_name, namptr);
! 7031: zload (rou_name);
! 7032:
! 7033: ssvn_job_update ();
! 7034:
! 7035: dosave[0] = 0;
! 7036:
! 7037: namptr--;
! 7038: }
! 7039:
! 7040: #ifdef DEBUG_NEWSTACK
! 7041: printf ("Execcing the rest...\r\n");
! 7042: #endif
! 7043:
! 7044: roucur = nestr[nstx] + rouptr;
! 7045:
! 7046: if (nestnew[nstx]) unnew (); /* un-NEW variables */
! 7047:
! 7048: cmdptr = nestp[nstx];
! 7049:
! 7050: if (nestc[nstx--] == '$') { /* extrinsic function/variable */
! 7051: *argptr = EOL;
! 7052: merr_raise (zerr);
! 7053: errfunlvl++;
! 7054:
! 7055: return 0;
! 7056: }
! 7057: estack--;
! 7058: }
! 7059: }
! 7060:
! 7061: forsw = FALSE;
! 7062:
! 7063: /* PRINTING ERROR MESSAGES */
! 7064: if (tmp4[0] == EOL) {
! 7065:
! 7066: if (zerr == BKERR && brkaction[0] != EOL) {
! 7067: stcpy (code, brkaction);
! 7068: codptr = code;
! 7069:
! 7070: if (libcall == TRUE) {
! 7071: return zerr;
! 7072: }
! 7073: else {
! 7074: goto next_cmnd;
! 7075: }
! 7076: }
! 7077:
! 7078: if (libcall == TRUE) return zerr;
! 7079:
! 7080: DSW &= ~BIT0; /* enable ECHO */
! 7081:
! 7082: // print here
! 7083: {
! 7084: char *t_rtn;
! 7085: char *t_nsn = (char *) malloc (STRLEN * sizeof (char));
! 7086: char *t_cod;
! 7087: int t_pos;
! 7088:
! 7089: NULLPTRCHK(t_nsn,"xecline");
! 7090:
! 7091: t_rtn = strtok (zerror, ">");
! 7092: t_rtn = strtok (NULL, ">");
! 7093:
! 7094: if (t_rtn != NULL && t_rtn[1] == '%') {
! 7095: strcpy (t_nsn, "SYSTEM");
! 7096: }
! 7097: else {
! 7098: strcpy (t_nsn, nsname);
! 7099: }
! 7100:
! 7101: if (deferred_ierr > OK) {
! 7102: t_cod = deferrable_code;
! 7103: t_pos = deferrable_codptr - code + 3;
! 7104: }
! 7105: else {
! 7106: t_cod = code;
! 7107: t_pos = codptr - code + 3;
! 7108: }
! 7109:
! 7110: if (t_rtn != NULL) {
! 7111: merr_dump (zerr, t_rtn, t_nsn, t_cod, t_pos);
! 7112: }
! 7113: else {
! 7114: merr_dump (zerr, "<UNKNOWN>", t_nsn, t_cod, t_pos);
! 7115: }
! 7116:
! 7117:
! 7118: free (t_nsn);
! 7119: }
! 7120:
! 7121:
! 7122: }
! 7123: else {
! 7124: stcpy (code, tmp4);
! 7125:
! 7126: codptr = code;
! 7127: tmp4[0] = EOL;
! 7128:
! 7129: goto next_cmnd;
! 7130: }
! 7131:
! 7132: restore:
! 7133:
! 7134: io = HOME;
! 7135: codptr = code;
! 7136:
! 7137: if (param > 0) {
! 7138:
! 7139: j = 0;
! 7140: ch = 0;
! 7141: paramx++;
! 7142: param--;
! 7143:
! 7144: for (;;) {
! 7145: if (m_argv[++j][0] == '-') {
! 7146: i = 0;
! 7147:
! 7148: while ((m_argv[j][++i] != 0) && (m_argv[j][i] != 'x'));
! 7149:
! 7150: if (m_argv[j][i] != 'x') continue;
! 7151:
! 7152: j++;
! 7153:
! 7154: if (++ch < paramx) continue;
! 7155:
! 7156: strcpy (code, m_argv[j]);
! 7157: break;
! 7158: }
! 7159: else {
! 7160: if (++ch < paramx) continue;
! 7161:
! 7162: strcpy (code, "d ");
! 7163: strcpy (&code[2], m_argv[j]);
! 7164: break;
! 7165: }
! 7166: }
! 7167: code[strlen (code)] = EOL;
! 7168: codptr = code;
! 7169: goto next_cmnd;
! 7170:
! 7171: }
! 7172:
! 7173: if (usermode == 0) { /* application mode: direct mode implies HALT */
! 7174: code[0] = 'H';
! 7175: code[1] = EOL;
! 7176: codptr = code;
! 7177:
! 7178: goto next_cmnd;
! 7179: }
! 7180: else {
! 7181: if (debug_mode) goto direct_mode;
! 7182: }
! 7183:
! 7184: if (libcall == TRUE) { /* library mode: don't go to direct mode, just return */
! 7185: return merr ();
! 7186: }
! 7187:
! 7188:
! 7189: do {
! 7190:
! 7191: if (frm_filter == FALSE && promflag) {
! 7192: stcpy (code, " \201");
! 7193: stcpy (&code[2], " \201");
! 7194: promflag = FALSE;
! 7195: }
! 7196: else {
! 7197:
! 7198: direct_mode:
! 7199:
! 7200: if (dbg_enable_watch && dbg_pending_watches) dbg_dump_watchlist ();
! 7201:
! 7202: /* DIRECT-MODE PROMPT HERE */
! 7203: #if defined(HAVE_LIBREADLINE) && !defined(_AIX)
! 7204: {
! 7205: char *fmrl_buf;
! 7206: char fmrl_prompt[256];
! 7207: HIST_ENTRY **hist_list;
! 7208: int hist_idx;
! 7209: HIST_ENTRY *hist_ent;
! 7210:
! 7211: if (quiet_mode == FALSE) {
! 7212: if (tp_level == 0) {
! 7213: snprintf (fmrl_prompt, 255, "\r\n%s> ", nsname);
! 7214: }
! 7215: else {
! 7216: snprintf (fmrl_prompt, 255, "\r\nTL%d:%s> ", tp_level, nsname);
! 7217: }
! 7218: }
! 7219: set_io (UNIX);
! 7220:
! 7221: job_set_status (pid, JSTAT_DIRECTMODE);
! 7222:
! 7223: /* readline() does its own malloc() */
! 7224: fmrl_buf = readline (fmrl_prompt);
! 7225:
! 7226: if (!fmrl_buf) {
! 7227: set_io (UNIX);
! 7228: printf ("\n");
! 7229: set_io (MUMPS);
! 7230:
! 7231: goto halt;
! 7232: }
! 7233:
! 7234: if (strlen (fmrl_buf) > 0) {
! 7235: add_history (fmrl_buf);
! 7236: }
! 7237:
! 7238: if (fmrl_buf[0] == '?') {
! 7239:
! 7240: char kb[20];
! 7241: char db[255];
! 7242:
! 7243: snprintf (kb, 19, "%%SYS.HLP\201");
! 7244: snprintf (db, 19, "\201");
! 7245:
! 7246: symtab (kill_sym, kb, db);
! 7247:
! 7248: /* Invoke Online Help */
! 7249:
! 7250: set_io (MUMPS);
! 7251: stcpy (code, "DO ^%ZHELP\201");
! 7252:
! 7253: if (strlen (fmrl_buf) > 1) {
! 7254: snprintf (db, 254, "%s\201", &fmrl_buf[1]);
! 7255: symtab (set_sym, kb, db);
! 7256: }
! 7257:
! 7258: }
! 7259: else if (strcmp (fmrl_buf, "step") == 0) {
! 7260: debug_mode = TRUE;
! 7261: goto zgo;
! 7262: }
! 7263: else if ((strcmp (fmrl_buf, "cont") == 0) || (strcmp (fmrl_buf, "continue") == 0)) {
! 7264: debug_mode = FALSE;
! 7265: }
! 7266: else if (strcmp (fmrl_buf, "rbuf") == 0) {
! 7267: rbuf_dump ();
! 7268: }
! 7269: else if (strcmp (fmrl_buf, "jobtab") == 0) {
! 7270: job_dump ();
! 7271: }
! 7272: else if (strcmp (fmrl_buf, "locktab") == 0) {
! 7273: locktab_dump ();
! 7274: code[0] = '\201';
! 7275: codptr = code;
! 7276: }
! 7277: else if (strcmp (fmrl_buf, "shmstat") == 0) {
! 7278: shm_dump ();
! 7279: }
! 7280: else if (strcmp (fmrl_buf, "shmpages") == 0) {
! 7281: shm_dump_pages ();
! 7282: }
! 7283: else if (strcmp (fmrl_buf, "glstat") == 0) {
! 7284: gbl_dump_stat ();
! 7285: }
! 7286: else if (strcmp (fmrl_buf, "events") == 0) {
! 7287:
! 7288: char stat_desc[30];
! 7289: char *evclass_name;
! 7290:
! 7291: printf ("\n%-20s %-15s %s\n", "Event Class", "Processing Mode", "ABLOCK Count");
! 7292: printf ("%-20s %-15s %s\n", "-----------", "---------------", "------------");
! 7293:
! 7294: for (i = 0; i < EVT_MAX; i++) {
! 7295:
! 7296: evclass_name = evt_class_name_c (i);
! 7297:
! 7298: switch (evt_status[i]) {
! 7299: case EVT_S_DISABLED:
! 7300: strcpy (stat_desc, "Disabled");
! 7301: break;
! 7302: case EVT_S_ASYNC:
! 7303: strcpy (stat_desc, "Asynchronous");
! 7304: break;
! 7305: case EVT_S_SYNC:
! 7306: strcpy (stat_desc, "Synchronous");
! 7307: }
! 7308:
! 7309: printf ("%-20s %-15s %d\n", evclass_name, stat_desc, evt_blocks[i]);
! 7310:
! 7311: }
! 7312:
! 7313:
! 7314: }
! 7315: else if (strcmp (fmrl_buf, "wh") == 0) {
! 7316: write_history (history_file);
! 7317: }
! 7318: else if (strcmp (fmrl_buf, "trantab") == 0) {
! 7319: tp_tdump();
! 7320: }
! 7321: else if (isdigit(fmrl_buf[0]) || (fmrl_buf[0] == '(') || (fmrl_buf[0] == '-') || (fmrl_buf[0] == '\'') || (fmrl_buf[0] == '+') || (fmrl_buf[0] == '$') || (fmrl_buf[0] == '^')) {
! 7322:
! 7323: snprintf (code, 255, "W %s", fmrl_buf);
! 7324: stcnv_c2m (code);
! 7325:
! 7326: set_io (MUMPS);
! 7327:
! 7328: }
! 7329: #if !defined(__APPLE__)
! 7330: else if (strcmp (fmrl_buf, "history") == 0) {
! 7331:
! 7332: /* History List */
! 7333:
! 7334: hist_list = history_list ();
! 7335: if (hist_list) {
! 7336:
! 7337: for (i = 0; hist_list[i]; i++) {
! 7338: printf("%d: %s\n", i + history_base, hist_list[i]->line);
! 7339: }
! 7340:
! 7341: }
! 7342:
! 7343: stcpy (code, " \201");
! 7344:
! 7345: set_io (MUMPS);
! 7346:
! 7347: }
! 7348: #endif
! 7349: else if (strncmp (fmrl_buf, "rcl", 3) == 0) {
! 7350:
! 7351: /* Recall History Item */
! 7352:
! 7353:
! 7354:
! 7355: if (!isdigit (fmrl_buf[4])) {
! 7356: fprintf (stderr, "invalid history index '%s'\n", &fmrl_buf[4]);
! 7357:
! 7358: set_io (MUMPS);
! 7359: stcpy (code, " \201");
! 7360:
! 7361: break;
! 7362: }
! 7363:
! 7364: hist_idx = atoi (&fmrl_buf[4]);
! 7365:
! 7366: if ((hist_idx > history_length) || (hist_idx < 1)) {
! 7367: fprintf (stderr, "history entry %d out of range (valid entries are 1-%d)\n", hist_idx, history_length);
! 7368:
! 7369: set_io (MUMPS);
! 7370: stcpy (code, " \201");
! 7371:
! 7372: break;
! 7373: }
! 7374:
! 7375: hist_ent = history_get (hist_idx);
! 7376:
! 7377: printf ("%s\n", hist_ent->line);
! 7378:
! 7379: strncpy (code, hist_ent->line, 255);
! 7380: stcnv_c2m (code);
! 7381:
! 7382: set_io (MUMPS);
! 7383:
! 7384: }
! 7385: else {
! 7386:
! 7387: /* Pass to M Interpreter */
! 7388:
! 7389: set_io (MUMPS);
! 7390:
! 7391: strncpy (code, fmrl_buf, 255);
! 7392: stcnv_c2m (code);
! 7393:
! 7394: }
! 7395:
! 7396: /* free the buffer malloc()'d by readline() */
! 7397: if (fmrl_buf) free (fmrl_buf);
! 7398: }
! 7399: #else
! 7400:
! 7401: {
! 7402: char fmrl_prompt[256];
! 7403:
! 7404: if (tp_level == 0) {
! 7405: snprintf (fmrl_prompt, 256, "\r\n%s> \201", nsname);
! 7406: }
! 7407: else {
! 7408: snprintf (fmrl_prompt, 256, "\r\nTL%d:%s> \201", tp_level, nsname);
! 7409: }
! 7410:
! 7411: write_m (fmrl_prompt);
! 7412:
! 7413: read_m (code, -1L, 0, 255); /* Not necessarily STRLEN? */
! 7414: }
! 7415:
! 7416: promflag = TRUE;
! 7417: #endif
! 7418:
! 7419: if (merr () > OK) goto err;
! 7420:
! 7421:
! 7422: // printf ("zbflag = %d\r\n", zbflag);
! 7423:
! 7424: if (code[0] == EOL && zbflag && nestc[nstx] == BREAK) {
! 7425:
! 7426: //printf ("cont single step\r\n");
! 7427: debug_mode = TRUE;
! 7428: merr_raise (OK - CTRLB);
! 7429:
! 7430: //printf ("ierr now '%d'\r\n", ierr);
! 7431: goto zgo;
! 7432: } /* single step */
! 7433: }
! 7434: }
! 7435: while (code[0] == EOL);
! 7436:
! 7437: if (promflag) write_m ("\r\n\201");
! 7438:
! 7439: /* automatic ZI in direct mode: insert an entry with TAB */
! 7440: i = (-1);
! 7441: j = 0;
! 7442: merr_clear ();
! 7443:
! 7444: while (code[++i] != EOL) {
! 7445: if (code[i] == '"') toggle (j);
! 7446:
! 7447: if (code[i] == TAB && j == 0) {
! 7448: dosave[0] = EOL;
! 7449:
! 7450: zi (code, rouins);
! 7451: if (merr ()) goto err;
! 7452: goto restore;
! 7453: }
! 7454: }
! 7455:
! 7456: code[++i] = EOL;
! 7457: code[++i] = EOL;
! 7458:
! 7459: roucur = buff + (NO_OF_RBUF * PSIZE0 + 1);
! 7460:
! 7461: goto next_cmnd;
! 7462:
! 7463: skip_line:
! 7464:
! 7465: if (forsw) goto for_end;
! 7466: goto next_line;
! 7467:
! 7468: } /*end of xecline() */
! 7469:
! 7470: void on_frame_entry(void)
! 7471: {
! 7472: return;
! 7473: }
! 7474:
! 7475: void rbuf_dump(void)
! 7476: {
! 7477: register int i;
! 7478: char rnam[256];
! 7479: char rpth[256];
! 7480: char ldtime[80];
! 7481: char flgs[80];
! 7482: time_t ag;
! 7483: struct tm tld;
! 7484:
! 7485:
! 7486: printf ("ROUTINE BUFFER CONFIGURATION\r\n");
! 7487: printf (" ROUTINE BUFFER COUNT: %d\r\n", NO_OF_RBUF);
! 7488: printf (" MAX. ROUTINE BUFFER COUNT: %d\r\n", MAXNO_OF_RBUF);
! 7489: printf (" DEFAULT ROUTINE BUFFER SIZE (EACH): %d BYTES\r\n", DEFPSIZE0 - 1);
! 7490: printf (" CURRENT ROUTINE BUFFER SIZE (EACH): %d BYTES\r\n\r\n", PSIZE0 - 1);
! 7491: printf ("BUFFERS IN USE:\r\n\r\n");
! 7492:
! 7493:
! 7494: for (i = 0; i < NO_OF_RBUF; i++) {
! 7495:
! 7496: sprintf (flgs, "");
! 7497:
! 7498: if (ages[i] == 0) {
! 7499: sprintf (rnam, "---------");
! 7500: sprintf (rpth, "[buffer empty]");
! 7501: sprintf (ldtime, "n/a");
! 7502: sprintf (flgs, "n/a");
! 7503: }
! 7504: else {
! 7505: stcpy (rnam, pgms[i]);
! 7506: stcnv_m2c (rnam);
! 7507:
! 7508: stcpy (rpth, path[i]);
! 7509: stcnv_m2c (rpth);
! 7510:
! 7511: ag = ages[i];
! 7512: tld = *localtime (&ag);
! 7513:
! 7514: strftime (ldtime, 80, "%a %Y-%m-%d %H:%M:%S %Z", &tld);
! 7515: if (rbuf_flags[i].dialect != D_FREEM) {
! 7516: strcat (flgs, "STANDARD");
! 7517:
! 7518: switch (rbuf_flags[i].dialect) {
! 7519:
! 7520: case D_M77:
! 7521: strcat (flgs, " [M 1977]");
! 7522: break;
! 7523:
! 7524: case D_M84:
! 7525: strcat (flgs, " [M 1984]");
! 7526: break;
! 7527:
! 7528: case D_M90:
! 7529: strcat (flgs, " [M 1990]");
! 7530: break;
! 7531:
! 7532: case D_M95:
! 7533: strcat (flgs, " [M 1995]");
! 7534: break;
! 7535:
! 7536: case D_MDS:
! 7537: strcat (flgs, " [MILLENNIUM DRAFT]");
! 7538: break;
! 7539:
! 7540: case D_M5:
! 7541: strcat (flgs, " [M5]");
! 7542: break;
! 7543: }
! 7544:
! 7545: }
! 7546: else {
! 7547: strcat (flgs, "FREEM");
! 7548: }
! 7549: }
! 7550:
! 7551: if (ages[i] != 0) {
! 7552: printf ("#%d [ROUTINE '%s']\r\n", i, rnam);
! 7553: printf (" UNIX PATH: %s\r\n", rpth);
! 7554: printf (" LAST ACCESS: %s\r\n", ldtime);
! 7555: printf (" DIALECT: %s\r\n", flgs);
! 7556: }
! 7557:
! 7558: }
! 7559:
! 7560: }
! 7561:
! 7562: short rbuf_slot_from_name(char *rnam)
! 7563: {
! 7564: register short i;
! 7565:
! 7566: for (i = 0; i < NO_OF_RBUF; i++) {
! 7567: if (stcmp (rnam, pgms[i]) == 0) {
! 7568: return i;
! 7569: }
! 7570: }
! 7571:
! 7572: return -1;
! 7573: }
! 7574:
! 7575: short is_standard(void)
! 7576: {
! 7577:
! 7578: if (rtn_dialect () == D_FREEM) {
! 7579: return FALSE;
! 7580: }
! 7581: else {
! 7582: return TRUE;
! 7583: }
! 7584:
! 7585: }
! 7586:
! 7587: int rtn_dialect(void)
! 7588: {
! 7589: short slot;
! 7590:
! 7591: slot = rbuf_slot_from_name (rou_name);
! 7592:
! 7593: return rbuf_flags[slot].dialect;
! 7594: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>