--- freem/src/expr.c 2025/03/22 04:47:18 1.8 +++ freem/src/expr.c 2025/05/02 16:30:16 1.18 @@ -1,5 +1,5 @@ /* - * $Id: expr.c,v 1.8 2025/03/22 04:47:18 snw Exp $ + * $Id: expr.c,v 1.18 2025/05/02 16:30:16 snw Exp $ * expression parser * * @@ -24,6 +24,36 @@ * along with FreeM. If not, see . * * $Log: expr.c,v $ + * Revision 1.18 2025/05/02 16:30:16 snw + * Fix broken build due to time issues + * + * Revision 1.17 2025/05/01 03:56:29 snw + * -m + * + * Revision 1.16 2025/04/30 20:03:09 snw + * Work on entryref parser + * + * Revision 1.15 2025/04/30 14:41:03 snw + * Further debugger work + * + * Revision 1.14 2025/04/14 23:20:23 snw + * Restore support for any 8-bit character in + * + * Revision 1.13 2025/04/13 04:22:43 snw + * Fix snprintf calls + * + * Revision 1.12 2025/04/10 01:24:38 snw + * Remove C++ style comments + * + * Revision 1.11 2025/03/30 01:36:58 snw + * Make it easier to bring back fma_gedit, fix double-free in global handler, limit $CHAR to 7-bit ASCII + * + * Revision 1.10 2025/03/24 04:13:11 snw + * Replace action macro dat with fra_dat to avoid symbol conflict on OS/2 + * + * Revision 1.9 2025/03/24 01:32:22 snw + * Guard declaration of time function in expr.c for portability + * * Revision 1.8 2025/03/22 04:47:18 snw * Silently truncate long names in STRING exprs when evaluates to an obsolete MDC standard * @@ -138,7 +168,7 @@ #define GET 'Y' #define GETX ':' -#if !defined(__OpenBSD__) && !defined(_AIX) && !defined(__osf__) && !defined(MSDOS) && !defined(__vax__) +#if !defined(__OpenBSD__) && !defined(_AIX) && !defined(__osf__) && !defined(MSDOS) && !defined(__vax__) && !defined(__OS2__) && !defined(__linux__) long time (); #endif void cond_round (char *a, int digits); @@ -558,7 +588,7 @@ var1: case 'd': /* $DATA */ - ch = dat; + ch = fra_dat; glv_fcn: @@ -760,7 +790,7 @@ d_o_n: if (merr () == UNDEF) { - //smw 15 nov 2023 merr_raise (ierr < 0 ? OK - CTRLB : OK); + /* smw 15 nov 2023 merr_raise (ierr < 0 ? OK - CTRLB : OK); */ merr_clear (); if (*++codptr == ',') { @@ -945,7 +975,7 @@ undefglvn: stcpy (refsav[refsx], zref); stcpy (refsav[refsx++] + 256, zloc); - ierr -= M7; //smw TODO HUH?? + ierr -= M7; arg--; goto nextchr; @@ -1672,7 +1702,7 @@ uparrow: case 'c': /* $CHARACTER */ - { + { short l, l1, m, n; l1 = f; @@ -1683,6 +1713,7 @@ uparrow: n = 1; l = 0; + for (;;) { if ((ch = a[i++]) == EOL) { @@ -2966,6 +2997,16 @@ f20: long l1, rouoldc; short reload = FALSE; + /* + printf ("a = %s f = %d arg = %d\r\n", a, f, arg); + for (i = arg; i < arg + f; i++) { + printf ("argstck[%d] = '%s'\r\n", i, argstck[i]); + } + + for (i = 0; i < strlen (a); i++) + printf ("%c = %d\r\n", a[i], (unsigned char) a[i]); + */ + if (f > 3) { merr_raise (FUNARG); return; @@ -4570,9 +4611,9 @@ extra_fun: if (obj_field) { - char t_objf[255]; + char t_objf[STRLEN]; - snprintf (t_objf, 254, "%s\201", object_instance); + snprintf (t_objf, STRLEN - 1, "%s\201", object_instance); dofram0 = dofrmptr; *dofrmptr++ = DELIM; @@ -4587,7 +4628,7 @@ extra_fun: obj_field = FALSE; - //dofram0 = dofrmptr; + /* dofram0 = dofrmptr; */ i = 0; codptr++; @@ -4649,7 +4690,7 @@ extra_fun: obj_field = FALSE; - //dofram0 = 0; + /* dofram0 = 0; */ if (*codptr == '(') codptr += 2; } @@ -4725,7 +4766,7 @@ extra_fun: /* save off the return type to be checked by QUIT code */ extr_types[nstx + 1] = ret_type; - //printf ("return_type = '%s' *reg = '%c'\r\n", return_type, *reg); + /* printf ("return_type = '%s' *reg = '%c'\r\n", return_type, *reg); */ } if (*reg == TAB || *reg == SP) goto off; @@ -4860,21 +4901,23 @@ off: else { /* PARSE FORMALLIST */ short fl_type; - short fl_mandatory; - short fl_byref; + /* re-enable following 3 later */ + /*short fl_mandatory;*/ + /*short fl_byref;*/ + /*short lastparm;*/ char fl_typestr[255]; char fl_mand; short dtcheck_result; register short typei; - short lastparm; short gotparm; int paramct; fl_type = DT_AUTO; - fl_mandatory = TRUE; - fl_byref = FALSE; + /* re-enable following 3 later */ + /*fl_mandatory = TRUE;*/ + /*fl_byref = FALSE;*/ + /*lastparm = FALSE;*/ dtcheck_result = FALSE; - lastparm = FALSE; gotparm = FALSE; paramct = 0; @@ -4897,6 +4940,7 @@ off: fl_typestr[typei] = '\0'; fl_mand = *(reg + 1); + /* if ((fl_mand == 'o') || (fl_mand == 'O')) { fl_mandatory = FALSE; } @@ -4911,12 +4955,29 @@ off: goto errexfun; } + */ + + if ((fl_mand != 'o') && (fl_mand != 'O')) { + merr_raise (INVLIBOPT); + dofrmptr = dofram0; + + errex = TRUE; + + nstx--; + estack--; + + goto errexfun; + } + + } else if ((ch == ',') || (ch == ')')) { + /* re-enable later if (ch == ')') { lastparm = TRUE; } + */ gotparm = TRUE; paramct++; @@ -4953,7 +5014,7 @@ off: if (dtcheck_result == FALSE) { merr_raise (TYPMISMATCH); - dofrmptr = dofram0; // reset frame pointer + dofrmptr = dofram0; /* reset frame pointer */ errex = TRUE; @@ -5474,8 +5535,6 @@ errexfun: ilong = ilong1 - (ilong * 86400); lintstr (&a[i], ilong); - -// printf ("unix epoch = %d\r\n", horolog_to_unix (a)); goto exec; @@ -5518,7 +5577,7 @@ errexfun: { char doggie_bag[50]; - snprintf (doggie_bag, 49, ".%ld\201", ilong); + snprintf (doggie_bag, sizeof (doggie_bag) - 1, ".%ld\201", ilong); stcat (a, doggie_bag); } } @@ -5527,7 +5586,7 @@ errexfun: case SVNsystem: - snprintf (a, 512, "%d,\"%s\"\201", MDC_VENDOR_ID, jour_hostid); + sprintf (a, "%d,\"%s\"\201", MDC_VENDOR_ID, jour_hostid); goto exec; @@ -5539,7 +5598,7 @@ errexfun: case SVNtlevel: - snprintf (a, 255, "%d\201", tp_level); + sprintf (a, "%d\201", tp_level); goto exec; @@ -5552,7 +5611,7 @@ errexfun: case SVNecode: - //write_m ("in SVNecode\r\n\201"); + /* write_m ("in SVNecode\r\n\201"); */ if (stlen (user_ecode)) { stcpy (a, user_ecode); @@ -5567,7 +5626,7 @@ errexfun: case SVNestack: { char esbuf[256]; - snprintf (esbuf, 255, "%d\201", estack); + sprintf (esbuf, "%d\201", estack); stcpy (a, esbuf); goto exec; @@ -5576,7 +5635,7 @@ errexfun: case SVNetrap: -// write_m ("in SVNetrap\r\n\201"); +/* write_m ("in SVNetrap\r\n\201"); */ stcpy (a, etrap); goto exec; @@ -5600,17 +5659,17 @@ errexfun: /* $DEVICE */ case 'd': if (devstat[io].mdc_err == 0) { - snprintf (a, 3, "0\201\0"); + sprintf (a, "0\201\0"); } else { - snprintf (a, 120, "%d,%d,%s\201\0", devstat[io].mdc_err, devstat[io].frm_err, devstat[io].err_txt); + sprintf (a, "%d,%d,%s\201\0", devstat[io].mdc_err, devstat[io].frm_err, devstat[io].err_txt); } goto exec; /* $STORAGE */ case 's': - snprintf (a, 255 , "%ld\201", DEFPSIZE); + sprintf (a, "%ld\201", DEFPSIZE); goto exec; /* $WITH */ @@ -5660,15 +5719,15 @@ errexfun: goto exec; - ///* $ZX (number of columns) */ - //case 'X': - //intstr (a, n_columns); - // goto exec; - - ///* $ZY (number of rows) */ - //case 'Y': - //intstr (a, n_lines); - //goto exec; + /* $ZX (number of columns) */ + case 'X': + intstr (a, n_columns); + goto exec; + + /* $ZY (number of rows) */ + case 'Y': + intstr (a, n_lines); + goto exec; /* $ZERROR */ case 'E': @@ -5731,7 +5790,7 @@ errexfun: char zdf_key[50]; char fmt_string[128]; - snprintf (zdf_key, 49, "^$JOB\202%d\202ZDATE_FORMAT\201", pid); + snprintf (zdf_key, sizeof (zdf_key) - 1, "^$JOB\202%d\202ZDATE_FORMAT\201", pid); ssvn (get_sym, zdf_key, fmt_string); stcnv_c2m (fmt_string);