--- freem/src/expr.c 2025/03/24 04:13:11 1.10 +++ freem/src/expr.c 2025/04/14 23:20:23 1.14 @@ -1,5 +1,5 @@ /* - * $Id: expr.c,v 1.10 2025/03/24 04:13:11 snw Exp $ + * $Id: expr.c,v 1.14 2025/04/14 23:20:23 snw Exp $ * expression parser * * @@ -24,6 +24,18 @@ * along with FreeM. If not, see . * * $Log: expr.c,v $ + * 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 * @@ -766,7 +778,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 == ',') { @@ -951,7 +963,7 @@ undefglvn: stcpy (refsav[refsx], zref); stcpy (refsav[refsx++] + 256, zloc); - ierr -= M7; //smw TODO HUH?? + ierr -= M7; arg--; goto nextchr; @@ -1678,7 +1690,7 @@ uparrow: case 'c': /* $CHARACTER */ - { + { short l, l1, m, n; l1 = f; @@ -1689,6 +1701,7 @@ uparrow: n = 1; l = 0; + for (;;) { if ((ch = a[i++]) == EOL) { @@ -4576,9 +4589,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; @@ -4593,7 +4606,7 @@ extra_fun: obj_field = FALSE; - //dofram0 = dofrmptr; + /* dofram0 = dofrmptr; */ i = 0; codptr++; @@ -4655,7 +4668,7 @@ extra_fun: obj_field = FALSE; - //dofram0 = 0; + /* dofram0 = 0; */ if (*codptr == '(') codptr += 2; } @@ -4731,7 +4744,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; @@ -4866,21 +4879,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; @@ -4903,6 +4918,7 @@ off: fl_typestr[typei] = '\0'; fl_mand = *(reg + 1); + /* if ((fl_mand == 'o') || (fl_mand == 'O')) { fl_mandatory = FALSE; } @@ -4917,12 +4933,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++; @@ -4959,7 +4992,7 @@ off: if (dtcheck_result == FALSE) { merr_raise (TYPMISMATCH); - dofrmptr = dofram0; // reset frame pointer + dofrmptr = dofram0; /* reset frame pointer */ errex = TRUE; @@ -5480,8 +5513,6 @@ errexfun: ilong = ilong1 - (ilong * 86400); lintstr (&a[i], ilong); - -// printf ("unix epoch = %d\r\n", horolog_to_unix (a)); goto exec; @@ -5524,7 +5555,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); } } @@ -5533,7 +5564,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; @@ -5545,7 +5576,7 @@ errexfun: case SVNtlevel: - snprintf (a, 255, "%d\201", tp_level); + sprintf (a, "%d\201", tp_level); goto exec; @@ -5558,7 +5589,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); @@ -5573,7 +5604,7 @@ errexfun: case SVNestack: { char esbuf[256]; - snprintf (esbuf, 255, "%d\201", estack); + sprintf (esbuf, "%d\201", estack); stcpy (a, esbuf); goto exec; @@ -5582,7 +5613,7 @@ errexfun: case SVNetrap: -// write_m ("in SVNetrap\r\n\201"); +/* write_m ("in SVNetrap\r\n\201"); */ stcpy (a, etrap); goto exec; @@ -5606,17 +5637,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 */ @@ -5666,15 +5697,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': @@ -5737,7 +5768,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);