summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2009-03-02 10:11:45 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2009-03-02 10:11:45 +0000
commit535afe3b2a95afe7d9de5f95abc903119156ceee (patch)
tree38d3c8ae15193a8570f025cdf8eff39a76be625d
parent7c6a25409cb2d8c016182aec5702f3cdbd6cc4c6 (diff)
downloadzsh-535afe3b2a95afe7d9de5f95abc903119156ceee.tar.gz
zsh-535afe3b2a95afe7d9de5f95abc903119156ceee.zip
26614 + 26615: history -t <fmt> plus ztrftime "-" format modifier
-rw-r--r--ChangeLog10
-rw-r--r--Doc/Zsh/builtins.yo31
-rw-r--r--Doc/Zsh/calsys.yo8
-rw-r--r--Doc/Zsh/prompt.yo22
-rw-r--r--Src/builtin.c44
-rw-r--r--Src/utils.c71
6 files changed, 135 insertions, 51 deletions
diff --git a/ChangeLog b/ChangeLog
index 03c506d7c..a2e781c94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-03-02 Peter Stephenson <pws@csr.com>
+
+ * 26614 plus 26615: Doc/Zsh/builtins.yo, Doc/Zsh/calsys.yo,
+ Doc/Zsh/prompt.yo, Src/builtin.c, Src/utils.c: support
+ -t <fmt> in history and as a side effect support GNU
+ "-" extension for date and time elements with no padding
+ for those handled internally.
+
2009-03-01 Clint Adams <clint@zsh.org>
* Frank Blendinger: 26656: Completion/Unix/Command/_gnupod:
@@ -11279,5 +11287,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.4587 $
+* $Revision: 1.4588 $
*****************************************************
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index d08e3bd90..2ce9aefd1 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -484,7 +484,9 @@ Do nothing and return an exit status of 1.
findex(fc)
cindex(history, editing)
cindex(editing history)
-xitem(tt(fc) [ tt(-e) var(ename) ] [ tt(-nlrdDfEim) ] [ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
+xitem(tt(fc) [ tt(-e) var(ename) ] [ tt(-m) var(match) ] [ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
+xitem(tt(fc) tt(-l) [ tt(-nrdfEiD) ] [ tt(-t) var(timefmt) ] [ tt(-m) var(match) ])
+xitem( [ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
xitem(tt(fc) tt(-p) [ tt(-a) ] [ var(filename) [ var(histsize) [ var(savehistsize) ] ] ])
xitem(tt(fc) tt(-P))
item(tt(fc) tt(-ARWI) [ var(filename) ])(
@@ -517,13 +519,26 @@ or to -1 if the tt(-l) flag is given.
The flag tt(-r) reverses the order of the commands and the
flag tt(-n) suppresses command numbers when listing.
-Also when listing, tt(-d) prints timestamps for each command, and
-tt(-f) prints full time-date stamps. Adding the tt(-E) flag
-causes the dates to be printed as `var(dd)tt(.)var(mm)tt(.)var(yyyy)',
-instead of the default `var(mm)tt(/)var(dd)tt(/)var(yyyy)'.
-Adding the tt(-i) flag causes the dates to be printed in ISO8601
-`var(yyyy)tt(-)var(mm)tt(-)var(dd)' format.
-With the tt(-D) flag, tt(fc) prints elapsed times.
+
+Also when listing,
+startsitem()
+sitem(tt(-d))(prints timestamps for each command)
+sitem(tt(-f))(prints full time-date stamps in the US
+`var(MM)tt(/)var(DD)tt(/)var(YY) var(hh):var(mm)' format)
+sitem(tt(-E))(prints full time-date stamps in the European
+`var(dd)tt(.)var(mm)tt(.)var(yyyy) var(hh):var(mm)' format)
+sitem(tt(-i))(prints full time-date stamps in ISO8601
+`var(yyyy)tt(-)var(mm)tt(-)var(dd) var(hh):var(mm)' format)
+sitem(tt(-t) var(fmt))(prints time and date stamps in the given format;
+var(fmt) is formatted with the strftime function with the zsh extensions
+described for the tt(%D{)var(string)tt(}) prompt format in
+ifzman(the section EXPANSION OF PROMPT SEQUENCES in zmanref(zshmisc))\
+ifnzman(noderef(Prompt Expansion)). The resulting formatted string must be
+no more than 256 characters or will not be printed.
+)
+sitem(tt(-D))(prints elapsed times; may be combined with one of the
+options above.)
+endsitem()
cindex(history, stack)
cindex(stack, history)
diff --git a/Doc/Zsh/calsys.yo b/Doc/Zsh/calsys.yo
index 05a644f2e..68f68a8d2 100644
--- a/Doc/Zsh/calsys.yo
+++ b/Doc/Zsh/calsys.yo
@@ -613,9 +613,11 @@ The location of the main calendar. The default is tt(~/calendar).
kindex(date-format)
item(tt(date-format))(
A tt(strftime) format string (see manref(strftime)(3)) with the zsh
-extensions tt(%f) for a day of the month with no leading zero or space
-for single digits, and tt(%k) or tt(%l) for the hour of the day on the 24-
-or 12-hour clock, again with no leading zero or space for single digits.
+extensions providing various numbers with no leading zero or space
+if the number is a single digit as described for the
+tt(%D{)var(string)tt(}) prompt format in
+ifzman(the section EXPANSION OF PROMPT SEQUENCES in zmanref(zshmisc))\
+ifnzman(noderef(Prompt Expansion)).
This is used for outputting dates in tt(calendar), both to support
the tt(-v) option and when adding recurring events back to the calendar
diff --git a/Doc/Zsh/prompt.yo b/Doc/Zsh/prompt.yo
index c30bb0c3c..c11b2553d 100644
--- a/Doc/Zsh/prompt.yo
+++ b/Doc/Zsh/prompt.yo
@@ -171,11 +171,23 @@ The date in var(mm)tt(/)var(dd)tt(/)var(yy) format.
)
item(tt(%D{)var(string)tt(}))(
var(string) is formatted using the tt(strftime) function.
-See manref(strftime)(3) for more details. Three additional codes are
-available: tt(%f) prints the day of the month, like tt(%e) but
-without any preceding space if the day is a single digit, and
-tt(%K)/tt(%L) correspond to tt(%k)/tt(%l) for the hour of the day
-(24/12 hour clock) in the same way.
+See manref(strftime)(3) for more details. Various zsh
+extensions provide numbers with no leading zero or space
+if the number is a single digit:
+
+startsitem()
+sitem(tt(%f))(a day of the month)
+sitem(tt(%K))(the hour of the day on the 24-hour clock)
+sitem(tt(%L))(the hour of the day on the 12-hour clock)
+endsitem()
+
+The GNU extension that a `tt(-)' between the tt(%) and the
+format character causes a leading zero or space to be stripped
+is handled directly by the shell for the format characters tt(d), tt(f),
+tt(H), tt(k), tt(l), tt(m), tt(M), tt(S) and tt(y); any other format
+characters are provided to tt(strftime()) with any leading `tt(-)',
+present, so the handling is system dependent. Further GNU
+extensions are not supported at present.
)
enditem()
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) {