Diff for /freem/src/expr.c between versions 1.2 and 1.8

version 1.2, 2025/02/28 20:06:07 version 1.8, 2025/03/22 04:47:18
Line 1 Line 1
 /*  /*
  *                            *   *   $Id$
  *                           * *  
  *                          *   *  
  *                     ***************  
  *                      * *       * *  
  *                       *  MUMPS  *  
  *                      * *       * *  
  *                     ***************  
  *                          *   *  
  *                           * *  
  *                            *  
  *  
  *   expr.c  
  *    expression parser   *    expression parser
  *   *
  *     *  
  *   Author: Serena Willis <jpw@coherent-logic.com>   *   Author: Serena Willis <snw@coherent-logic.com>
  *    Copyright (C) 1998 MUG Deutschland   *    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.   *   This file is part of FreeM.
Line 35 Line 23
  *   You should have received a copy of the GNU Affero Public License   *   You should have received a copy of the GNU Affero Public License
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.   *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *   *
    *   $Log$
    *   Revision 1.8  2025/03/22 04:47:18  snw
    *   Silently truncate long names in STRING exprs when  evaluates to an obsolete MDC standard
    *
    *   Revision 1.7  2025/03/22 03:39:23  snw
    *   Fix reverse query polyfill call-in from C side and make NAME exprs silently truncate long names in obsolete MDC dialects
    *
    *   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__)  #if !defined(__osf__)
Line 178  void expr (short extyp) Line 182  void expr (short extyp)
     volatile int ch = 0;      volatile int ch = 0;
           
     short   group;          /* flag to scan grouped patterns */      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  #ifdef DEBUG_NEWPTR
     int loop;      int loop;
Line 206  void expr (short extyp) Line 219  void expr (short extyp)
                       (((ch == '/' && varnam[i - 1] != '/') ||                        (((ch == '/' && varnam[i - 1] != '/') ||
                         (ch == '%' && varnam[i - 1] == '/')) &&                          (ch == '%' && varnam[i - 1] == '/')) &&
                        (varnam[1] == '.' || varnam[1] == '/'))))) || (f != '^') && (ch == '.')) {                         (varnam[1] == '.' || varnam[1] == '/'))))) || (f != '^') && (ch == '.')) {
                   
                 varnam[i++] = ch;  
   
                                   if ((i + 1) <= max_namlen) {
                       varnam[i++] = ch;
                   }
                   else {
                       if ((rtn_dialect () == D_M77) ||
                           (rtn_dialect () == D_M84) ||
                           (rtn_dialect () == D_M90) ||
                           (rtn_dialect () == D_M95)) {
                           /* silently truncate... yeah, the standard is stupid af */
                           continue;
                       }
                       else {
                           merr_raise (M56);
                           return;
                       }
                   }                
                                   
             }              }
   
             varnam[i] = EOL;                          varnam[i] = EOL;
   
               #if 0
               {
                   char gooby[256];
                   stcpy (gooby, varnam);
                   stcnv_m2c (gooby);
                   printf ("name = '%s'\r\n", gooby);
               }
               #endif
                           
             if (ch == '(') {        /* it's an array */              if (ch == '(') {        /* it's an array */
                                   
Line 334  scan_name: Line 369  scan_name:
                     merr_raise (INVEXPR);                      merr_raise (INVEXPR);
                     return;                      return;
                 }                  }
                   
                 varnam[i++] = ch;                  if ((i + 1) <= max_namlen) {
                       varnam[i++] = ch;
                   }
                   else {
                       if ((rtn_dialect () == D_M77) ||
                           (rtn_dialect () == D_M84) ||
                           (rtn_dialect () == D_M90) ||
                           (rtn_dialect () == D_M95)) {
                           /* silently truncate... yeah, the standard is stupid af */
                           continue;
                       }
                       else {
                           merr_raise (M56);
                           return;
                       }
                   }                
   
                 lastch = ch;                  lastch = ch;
             }              }
Line 351  scan_name: Line 401  scan_name:
         else {          /* local variable name */          else {          /* local variable name */
   
             while (isalnum (ch = *++codptr)) {              while (isalnum (ch = *++codptr)) {
                 varnam[i++] = ch;                  
                   if ((i + 1) <= max_namlen) {
                       varnam[i++] = ch;
                   }
                   else {
                       if ((rtn_dialect () == D_M77) ||
                           (rtn_dialect () == D_M84) ||
                           (rtn_dialect () == D_M90) ||
                           (rtn_dialect () == D_M95)) {
                           /* silently truncate... yeah, the standard is stupid af */
                           continue;
                       }
                       else {
                           merr_raise (M56);
                           return;
                       }
                   }                
                   
             }              }
                   
             varnam[i] = EOL;              varnam[i] = EOL;
Line 2224  f20: Line 2291  f20:
                         stcnv_c2m (qryarg_ext);                          stcnv_c2m (qryarg_ext);
   
                         /* put the $QUERY argument into the local variable %INT.REVQ */                          /* put the $QUERY argument into the local variable %INT.REVQ */
                         symtab (set_sym, "%INT.REVQ\201\201", qryarg_ext);                          symtab (set_sym, "%INTREVQ\201\201", qryarg_ext);
   
                         /* set up for calling into polyfill wrapper */                          /* set up for calling into polyfill wrapper */
                         code[0] = '\201';                          code[0] = '\201';
Line 5543  errexfun: Line 5610  errexfun:
                                           
                 /* $STORAGE */                  /* $STORAGE */
                 case 's':                  case 's':
                     snprintf (a, 255 , "%d\201", DEFPSIZE);                      snprintf (a, 255 , "%ld\201", DEFPSIZE);
                     goto exec;                      goto exec;
   
                 /* $WITH */                  /* $WITH */

Removed from v.1.2  
changed lines
  Added in v.1.8


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>