--- freem/src/expr.c 2025/03/22 03:05:19 1.6 +++ freem/src/expr.c 2025/03/22 04:47:18 1.8 @@ -1,5 +1,5 @@ /* - * $Id: expr.c,v 1.6 2025/03/22 03:05:19 snw Exp $ + * $Id: expr.c,v 1.8 2025/03/22 04:47:18 snw Exp $ * expression parser * * @@ -24,6 +24,12 @@ * along with FreeM. If not, see . * * $Log: expr.c,v $ + * 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 * @@ -218,13 +224,31 @@ void expr (short extyp) varnam[i++] = ch; } else { - merr_raise (M56); - return; + 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 */ @@ -345,8 +369,23 @@ scan_name: merr_raise (INVEXPR); 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; } @@ -362,7 +401,24 @@ scan_name: else { /* local variable name */ 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; @@ -2235,7 +2291,7 @@ f20: stcnv_c2m (qryarg_ext); /* 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 */ code[0] = '\201';