--- freem/src/xecline.c 2025/01/19 02:04:04 1.1 +++ freem/src/xecline.c 2025/04/02 03:02:42 1.11 @@ -1,23 +1,11 @@ /* - * * - * * * - * * * - * *************** - * * * * * - * * MUMPS * - * * * * * - * *************** - * * * - * * * - * * - * - * xecline.c + * $Id: xecline.c,v 1.11 2025/04/02 03:02:42 snw Exp $ * freem interpreter proper * * - * Author: Serena Willis + * Author: Serena Willis * Copyright (C) 1998 MUG Deutschland - * Copyright (C) 2020 Coherent Logic Development LLC + * Copyright (C) 2020, 2025 Coherent Logic Development LLC * * * This file is part of FreeM. @@ -35,6 +23,31 @@ * You should have received a copy of the GNU Affero Public License * along with FreeM. If not, see . * + * $Log: xecline.c,v $ + * Revision 1.11 2025/04/02 03:02:42 snw + * Stop requiring users to pass -e to fmadm when -u or -g are passed + * + * Revision 1.10 2025/03/27 03:27:35 snw + * Install init scripts to share/freem/examples/init and fix regression in method dispatch + * + * Revision 1.9 2025/03/24 04:13:12 snw + * Replace action macro dat with fra_dat to avoid symbol conflict on OS/2 + * + * Revision 1.8 2025/03/24 04:05:36 snw + * Replace crlf with frm_crlf to avoid symbol conflict with readline on OS/2 + * + * Revision 1.7 2025/03/22 22:52:24 snw + * Add STRLEN_GBL macro to manage global string length + * + * Revision 1.6 2025/03/22 21:44:32 snw + * Make the startup messages fewer and add environment name to direct-mode prompt + * + * Revision 1.5 2025/03/09 19:50:47 snw + * Second phase of REUSE compliance and header reformat + * + * + * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC + * SPDX-License-Identifier: AGPL-3.0-or-later **/ #include @@ -1076,8 +1089,8 @@ set: goto err; } - expr (STRING); - + expr (STRING); + if (merr () > OK) goto err; stcpy (tmp2, argptr); @@ -2021,8 +2034,8 @@ set10: goto err; } - sec += day * 86400 + timezone; - day = timezone; + sec += day * 86400 + FreeM_timezone; + day = FreeM_timezone; sh_ts.tv_sec = sec; @@ -2042,7 +2055,7 @@ set10: clock = time (0L); ctdata = localtime (&clock); - if (day -= (timezone = ctdata->tm_tzadj)) { + if (day -= (FreeM_timezone = ctdata->tm_tzadj)) { sec -= day; tzoffset += day; stime (&sec); @@ -3753,7 +3766,7 @@ off3: break; case KILL: - + /* argumentless: KILL all local variables */ if (((ch = *codptr) == SP) || ch == EOL) { symtab (kill_all, "", ""); @@ -3787,8 +3800,10 @@ off3: if (destructor_ct) { for (cd = 0; cd < destructor_ct; cd++) { - strcat (destc, destructors[cd]); - strcat (destc, ","); + if (strlen (destructors[cd]) > 0) { + strcat (destc, destructors[cd]); + strcat (destc, ","); + } } destructor_ct = 0; @@ -3936,7 +3951,7 @@ off3: stcpy (objvar, vn); - symtab (dat, objvar, datres); + symtab (fra_dat, objvar, datres); dat_res = atoi (datres); if (dat_res > 0) { @@ -4320,7 +4335,7 @@ use0: /* entry point for proces break; case 2: - crlf[io] = tvexpr (argptr); + frm_crlf[io] = tvexpr (argptr); break; case 3: @@ -4422,7 +4437,7 @@ use_socket: /* need to evaluate the following 6 lines carefully - smw 2023-10-15 */ if (k != HOME) { - crlf[k] = FALSE; + frm_crlf[k] = FALSE; fm_nodelay[k] = FALSE; xpos[k] = 0; ypos[k] = 0; @@ -5538,7 +5553,7 @@ zgo: for (; beg < end; beg += UNSIGN (*beg) + 2) { - if (crlf[io]) { + if (frm_crlf[io]) { write_m ("\012\201"); } else { @@ -5554,7 +5569,7 @@ zgo: rouins = beg; } - if (crlf[io]) { + if (frm_crlf[io]) { write_m ("\012\201"); } else { @@ -5823,16 +5838,16 @@ zwritep: } if (varnam[0] != '^') { - symtab (dat, varnam, tmp2); + symtab (fra_dat, varnam, tmp2); zwmode = 'L'; } else { if (varnam[1] == '$') { - ssvn (dat, varnam, tmp2); + ssvn (fra_dat, varnam, tmp2); zwmode = '$'; } else { - global (dat, varnam, tmp2); + global (fra_dat, varnam, tmp2); zwmode = '^'; } } @@ -5943,21 +5958,21 @@ zwritep: switch (zwmode) { case 'L': - symtab (dat, tmp, tmp3); + symtab (fra_dat, tmp, tmp3); symtab (get_sym, tmp, &w_tmp[1]); break; case '$': - ssvn (dat, tmp, tmp3); + ssvn (fra_dat, tmp, tmp3); ssvn (get_sym, tmp, &w_tmp[1]); break; case '^': - global (dat, tmp, tmp3); + global (fra_dat, tmp, tmp3); global (get_sym, tmp, &w_tmp[1]); break; @@ -6032,62 +6047,7 @@ zwritep: break; - case ZALLOCATE: - - /* argumentless is not permitted */ - if (*codptr == SP || *codptr == EOL) { - merr_raise (ARGLIST); - break; - } - - expr (NAME); - - if (merr () > OK) goto err; - - tmp[0] = SP; - stcpy (&tmp[1], varnam); - stcat (tmp, "\001\201"); - - frm_timeout = (-1L); /* no timeout */ - - if (*++codptr == ':') { - codptr++; - - expr (STRING); - - frm_timeout = intexpr (argptr); - - if (merr () > OK) goto err; - if (frm_timeout < 0L) frm_timeout = 0L; - } - - lock (tmp, frm_timeout, ZALLOCATE); - break; - - - case ZDEALLOCATE: - - tmp[0] = SP; - - if (*codptr == SP || *codptr == EOL) { - tmp[1] = EOL; - } - else { - expr (NAME); - - if (merr () > OK) goto err; - - stcpy (&tmp[1], varnam); - - codptr++; - } - - lock (tmp, -1L, ZDEALLOCATE); /* -1: no timeout */ - break; - - /* user defined Z-COMMAND */ - - + /* user defined Z-COMMAND */ case PRIVATE: private: /* for in-MUMPS defined commands */ @@ -7210,10 +7170,10 @@ direct_mode: if (quiet_mode == FALSE) { if (tp_level == 0) { - snprintf (fmrl_prompt, 255, "\r\n%s> ", nsname); + snprintf (fmrl_prompt, 255, "\r\n%s.%s> ", shm_env, nsname); } else { - snprintf (fmrl_prompt, 255, "\r\nTL%d:%s> ", tp_level, nsname); + snprintf (fmrl_prompt, 255, "\r\nTL%d:%s.%s> ", tp_level, shm_env, nsname); } } set_io (UNIX); @@ -7484,10 +7444,10 @@ void rbuf_dump(void) printf ("ROUTINE BUFFER CONFIGURATION\r\n"); - printf (" ROUTINE BUFFER COUNT: %d\r\n", NO_OF_RBUF); + printf (" ROUTINE BUFFER COUNT: %ld\r\n", NO_OF_RBUF); printf (" MAX. ROUTINE BUFFER COUNT: %d\r\n", MAXNO_OF_RBUF); printf (" DEFAULT ROUTINE BUFFER SIZE (EACH): %d BYTES\r\n", DEFPSIZE0 - 1); - printf (" CURRENT ROUTINE BUFFER SIZE (EACH): %d BYTES\r\n\r\n", PSIZE0 - 1); + printf (" CURRENT ROUTINE BUFFER SIZE (EACH): %ld BYTES\r\n\r\n", PSIZE0 - 1); printf ("BUFFERS IN USE:\r\n\r\n");