--- freem/src/operator.c 2025/02/28 20:06:07 1.2 +++ freem/src/operator.c 2025/05/05 23:09:19 1.11 @@ -1,23 +1,11 @@ /* - * * - * * * - * * * - * *************** - * * * * * - * * MUMPS * - * * * * * - * *************** - * * * - * * * - * * - * - * operator.c + * $Id: operator.c,v 1.11 2025/05/05 23:09:19 snw Exp $ * operators pattern-match, divide, multiply, add, power * * - * 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,14 +23,38 @@ * You should have received a copy of the GNU Affero Public License * along with FreeM. If not, see . * + * $Log: operator.c,v $ + * Revision 1.11 2025/05/05 23:09:19 snw + * Revert errors in E notation parsing + * + * Revision 1.10 2025/05/05 23:02:39 snw + * More fixes around E notation + * + * Revision 1.9 2025/05/05 22:52:32 snw + * Make E notation error message more appropriate + * + * Revision 1.8 2025/05/05 19:34:46 snw + * Fix E notation code to disallow more than one minus sign after the E + * + * Revision 1.7 2025/04/10 01:24:38 snw + * Remove C++ style comments + * + * Revision 1.6 2025/04/09 19:52:02 snw + * Eliminate as many warnings as possible while building with -Wall + * + * 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 "mpsdef.h" #include #include +#include -void root (); -void mround (); int unit (char *str); extern void cond_round (char *a, int digits); /* defined in expr.c */ @@ -803,8 +815,8 @@ void add (char *a, char *b) /* string mi = 1; a[0] = ZERO; } - while (a[mi] == ZERO) { - stcpy (&a[mi], &a[mi + 1]); + while (a[(int) mi] == ZERO) { + stcpy (&a[(int) mi], &a[((int) mi) + 1]); dpa--; } if (dpa < 0) @@ -832,7 +844,7 @@ void add (char *a, char *b) /* string } a[0] = MINUS; } - if (a[mi] == EOL) { + if (a[(int) mi] == EOL) { a[0] = ZERO; a[1] = EOL; } @@ -1130,7 +1142,7 @@ void mdiv (char *uu, char *v, short typ) case '#': snprintf (uu, STRLEN - 1, "%ld\201", (((long) fp_uu) % ((long) fp_v))); - //snprintf (uu, STRLEN - 1, "%ld\201", ((long) fp_uu < 0 ? (((long) fp_uu % (long) fp_v) + (long) fp_v) % (long) fp_v : (long) fp_uu % (long) fp_v)); + /*snprintf (uu, STRLEN - 1, "%ld\201", ((long) fp_uu < 0 ? (((long) fp_uu % (long) fp_v) + (long) fp_v) % (long) fp_v : (long) fp_uu % (long) fp_v)); */ break; } @@ -1974,13 +1986,34 @@ int numlit (char *str) } continue; } - if (expflg) { + if (expflg) { if (ch == MINUS) { + /* TODO: revisit this; it breaks string coercion + if (str[i + 1] == '-') { + merr_raise (INVEXPR); + return (0); + } + if (!isdigit (str[i + 1])) { + merr_raise (INVEXPR); + return (0); + } + */ expflg = (-expflg); continue; } - if (ch == PLUS) + if (ch == PLUS) { + /* TODO: revisit this; it breaks string coercion + if (str[i + 1] == '+') { + merr_raise (INVEXPR); + return (0); + } + if (!isdigit (str[i + 1])) { + merr_raise (INVEXPR); + return (0); + } + */ continue; + } } if ((result = unit (&str[i]))) ch = str[i] = EOL; @@ -2511,10 +2544,7 @@ void m_op (char *a, char *b, short op) /* rounding */ /* 'a' is assumed to be a 'canonic' numeric string */ /* it is rounded to 'digits' fractional digits */ -void -mround (a, digits) - char *a; - int digits; +void mround (char *a, int digits) { int ch, i,