strptime: make %k and %l specifiers match their description in

strftime(3), and allow them to process space-padded input.

PR:		230720
Submitted by:	rlittle@inetco.com (original version)
Approved by:	kib (mentor, implicit)
Differential Revision:	https://reviews.freebsd.org/D17761
This commit is contained in:
yuripv 2018-11-03 23:37:13 +00:00
parent 85d52a2654
commit 8c9be543ce
2 changed files with 24 additions and 6 deletions

View File

@ -331,8 +331,19 @@ ATF_TC_BODY(hour, tc)
h_fail("00", "%I");
h_fail("13", "%I");
#ifdef __FreeBSD__
h_fail("00", "%l");
h_pass("0", "%k", 1, -1, -1, 0, -1, -1, -1, -1, -1);
h_pass("04", "%k", 2, -1, -1, 4, -1, -1, -1, -1, -1);
h_pass(" 8", "%k", 2, -1, -1, 8, -1, -1, -1, -1, -1);
h_pass("23", "%k", 2, -1, -1, 23, -1, -1, -1, -1, -1);
h_fail("24", "%k");
h_fail("0", "%l");
h_pass("1", "%l", 1, -1, -1, 1, -1, -1, -1, -1, -1);
h_pass("05", "%l", 2, -1, -1, 5, -1, -1, -1, -1, -1);
h_pass(" 9", "%l", 2, -1, -1, 9, -1, -1, -1, -1, -1);
h_pass("12", "%l", 2, -1, -1, 12, -1, -1, -1, -1, -1);
h_fail("13", "%l");
#endif

View File

@ -272,17 +272,24 @@ _strptime(const char *buf, const char *fmt, struct tm *tm, int *GMTp,
case 'k':
case 'l':
/*
* Of these, %l is the only specifier explicitly
* documented as not being zero-padded. However,
* there is no harm in allowing zero-padding.
* %k and %l specifiers are documented as being
* blank-padded. However, there is no harm in
* allowing zero-padding.
*
* XXX The %l specifier may gobble one too many
* XXX %k and %l specifiers may gobble one too many
* digits if used incorrectly.
*/
len = 2;
if ((c == 'k' || c == 'l') &&
isblank_l((unsigned char)*buf, locale)) {
buf++;
len = 1;
}
if (!isdigit_l((unsigned char)*buf, locale))
return (NULL);
len = 2;
for (i = 0; len && *buf != 0 &&
isdigit_l((unsigned char)*buf, locale); buf++) {
i *= 10;