diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/builtin.c | 44 | ||||
-rw-r--r-- | Src/utils.c | 71 |
2 files changed, 81 insertions, 34 deletions
diff --git a/Src/builtin.c b/Src/builtin.c index c1509759a..050101f5e 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -69,7 +69,7 @@ static struct builtin builtins[] = * But that's actually not useful, so it's more consistent to * cause an error. */ - BUILTIN("fc", 0, bin_fc, 0, -1, BIN_FC, "nlre:IRWAdDfEimpPa", NULL), + BUILTIN("fc", 0, bin_fc, 0, -1, BIN_FC, "aAdDe:EfiIlmnpPrRt:W", NULL), BUILTIN("fg", 0, bin_fg, 0, -1, BIN_FG, NULL, NULL), BUILTIN("float", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "E:%F:%HL:%R:%Z:%ghlprtux", "E"), BUILTIN("functions", BINF_PLUSOPTS, bin_functions, 0, -1, 0, "kmMtuUz", NULL), @@ -81,7 +81,7 @@ static struct builtin builtins[] = BUILTIN("hashinfo", 0, bin_hashinfo, 0, 0, 0, NULL, NULL), #endif - BUILTIN("history", 0, bin_fc, 0, -1, BIN_FC, "nrdDfEimpPa", "l"), + BUILTIN("history", 0, bin_fc, 0, -1, BIN_FC, "adDEfimnpPrt:", "l"), BUILTIN("integer", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "HL:%R:%Z:%ghi:%lprtux", "i"), BUILTIN("jobs", 0, bin_fg, 0, -1, BIN_JOBS, "dlpZrs", NULL), BUILTIN("kill", BINF_HANDLES_OPTS, bin_kill, 0, -1, 0, NULL, NULL), @@ -1599,7 +1599,7 @@ fclist(FILE *f, Options ops, zlong first, zlong last, { int fclistdone = 0; zlong tmp; - char *s; + char *s, *tdfmt, *timebuf; Histent ent; /* reverse range if required */ @@ -1625,6 +1625,25 @@ fclist(FILE *f, Options ops, zlong first, zlong last, return 1; } + if (OPT_ISSET(ops,'d') || OPT_ISSET(ops,'f') || + OPT_ISSET(ops,'E') || OPT_ISSET(ops,'i') || + OPT_ISSET(ops,'t')) { + if (OPT_ISSET(ops,'t')) { + tdfmt = OPT_ARG(ops,'t'); + } else if (OPT_ISSET(ops,'i')) { + tdfmt = "%Y-%m-%d %H:%M"; + } else if (OPT_ISSET(ops,'E')) { + tdfmt = "%f.%-m.%Y %H:%M"; + } else if (OPT_ISSET(ops,'f')) { + tdfmt = "%-m/%f/%Y %H:%M"; + } else { + tdfmt = "%H:%M"; + } + timebuf = zhalloc(256); + } else { + tdfmt = timebuf = NULL; + } + for (;;) { s = dupstring(ent->node.nam); /* this if does the pattern matching, if required */ @@ -1641,24 +1660,11 @@ fclist(FILE *f, Options ops, zlong first, zlong last, } /* output actual time (and possibly date) of execution of the command, if required */ - if (OPT_ISSET(ops,'d') || OPT_ISSET(ops,'f') || - OPT_ISSET(ops,'E') || OPT_ISSET(ops,'i')) { + if (tdfmt != NULL) { struct tm *ltm; ltm = localtime(&ent->stim); - if (OPT_ISSET(ops,'i')) { - fprintf(f, "%d-%02d-%02d ", - ltm->tm_year + 1900, - ltm->tm_mon + 1, ltm->tm_mday); - } else if (OPT_ISSET(ops,'E')) { - fprintf(f, "%d.%d.%d ", - ltm->tm_mday, ltm->tm_mon + 1, - ltm->tm_year + 1900); - } else if (OPT_ISSET(ops,'f')) { - fprintf(f, "%d/%d/%d ", - ltm->tm_mon + 1, ltm->tm_mday, - ltm->tm_year + 1900); - } - fprintf(f, "%02d:%02d ", ltm->tm_hour, ltm->tm_min); + if (ztrftime(timebuf, 256, tdfmt, ltm)) + fprintf(f, "%s ", timebuf); } /* display the time taken by the command, if required */ if (OPT_ISSET(ops,'D')) { diff --git a/Src/utils.c b/Src/utils.c index 66b02ac88..d93dadfd0 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -2436,14 +2436,19 @@ ztrftime(char *buf, int bufsize, char *fmt, struct tm *tm) "Aug", "Sep", "Oct", "Nov", "Dec"}; #endif char *origbuf = buf; - char tmp[3]; + char tmp[4]; - tmp[0] = '%'; - tmp[2] = '\0'; while (*fmt) if (*fmt == '%') { + int strip; + fmt++; + if (*fmt == '-') { + strip = 1; + fmt++; + } else + strip = 0; /* * Assume this format will take up at least two * characters. Not always true, but if that matters @@ -2454,51 +2459,67 @@ ztrftime(char *buf, int bufsize, char *fmt, struct tm *tm) return -1; switch (*fmt++) { case 'd': - *buf++ = '0' + tm->tm_mday / 10; + if (strip || tm->tm_mday > 9) + *buf++ = '0' + tm->tm_mday / 10; *buf++ = '0' + tm->tm_mday % 10; break; case 'e': + strip = 1; + /* FALLTHROUGH */ case 'f': if (tm->tm_mday > 9) *buf++ = '0' + tm->tm_mday / 10; - else if (fmt[-1] == 'e') + else if (!strip) *buf++ = ' '; *buf++ = '0' + tm->tm_mday % 10; break; - case 'k': case 'K': + strip = 1; + /* FALLTHROUGH */ + case 'H': + case 'k': if (tm->tm_hour > 9) *buf++ = '0' + tm->tm_hour / 10; - else if (fmt[-1] == 'k') - *buf++ = ' '; + else if (!strip) { + if (fmt[-1] == 'H') + *buf++ = '0'; + else + *buf++ = ' '; + } *buf++ = '0' + tm->tm_hour % 10; break; - case 'l': case 'L': + strip = 1; + /* FALLTHROUGH */ + case 'l': hr12 = tm->tm_hour % 12; if (hr12 == 0) hr12 = 12; if (hr12 > 9) *buf++ = '1'; - else if (fmt[-1] == 'l') + else if (!strip) *buf++ = ' '; *buf++ = '0' + (hr12 % 10); break; case 'm': - *buf++ = '0' + (tm->tm_mon + 1) / 10; + if (tm->tm_mon > 8 || !strip) + *buf++ = '0' + (tm->tm_mon + 1) / 10; *buf++ = '0' + (tm->tm_mon + 1) % 10; break; case 'M': - *buf++ = '0' + tm->tm_min / 10; + if (tm->tm_min > 9 || !strip) + *buf++ = '0' + tm->tm_min / 10; *buf++ = '0' + tm->tm_min % 10; break; case 'S': - *buf++ = '0' + tm->tm_sec / 10; + if (tm->tm_sec > 9 || !strip) + *buf++ = '0' + tm->tm_sec / 10; *buf++ = '0' + tm->tm_sec % 10; break; case 'y': - *buf++ = '0' + (tm->tm_year / 10) % 10; + if (tm->tm_year > 9 || !strip) + *buf++ = '0' + (tm->tm_year / 10) % 10; *buf++ = '0' + tm->tm_year % 10; break; case '\0': @@ -2507,6 +2528,26 @@ ztrftime(char *buf, int bufsize, char *fmt, struct tm *tm) fmt--; break; #ifndef HAVE_STRFTIME + case 'Y': + { + /* + * Not worth handling this natively if + * strftime has it. + */ + int year, digits, testyear; + year = tm->tm_year + 1900; + digits = 1; + testyear = year; + while (testyear > 9) { + digits++; + testyear /= 10; + } + if (ztrftimebuf(&bufsize, digits)) + return -1; + sprintf(buf, "%d", year); + buf += digits; + break; + } case 'a': if (ztrftimebuf(&bufsize, strlen(astr[tm->tm_wday]) - 2)) return -1; @@ -2532,7 +2573,7 @@ ztrftime(char *buf, int bufsize, char *fmt, struct tm *tm) * in the accounting in bufsize (but nowhere else). */ *buf = '\1'; - tmp[1] = fmt[-1]; + sprintf(tmp, strip ? "%%-%c" : "%%%c", fmt[-1]); if (!strftime(buf, bufsize + 2, tmp, tm)) { if (*buf) { |