--- freem/src/expr.c	2025/01/19 02:04:04	1.1.1.1
+++ freem/src/expr.c	2025/03/22 03:05:19	1.6
@@ -1,23 +1,11 @@
 /*
- *                            *
- *                           * *
- *                          *   *
- *                     ***************
- *                      * *       * *
- *                       *  MUMPS  *
- *                      * *       * *
- *                     ***************
- *                          *   *
- *                           * *
- *                            *
- *
- *   expr.c
+ *   $Id: expr.c,v 1.6 2025/03/22 03:05:19 snw Exp $
  *    expression parser
  *
  *  
- *   Author: Serena Willis <jpw@coherent-logic.com>
+ *   Author: Serena Willis <snw@coherent-logic.com>
  *    Copyright (C) 1998 MUG Deutschland
- *    Copyright (C) 2020, 2023 Coherent Logic Development LLC
+ *    Copyright (C) 2020, 2023, 2025 Coherent Logic Development LLC
  *
  *
  *   This file is part of FreeM.
@@ -35,6 +23,16 @@
  *   You should have received a copy of the GNU Affero Public License
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *
+ *   $Log: expr.c,v $
+ *   Revision 1.6  2025/03/22 03:05:19  snw
+ *   Comply with X11-96/13 portable length of names
+ *
+ *   Revision 1.5  2025/03/09 19:14:24  snw
+ *   First phase of REUSE compliance and header reformat
+ *
+ *
+ * SPDX-FileCopyrightText:  (C) 2025 Coherent Logic Development LLC
+ * SPDX-License-Identifier: AGPL-3.0-or-later 
  **/
 
 #if !defined(__osf__)
@@ -137,12 +135,9 @@
 #if !defined(__OpenBSD__) && !defined(_AIX) && !defined(__osf__) && !defined(MSDOS) && !defined(__vax__)
 long    time ();
 #endif
-
-void       cond_round ();
-void       zdate ();
-void       zkey ();
-void       ztime ();
-int        levenshtein ();
+void cond_round (char *a, int digits);
+void zkey (char *a, long type);
+int levenshtein (char *word1, char *word2);
 time_t     horolog_to_unix (char *horo);
 extern int xecline(int typ);
 short      rbuf_slot_from_name(char *);
@@ -181,6 +176,15 @@ void expr (short extyp)
     volatile int ch = 0;
     
     short   group;          /* flag to scan grouped patterns */
+
+    int  max_namlen = 255;
+
+    if ((rtn_dialect () == D_MDS) || (rtn_dialect () == D_M5) || (rtn_dialect () == D_FREEM)) {
+        max_namlen = 255;
+    }
+    else {
+        max_namlen = 8;
+    }
     
 #ifdef DEBUG_NEWPTR
     int loop;
@@ -209,10 +213,14 @@ void expr (short extyp)
                       (((ch == '/' && varnam[i - 1] != '/') ||
                         (ch == '%' && varnam[i - 1] == '/')) &&
                        (varnam[1] == '.' || varnam[1] == '/'))))) || (f != '^') && (ch == '.')) {
-                
-                varnam[i++] = ch;
 
-                
+                if ((i + 1) <= max_namlen) {
+                    varnam[i++] = ch;
+                }
+                else {
+                    merr_raise (M56);
+                    return;
+                }                
                 
             }
 
@@ -5546,7 +5554,7 @@ errexfun:
 		    
                 /* $STORAGE */
                 case 's':
-		    snprintf (a, 255 , "%d\201", DEFPSIZE);
+		    snprintf (a, 255 , "%ld\201", DEFPSIZE);
 		    goto exec;
 
 		/* $WITH */