From 0daff9026def6d7ad239de016f40d50be95f422f Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 24 May 2018 01:46:24 -0700 Subject: [PATCH] SCP: Add TIME_MSEC predefined variable to provide time to milliseconds - Assure that Internal variables are referencable during expression evaluation - Add DEVNAME.REGNAME format for referencing non unique registers in expression evaluation. - Extend global register search to also search known internal device list registers - Allow expression variable names to have _ as a character within in the name --- doc/simh_doc.doc | Bin 328192 -> 322560 bytes scp.c | 432 ++++++++++++++++++++++++++--------------------- 2 files changed, 238 insertions(+), 194 deletions(-) diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index 5a1a0ff38ef1a97f69753f6b69ec8809b178d053..7c1261772414ca71f786237d9d08fddc1c3e56e1 100644 GIT binary patch delta 33501 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

bTx-L6V-t!4HgHs=@Cg?akkf57n01 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 diff --git a/scp.c b/scp.c index 21a34b49..3b71dd5f 100644 --- a/scp.c +++ b/scp.c @@ -591,6 +591,7 @@ static const char *sim_do_ocptr[MAX_DO_NEST_LVL+1]; static const char *sim_do_label[MAX_DO_NEST_LVL+1]; t_stat sim_last_cmd_stat; /* Command Status */ +struct timespec cmd_time; /* */ static SCHTAB sim_stabr; /* Register search specifier */ static SCHTAB sim_staba; /* Memory search specifier */ @@ -1455,8 +1456,8 @@ static const char simh_help[] = " Built In variables %%DATE%%, %%TIME%%, %%DATETIME%%, %%LDATE%%, %%LTIME%%,\n" " %%CTIME%%, %%DATE_YYYY%%, %%DATE_YY%%, %%DATE_YC%%, %%DATE_MM%%, %%DATE_MMM%%,\n" " %%DATE_MONTH%%, %%DATE_DD%%, %%DATE_D%%, %%DATE_WYYYY%%, %%DATE_WW%%,\n" - " %%TIME_HH%%, %%TIME_MM%%, %%TIME_SS%%, %%STATUS%%, %%TSTATUS%%, %%SIM_VERIFY%%,\n" - " %%SIM_QUIET%%, %%SIM_MESSAGE%% %%SIM_MESSAGE%%\n" + " %%TIME_HH%%, %%TIME_MM%%, %%TIME_SS%%, %%TIME_MSEC%%, %%STATUS%%, %%TSTATUS%%,\n" + " %%SIM_VERIFY%%, %%SIM_QUIET%%, %%SIM_MESSAGE%% %%SIM_MESSAGE%%\n" " %%SIM_NAME%%, %%SIM_BIN_NAME%%, %%SIM_BIN_PATH%%m %%SIM_OSTYPE%%\n\n" "+Token %%0 expands to the command file name.\n" "+Token %%n (n being a single digit) expands to the n'th argument\n" @@ -1491,6 +1492,7 @@ static const char simh_help[] = "++%%TIME_HH%% hh (00-23)\n" "++%%TIME_MM%% mm (00-59)\n" "++%%TIME_SS%% ss (00-59)\n" + "++%%TIME_MSEC%% msec (000-999)\n" "++%%STATUS%% Status value from the last command executed\n" "++%%TSTATUS%% The text form of the last status value\n" "++%%SIM_VERIFY%% The Verify/Verbose mode of the current Do command file\n" @@ -3537,6 +3539,185 @@ return stat | SCPE_NOMESSAGE; /* suppress message sinc untouched. */ +static const char * +_sim_get_env_special (const char *gbuf, char *rbuf, size_t rbuf_size) +{ +const char *ap; +char tbuf[CBUFSIZE]; + +ap = getenv(gbuf); /* first try using the literal name */ +if (!ap) { + get_glyph (gbuf, tbuf, 0); /* now try using the upcased name */ + ap = getenv(tbuf); + } +if (ap) /* environment variable found? */ + strlcpy (rbuf, ap, rbuf_size); /* Return the environment value */ +else { /* otherwise, check for Special Names */ + time_t now = (time_t)cmd_time.tv_sec; + struct tm *tmnow = localtime(&now); + + /* ISO 8601 format date/time info */ + if (!strcmp ("DATE", gbuf)) { + sprintf (rbuf, "%4d-%02d-%02d", tmnow->tm_year+1900, tmnow->tm_mon+1, tmnow->tm_mday); + ap = rbuf; + } + else if (!strcmp ("TIME", gbuf)) { + sprintf (rbuf, "%02d:%02d:%02d", tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec); + ap = rbuf; + } + else if (!strcmp ("DATETIME", gbuf)) { + sprintf (rbuf, "%04d-%02d-%02dT%02d:%02d:%02d", tmnow->tm_year+1900, tmnow->tm_mon+1, tmnow->tm_mday, tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec); + ap = rbuf; + } + /* Locale oriented formatted date/time info */ + else if (!strcmp ("LDATE", gbuf)) { + strftime (rbuf, rbuf_size, "%x", tmnow); + ap = rbuf; + } + else if (!strcmp ("LTIME", gbuf)) { +#if defined(HAVE_C99_STRFTIME) + strftime (rbuf, rbuf_size, "%r", tmnow); +#else + strftime (rbuf, rbuf_size, "%p", tmnow); + if (rbuf[0]) + strftime (rbuf, rbuf_size, "%I:%M:%S %p", tmnow); + else + strftime (rbuf, rbuf_size, "%H:%M:%S", tmnow); +#endif + ap = rbuf; + } + else if (!strcmp ("CTIME", gbuf)) { +#if defined(HAVE_C99_STRFTIME) + strftime (rbuf, rbuf_size, "%c", tmnow); +#else + strcpy (rbuf, ctime(&now)); + rbuf[strlen (rbuf)-1] = '\0'; /* remove trailing \n */ +#endif + ap = rbuf; + } + else if (!strcmp ("UTIME", gbuf)) { + sprintf (rbuf, "%" LL_FMT "d", (LL_TYPE)now); + ap = rbuf; + } + /* Separate Date/Time info */ + else if (!strcmp ("DATE_YYYY", gbuf)) {/* Year (0000-9999) */ + strftime (rbuf, sizeof(rbuf), "%Y", tmnow); + ap = rbuf; + } + else if (!strcmp ("DATE_YY", gbuf)) {/* Year (00-99) */ + strftime (rbuf, sizeof(rbuf), "%y", tmnow); + ap = rbuf; + } + else if (!strcmp ("DATE_YC", gbuf)) {/* Century (year/100) */ + sprintf (rbuf, "%d", (tmnow->tm_year + 1900)/100); + ap = rbuf; + } + else if ((!strcmp ("DATE_19XX_YY", gbuf)) || /* Year with same calendar */ + (!strcmp ("DATE_19XX_YYYY", gbuf))) { + int year = tmnow->tm_year + 1900; + int days = year - 2001; + int leaps = days/4 - days/100 + days/400; + int lyear = ((year % 4) == 0) && (((year % 100) != 0) || ((year % 400) == 0)); + int selector = ((days + leaps + 7) % 7) + lyear * 7; + static int years[] = {90, 91, 97, 98, 99, 94, 89, + 96, 80, 92, 76, 88, 72, 84}; + int cal_year = years[selector]; + + if (!strcmp ("DATE_19XX_YY", gbuf)) + sprintf (rbuf, "%d", cal_year); /* 2 digit year */ + else + sprintf (rbuf, "%d", cal_year + 1900); /* 4 digit year */ + ap = rbuf; + } + else if (!strcmp ("DATE_MM", gbuf)) {/* Month number (01-12) */ + strftime (rbuf, sizeof(rbuf), "%m", tmnow); + ap = rbuf; + } + else if (!strcmp ("DATE_MMM", gbuf)) {/* abbreviated Month name */ + strftime (rbuf, sizeof(rbuf), "%b", tmnow); + ap = rbuf; + } + else if (!strcmp ("DATE_MONTH", gbuf)) {/* full Month name */ + strftime (rbuf, sizeof(rbuf), "%B", tmnow); + ap = rbuf; + } + else if (!strcmp ("DATE_DD", gbuf)) {/* Day of Month (01-31) */ + strftime (rbuf, sizeof(rbuf), "%d", tmnow); + ap = rbuf; + } + else if (!strcmp ("DATE_D", gbuf)) { /* ISO 8601 weekday number (1-7) */ + sprintf (rbuf, "%d", (tmnow->tm_wday ? tmnow->tm_wday : 7)); + ap = rbuf; + } + else if ((!strcmp ("DATE_WW", gbuf)) || /* ISO 8601 week number (01-53) */ + (!strcmp ("DATE_WYYYY", gbuf))) {/* ISO 8601 week year number (0000-9999) */ + int iso_yr = tmnow->tm_year + 1900; + int iso_wk = (tmnow->tm_yday + 11 - (tmnow->tm_wday ? tmnow->tm_wday : 7))/7;; + + if (iso_wk == 0) { + iso_yr = iso_yr - 1; + tmnow->tm_yday += 365 + (((iso_yr % 4) == 0) ? 1 : 0); /* Adjust for Leap Year (Correct thru 2099) */ + iso_wk = (tmnow->tm_yday + 11 - (tmnow->tm_wday ? tmnow->tm_wday : 7))/7; + } + else + if ((iso_wk == 53) && (((31 - tmnow->tm_mday) + tmnow->tm_wday) < 4)) { + ++iso_yr; + iso_wk = 1; + } + if (!strcmp ("DATE_WW", gbuf)) + sprintf (rbuf, "%02d", iso_wk); + else + sprintf (rbuf, "%04d", iso_yr); + ap = rbuf; + } + else if (!strcmp ("DATE_JJJ", gbuf)) {/* day of year (001-366) */ + strftime (rbuf, sizeof(rbuf), "%j", tmnow); + ap = rbuf; + } + else if (!strcmp ("TIME_HH", gbuf)) {/* Hour of day (00-23) */ + strftime (rbuf, sizeof(rbuf), "%H", tmnow); + ap = rbuf; + } + else if (!strcmp ("TIME_MM", gbuf)) {/* Minute of hour (00-59) */ + strftime (rbuf, sizeof(rbuf), "%M", tmnow); + ap = rbuf; + } + else if (!strcmp ("TIME_SS", gbuf)) {/* Second of minute (00-59) */ + strftime (rbuf, sizeof(rbuf), "%S", tmnow); + ap = rbuf; + } + else if (!strcmp ("TIME_MSEC", gbuf)) {/* Milliseconds of Second (000-999) */ + sprintf (rbuf, "%03d", (int)(cmd_time.tv_nsec / 1000000)); + ap = rbuf; + } + else if (!strcmp ("STATUS", gbuf)) { + sprintf (rbuf, "%08X", sim_last_cmd_stat); + ap = rbuf; + } + else if (!strcmp ("TSTATUS", gbuf)) { + sprintf (rbuf, "%s", sim_error_text (sim_last_cmd_stat)); + ap = rbuf; + } + else if (!strcmp ("SIM_VERIFY", gbuf)) { + sprintf (rbuf, "%s", sim_do_echo ? "-V" : ""); + ap = rbuf; + } + else if (!strcmp ("SIM_VERBOSE", gbuf)) { + sprintf (rbuf, "%s", sim_do_echo ? "-V" : ""); + ap = rbuf; + } + else if (!strcmp ("SIM_QUIET", gbuf)) { + sprintf (rbuf, "%s", sim_quiet ? "-Q" : ""); + ap = rbuf; + } + else if (!strcmp ("SIM_MESSAGE", gbuf)) { + sprintf (rbuf, "%s", sim_show_message ? "" : "-Q"); + ap = rbuf; + } + } +return ap; +} + void sim_sub_args (char *instr, size_t instr_size, char *do_arg[]) { char gbuf[CBUFSIZE]; @@ -3546,11 +3727,8 @@ char rbuf[CBUFSIZE]; int i; size_t instr_off = 0; size_t outstr_off = 0; -time_t now; -struct tm *tmnow; -time(&now); -tmnow = localtime(&now); +clock_gettime(CLOCK_REALTIME, &cmd_time); tmpbuf = (char *)malloc(instr_size); op = tmpbuf; oend = tmpbuf + instr_size - 2; @@ -3625,172 +3803,12 @@ for (; *ip && (op < oend); ) { break; ip = ip + 2; } - else { /* environment variable */ - ap = NULL; - get_glyph_nc (ip+1, gbuf, '%'); /* first try using the literal name */ - ap = getenv(gbuf); - if (!ap) { - get_glyph (ip+1, gbuf, '%'); /* now try using the upcased name */ - ap = getenv(gbuf); - } + else { /* check environment variable or special variables */ + get_glyph_nc (ip+1, gbuf, '%'); /* get the literal name */ + ap = _sim_get_env_special (gbuf, rbuf, sizeof (rbuf)); ip += 1 + strlen (gbuf); - if (*ip == '%') ++ip; - if (!ap) { - /* ISO 8601 format date/time info */ - if (!strcmp ("DATE", gbuf)) { - sprintf (rbuf, "%4d-%02d-%02d", tmnow->tm_year+1900, tmnow->tm_mon+1, tmnow->tm_mday); - ap = rbuf; - } - else if (!strcmp ("TIME", gbuf)) { - sprintf (rbuf, "%02d:%02d:%02d", tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec); - ap = rbuf; - } - else if (!strcmp ("DATETIME", gbuf)) { - sprintf (rbuf, "%04d-%02d-%02dT%02d:%02d:%02d", tmnow->tm_year+1900, tmnow->tm_mon+1, tmnow->tm_mday, tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec); - ap = rbuf; - } - /* Locale oriented formatted date/time info */ - else if (!strcmp ("LDATE", gbuf)) { - strftime (rbuf, sizeof(rbuf), "%x", tmnow); - ap = rbuf; - } - else if (!strcmp ("LTIME", gbuf)) { -#if defined(HAVE_C99_STRFTIME) - strftime (rbuf, sizeof(rbuf), "%r", tmnow); -#else - strftime (rbuf, sizeof(rbuf), "%p", tmnow); - if (rbuf[0]) - strftime (rbuf, sizeof(rbuf), "%I:%M:%S %p", tmnow); - else - strftime (rbuf, sizeof(rbuf), "%H:%M:%S", tmnow); -#endif - ap = rbuf; - } - else if (!strcmp ("CTIME", gbuf)) { -#if defined(HAVE_C99_STRFTIME) - strftime (rbuf, sizeof(rbuf), "%c", tmnow); -#else - strcpy (rbuf, ctime(&now)); - rbuf[strlen (rbuf)-1] = '\0'; /* remove trailing \n */ -#endif - ap = rbuf; - } - else if (!strcmp ("UTIME", gbuf)) { - sprintf (rbuf, "%" LL_FMT "d", (LL_TYPE)now); - ap = rbuf; - } - /* Separate Date/Time info */ - else if (!strcmp ("DATE_YYYY", gbuf)) {/* Year (0000-9999) */ - strftime (rbuf, sizeof(rbuf), "%Y", tmnow); - ap = rbuf; - } - else if (!strcmp ("DATE_YY", gbuf)) {/* Year (00-99) */ - strftime (rbuf, sizeof(rbuf), "%y", tmnow); - ap = rbuf; - } - else if (!strcmp ("DATE_YC", gbuf)) {/* Century (year/100) */ - sprintf (rbuf, "%d", (tmnow->tm_year + 1900)/100); - ap = rbuf; - } - else if ((!strcmp ("DATE_19XX_YY", gbuf)) || /* Year with same calendar */ - (!strcmp ("DATE_19XX_YYYY", gbuf))) { - int year = tmnow->tm_year + 1900; - int days = year - 2001; - int leaps = days/4 - days/100 + days/400; - int lyear = ((year % 4) == 0) && (((year % 100) != 0) || ((year % 400) == 0)); - int selector = ((days + leaps + 7) % 7) + lyear * 7; - static int years[] = {90, 91, 97, 98, 99, 94, 89, - 96, 80, 92, 76, 88, 72, 84}; - int cal_year = years[selector]; - - if (!strcmp ("DATE_19XX_YY", gbuf)) - sprintf (rbuf, "%d", cal_year); /* 2 digit year */ - else - sprintf (rbuf, "%d", cal_year + 1900); /* 4 digit year */ - ap = rbuf; - } - else if (!strcmp ("DATE_MM", gbuf)) {/* Month number (01-12) */ - strftime (rbuf, sizeof(rbuf), "%m", tmnow); - ap = rbuf; - } - else if (!strcmp ("DATE_MMM", gbuf)) {/* abbreviated Month name */ - strftime (rbuf, sizeof(rbuf), "%b", tmnow); - ap = rbuf; - } - else if (!strcmp ("DATE_MONTH", gbuf)) {/* full Month name */ - strftime (rbuf, sizeof(rbuf), "%B", tmnow); - ap = rbuf; - } - else if (!strcmp ("DATE_DD", gbuf)) {/* Day of Month (01-31) */ - strftime (rbuf, sizeof(rbuf), "%d", tmnow); - ap = rbuf; - } - else if (!strcmp ("DATE_D", gbuf)) { /* ISO 8601 weekday number (1-7) */ - sprintf (rbuf, "%d", (tmnow->tm_wday ? tmnow->tm_wday : 7)); - ap = rbuf; - } - else if ((!strcmp ("DATE_WW", gbuf)) || /* ISO 8601 week number (01-53) */ - (!strcmp ("DATE_WYYYY", gbuf))) {/* ISO 8601 week year number (0000-9999) */ - int iso_yr = tmnow->tm_year + 1900; - int iso_wk = (tmnow->tm_yday + 11 - (tmnow->tm_wday ? tmnow->tm_wday : 7))/7;; - - if (iso_wk == 0) { - iso_yr = iso_yr - 1; - tmnow->tm_yday += 365 + (((iso_yr % 4) == 0) ? 1 : 0); /* Adjust for Leap Year (Correct thru 2099) */ - iso_wk = (tmnow->tm_yday + 11 - (tmnow->tm_wday ? tmnow->tm_wday : 7))/7; - } - else - if ((iso_wk == 53) && (((31 - tmnow->tm_mday) + tmnow->tm_wday) < 4)) { - ++iso_yr; - iso_wk = 1; - } - if (!strcmp ("DATE_WW", gbuf)) - sprintf (rbuf, "%02d", iso_wk); - else - sprintf (rbuf, "%04d", iso_yr); - ap = rbuf; - } - else if (!strcmp ("DATE_JJJ", gbuf)) {/* day of year (001-366) */ - strftime (rbuf, sizeof(rbuf), "%j", tmnow); - ap = rbuf; - } - else if (!strcmp ("TIME_HH", gbuf)) {/* Hour of day (00-23) */ - strftime (rbuf, sizeof(rbuf), "%H", tmnow); - ap = rbuf; - } - else if (!strcmp ("TIME_MM", gbuf)) {/* Minute of hour (00-59) */ - strftime (rbuf, sizeof(rbuf), "%M", tmnow); - ap = rbuf; - } - else if (!strcmp ("TIME_SS", gbuf)) {/* Second of minute (00-59) */ - strftime (rbuf, sizeof(rbuf), "%S", tmnow); - ap = rbuf; - } - else if (!strcmp ("STATUS", gbuf)) { - sprintf (rbuf, "%08X", sim_last_cmd_stat); - ap = rbuf; - } - else if (!strcmp ("TSTATUS", gbuf)) { - sprintf (rbuf, "%s", sim_error_text (sim_last_cmd_stat)); - ap = rbuf; - } - else if (!strcmp ("SIM_VERIFY", gbuf)) { - sprintf (rbuf, "%s", sim_do_echo ? "-V" : ""); - ap = rbuf; - } - else if (!strcmp ("SIM_VERBOSE", gbuf)) { - sprintf (rbuf, "%s", sim_do_echo ? "-V" : ""); - ap = rbuf; - } - else if (!strcmp ("SIM_QUIET", gbuf)) { - sprintf (rbuf, "%s", sim_quiet ? "-Q" : ""); - ap = rbuf; - } - else if (!strcmp ("SIM_MESSAGE", gbuf)) { - sprintf (rbuf, "%s", sim_show_message ? "" : "-Q"); - ap = rbuf; - } - } + if (*ip == '%') + ++ip; } if (ap) { /* non-null arg? */ while (*ap && (op < oend)) { /* copy the argument */ @@ -9368,32 +9386,34 @@ return (dptr->flags & DEV_DIS? TRUE: FALSE); REG *find_reg_glob_reason (CONST char *cptr, CONST char **optr, DEVICE **gdptr, t_stat *stat) { -int32 i; -DEVICE *dptr; +int32 i, j; +DEVICE *dptr, **devs, **dptrptr[] = {sim_devices, sim_internal_devices, NULL}; REG *rptr, *srptr = NULL; if (stat) *stat = SCPE_OK; *gdptr = NULL; -for (i = 0; (dptr = sim_devices[i]) != 0; i++) { /* all dev */ - if (dptr->flags & DEV_DIS) /* skip disabled */ - continue; - if ((rptr = find_reg (cptr, optr, dptr))) { /* found? */ - if (srptr) { /* ambig? err */ - if (stat) { - if (sim_show_message) { - if (*stat == SCPE_OK) - sim_printf ("Ambiguous register. %s appears in devices %s and %s", cptr, (*gdptr)->name, dptr->name); - else - sim_printf (" and %s", dptr->name); +for (j = 0; (devs = dptrptr[j]) != NULL; j++) { + for (i = 0; (dptr = devs[i]) != NULL; i++) { /* all dev */ + if (dptr->flags & DEV_DIS) /* skip disabled */ + continue; + if ((rptr = find_reg (cptr, optr, dptr))) { /* found? */ + if (srptr) { /* ambig? err */ + if (stat) { + if (sim_show_message) { + if (*stat == SCPE_OK) + sim_printf ("Ambiguous register. %s appears in devices %s and %s", cptr, (*gdptr)->name, dptr->name); + else + sim_printf (" and %s", dptr->name); + } + *stat = SCPE_AMBREG|SCPE_NOMESSAGE; } - *stat = SCPE_AMBREG|SCPE_NOMESSAGE; + else + return NULL; } - else - return NULL; + srptr = rptr; /* save reg */ + *gdptr = dptr; /* save unit */ } - srptr = rptr; /* save reg */ - *gdptr = dptr; /* save unit */ } } if (stat && (*stat != SCPE_OK)) { @@ -13609,7 +13629,7 @@ static const char BinaryDigits[] = "01"; while (isspace (*cptr)) ++cptr; if (isalpha (*cptr)) { - while (isalnum (*cptr)) + while (isalnum (*cptr) || (*cptr == '.') || (*cptr == '_')) *buf++ = *cptr++; *buf = '\0'; } @@ -13784,9 +13804,26 @@ return cptr; /* return any unprocessed input */ static t_bool _value_of (const char *data, t_svalue *svalue, char *string, size_t string_size) { CONST char *gptr; -if (isalpha (*data)) { - REG *rptr = find_reg (data, &gptr, sim_dfdev); +if (isalpha (*data)) { + REG *rptr; + DEVICE *dptr = sim_dfdev; + const char *dot; + + dot = strchr (data, '.'); + if (dot) { + char devnam[CBUFSIZE]; + + memcpy (devnam, data, dot - data); + devnam[dot - data] = '\0'; + if (find_dev (devnam)) { + dptr = find_dev (devnam); + data = dot + 1; + rptr = find_reg (data, &gptr, dptr); + } + } + else + rptr = find_reg_glob (data, &gptr, &dptr); if (rptr) { *svalue = (t_svalue)get_rval (rptr, 0); sprint_val (string + 1, *svalue, 10, string_size - 2, PV_LEFTSIGN); @@ -13794,8 +13831,15 @@ if (isalpha (*data)) { strlcpy (&string[strlen (string)], "\"", string_size - strlen (string)); return TRUE; } - gptr = getenv (data); - data = (gptr ? gptr : ""); + gptr = _sim_get_env_special (data, string + 1, string_size - 2); + if (gptr) { + *svalue = strtotsv(string + 1, &gptr, 0); + *string = '"'; + strlcpy (&string[strlen (string)], "\"", string_size - strlen (string)); + return (*gptr == '\0'); + } + else + data = ""; } *svalue = strtotsv(data, &gptr, 0); snprintf (string, string_size - 1, "\"%s\"", data);