--- freem/src/xecline.c	2025/03/09 19:50:47	1.5
+++ freem/src/xecline.c	2025/04/02 03:02:42	1.11
@@ -1,5 +1,5 @@
 /*
- *   $Id: xecline.c,v 1.5 2025/03/09 19:50:47 snw Exp $
+ *   $Id: xecline.c,v 1.11 2025/04/02 03:02:42 snw Exp $
  *    freem interpreter proper
  *
  *  
@@ -24,6 +24,24 @@
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *
  *   $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
  *
@@ -1071,8 +1089,8 @@ set:
                         goto err;
                     }
 
-                    expr (STRING);
-
+                    expr (STRING);                    
+                    
                     if (merr () > OK) goto err;
 
                     stcpy (tmp2, argptr);
@@ -3748,7 +3766,7 @@ off3:
             break;
 
         case KILL:
-
+            
             /* argumentless: KILL all local variables */
             if (((ch = *codptr) == SP) || ch == EOL) {
                 symtab (kill_all, "", "");
@@ -3782,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;                    
@@ -3931,7 +3951,7 @@ off3:
                             
                             stcpy (objvar, vn);
 
-                            symtab (dat, objvar, datres);
+                            symtab (fra_dat, objvar, datres);
                             dat_res = atoi (datres);
 
                             if (dat_res > 0) {
@@ -4315,7 +4335,7 @@ use0:          /* entry point for proces
                                 break;
 
                             case 2:
-                                crlf[io] = tvexpr (argptr);
+                                frm_crlf[io] = tvexpr (argptr);
                                 break;
                             
                             case 3:
@@ -4417,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;
@@ -5533,7 +5553,7 @@ zgo:
 
                 for (; beg < end; beg += UNSIGN (*beg) + 2) {
                     
-                    if (crlf[io]) {
+                    if (frm_crlf[io]) {
                         write_m ("\012\201");
                     }
                     else {
@@ -5549,7 +5569,7 @@ zgo:
                 rouins = beg;
             }
 
-            if (crlf[io]) {
+            if (frm_crlf[io]) {
                 write_m ("\012\201");
             }
             else {
@@ -5818,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 = '^';
                     }
                 }
@@ -5938,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;
@@ -6027,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 */
@@ -7205,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);