From: Brian Inglis <Brian.Inglis@SystematicSW.ab.ca>
To: Cygwin Patches <cygwin-patches@cygwin.com>,
Cygwin Patches <Cygwin-Patches@Cygwin.com>
Cc: Brian Inglis <Brian.Inglis@SystematicSW.ab.ca>
Subject: [PATCH 1/3] strftime.c(__strftime): add %i, %q, %v, tests; tweak %Z docs
Date: Tue, 13 Sep 2022 20:52:34 -0600 [thread overview]
Message-ID: <20220914025236.54080-2-Brian.Inglis@SystematicSW.ab.ca> (raw)
In-Reply-To: <20220914025236.54080-1-Brian.Inglis@SystematicSW.ab.ca>
[-- Attachment #1: Type: text/plain, Size: 462 bytes --]
newlib/libc/time/strftime.c(__strftime):
%i year in century [00..99] Synonym for "%y". Non-POSIX extension. [tm_year]
%q GNU quarter of the year (from `<<1>>' to `<<4>>') [tm_mon]
%v OSX/Ruby VMS/Oracle date "%d-%b-%Y". Non-POSIX extension. [tm_mday, tm_mon, tm_year]
%Z clarify current time zone *abbreviation* not "name" [tm_isdst]
---
newlib/libc/time/strftime.c | 67 +++++++++++++++++++++++++++++++++++--
1 file changed, 64 insertions(+), 3 deletions(-)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-strftime.c-__strftime-add-i-q-v-tests-tweak-Z-docs.patch --]
[-- Type: text/x-patch; name="0001-strftime.c-__strftime-add-i-q-v-tests-tweak-Z-docs.patch", Size: 7077 bytes --]
diff --git a/newlib/libc/time/strftime.c b/newlib/libc/time/strftime.c
index 9c884dca9766..d434c0d0233c 100644
--- a/newlib/libc/time/strftime.c
+++ b/newlib/libc/time/strftime.c
@@ -128,6 +128,9 @@ o %I
The hour (on a 12-hour clock), formatted with two digits (from
`<<01>>' to `<<12>>'). [tm_hour]
+o %i
+Synonym for "%y". Non-POSIX extension. [tm_year]
+
o %j
The count of days in the year, formatted with three digits
(from `<<001>>' to `<<366>>'). [tm_yday]
@@ -161,6 +164,10 @@ the current locale. [tm_hour]
o %P
Same as '<<%p>>', but in lowercase. This is a GNU extension. [tm_hour]
+o %q
+Quarter of the year (from `<<1>>' to `<<4>>'), with January starting
+the first quarter. This is a GNU extension. [tm_mon]
+
o %r
Replaced by the time in a.m. and p.m. notation. In the "C" locale this
is equivalent to "%I:%M:%S %p". In locales which don't define a.m./p.m.
@@ -198,6 +205,10 @@ The week number, where weeks start on Monday, week 1 contains January 4th,
and earlier days are in the previous year. Formatted with two digits
(from `<<01>>' to `<<53>>'). See also <<%G>>. [tm_year, tm_wday, tm_yday]
+o %v
+A string representing the OSX/Ruby VMS/Oracle date format, in the form
+`<<"%d-%b-%Y">>'. Non-POSIX extension. [tm_mday, tm_mon, tm_year]
+
o %w
The weekday as a number, 0-based from Sunday (from `<<0>>' to `<<6>>').
[tm_wday]
@@ -235,9 +246,9 @@ savings offset for the current timezone. The offset is determined from
the TZ environment variable, as if by calling tzset(). [tm_isdst]
o %Z
-The time zone name. If tm_isdst is negative, no output is generated.
-Otherwise, the time zone name is based on the TZ environment variable,
-as if by calling tzset(). [tm_isdst]
+The current time zone abbreviation. If tm_isdst is negative, no output
+is generated. Otherwise, the time zone abbreviation is based on the TZ
+environment variable, as if by calling tzset(). [tm_isdst]
o %%
A single character, `<<%>>'.
@@ -1086,6 +1097,11 @@ recurse:
return 0;
}
break;
+ case CQ('q'): /* GNU quarter year */
+ len = snprintf (&s[count], maxsize - count, CQ("%.1d"),
+ tim_p->tm_mon / 3 + 1);
+ CHECK_LENGTH ();
+ break;
case CQ('R'):
len = snprintf (&s[count], maxsize - count, CQ("%.2d:%.2d"),
tim_p->tm_hour, tim_p->tm_min);
@@ -1241,6 +1257,36 @@ recurse:
CHECK_LENGTH ();
}
break;
+ case CQ('v'): /* OSX/Ruby extension VMS/Oracle date format */
+ { /* %v is equivalent to "%d-%b-%Y", flags and width can change year
+ format. Recurse to avoid need to replicate %b and %Y formation. */
+ CHAR fmtbuf[32], *fmt = fmtbuf;
+ STRCPY (fmt, CQ("%d-%b-%"));
+ fmt += strlen (fmt);
+ if (pad) /* '0' or '+' */
+ *fmt++ = pad;
+ else
+ *fmt++ = '+';
+ if (!pad)
+ width = 10;
+ if (width < 6)
+ width = 6;
+ width -= 6;
+ if (width)
+ {
+ len = snprintf (fmt, fmtbuf + 32 - fmt, CQ("%lu"), width);
+ if (len > 0)
+ fmt += len;
+ }
+ STRCPY (fmt, CQ("Y"));
+ len = __strftime (&s[count], maxsize - count, fmtbuf, tim_p,
+ locale, era_info, alt_digits);
+ if (len > 0)
+ count += len;
+ else
+ return 0;
+ }
+ break;
case CQ('w'):
#ifdef _WANT_C99_TIME_FORMATS
if (alt == CQ('O') && *alt_digits)
@@ -1270,6 +1316,7 @@ recurse:
CHECK_LENGTH ();
}
break;
+ case CQ('i'): /* Non-POSIX extension. */
case CQ('y'):
{
#ifdef _WANT_C99_TIME_FORMATS
@@ -1524,6 +1571,7 @@ const struct test Vec0[] = {
{ CQ("%h"), 3+1, EXP(CQ("Dec")) },
{ CQ("%H"), 2+1, EXP(CQ("09")) },
{ CQ("%I"), 2+1, EXP(CQ("09")) },
+ { CQ("%i"), 2+1, EXP(CQ("08")) },
{ CQ("%j"), 3+1, EXP(CQ("365")) },
{ CQ("%k"), 2+1, EXP(CQ(" 9")) },
{ CQ("%l"), 2+1, EXP(CQ(" 9")) },
@@ -1531,6 +1579,7 @@ const struct test Vec0[] = {
{ CQ("%M"), 2+1, EXP(CQ("53")) },
{ CQ("%n"), 1+1, EXP(CQ("\n")) },
{ CQ("%p"), 2+1, EXP(CQ("AM")) },
+ { CQ("%q"), 1+1, EXP(CQ("4")) },
{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) },
{ CQ("%R"), 5+1, EXP(CQ("09:53")) },
{ CQ("%s"), 2+1, EXP(CQ("1230648827")) },
@@ -1540,6 +1589,7 @@ const struct test Vec0[] = {
{ CQ("%u"), 1+1, EXP(CQ("2")) },
{ CQ("%U"), 2+1, EXP(CQ("52")) },
{ CQ("%V"), 2+1, EXP(CQ("01")) },
+ { CQ("%v"), 11+1, EXP(CQ("30-Dec-2008")) },
{ CQ("%w"), 1+1, EXP(CQ("2")) },
{ CQ("%W"), 2+1, EXP(CQ("52")) },
{ CQ("%x"), 8+1, EXP(CQ("12/30/08")) },
@@ -1585,6 +1635,7 @@ const struct test Vec1[] = {
{ CQ("%h"), 3+1, EXP(CQ("Jul")) },
{ CQ("%H"), 2+1, EXP(CQ("23")) },
{ CQ("%I"), 2+1, EXP(CQ("11")) },
+ { CQ("%i"), 2+1, EXP(CQ("08")) },
{ CQ("%j"), 3+1, EXP(CQ("184")) },
{ CQ("%k"), 2+1, EXP(CQ("23")) },
{ CQ("%l"), 2+1, EXP(CQ("11")) },
@@ -1592,6 +1643,7 @@ const struct test Vec1[] = {
{ CQ("%M"), 2+1, EXP(CQ("01")) },
{ CQ("%n"), 1+1, EXP(CQ("\n")) },
{ CQ("%p"), 2+1, EXP(CQ("PM")) },
+ { CQ("%q"), 1+1, EXP(CQ("3")) },
{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) },
{ CQ("%R"), 5+1, EXP(CQ("23:01")) },
{ CQ("%s"), 2+1, EXP(CQ("1215054073")) },
@@ -1601,6 +1653,7 @@ const struct test Vec1[] = {
{ CQ("%u"), 1+1, EXP(CQ("3")) },
{ CQ("%U"), 2+1, EXP(CQ("26")) },
{ CQ("%V"), 2+1, EXP(CQ("27")) },
+ { CQ("%v"), 11+1, EXP(CQ("02-Jul-2008")) },
{ CQ("%w"), 1+1, EXP(CQ("3")) },
{ CQ("%W"), 2+1, EXP(CQ("26")) },
{ CQ("%x"), 8+1, EXP(CQ("07/02/08")) },
@@ -1662,6 +1715,8 @@ const struct test Vecyr0[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:13 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
+ { CQ("%i"), OUTSIZE, EXP(Year) },
+ { CQ("%v"), OUTSIZE, EXP(CQ("02-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) },
@@ -1708,6 +1763,8 @@ const struct test Vecyr1[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:13 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
+ { CQ("%i"), OUTSIZE, EXP(Year) },
+ { CQ("%v"), OUTSIZE, EXP(CQ("02-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) },
@@ -1745,6 +1802,8 @@ const struct test Vecyrzp[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:60 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
+ { CQ("%i"), OUTSIZE, EXP(Year) },
+ { CQ("%v"), OUTSIZE, EXP(CQ("02-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) },
@@ -1780,6 +1839,8 @@ const struct test Vecyrzn[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:00 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
+ { CQ("%i"), OUTSIZE, EXP(Year) },
+ { CQ("%v"), OUTSIZE, EXP(CQ("02-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) },
next prev parent reply other threads:[~2022-09-14 2:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-14 2:52 [PATCH 0/3] strftime, strptime: " Brian Inglis
2022-09-14 2:52 ` Brian Inglis [this message]
2022-09-14 2:52 ` [PATCH 2/3] strptime.c(strptime_l): add %i, %q, %v Brian Inglis
2022-09-14 2:52 ` [PATCH 3/3] strptime.cc(__strptime): " Brian Inglis
2022-09-15 17:45 ` [PATCH 0/3] strftime, strptime: add %i, %q, %v, tests; tweak %Z docs Jon Turney
2022-09-15 19:52 ` Brian Inglis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220914025236.54080-2-Brian.Inglis@SystematicSW.ab.ca \
--to=brian.inglis@systematicsw.ab.ca \
--cc=cygwin-patches@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).