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:
parent
1ade1c4113
commit
32a8ec8bdd
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user