Date: Thu, 11 Nov 1999 00:43:29 -0500 (EST) From: "Crist J. Clark" <cjc@cc942873-a.ewndsr1.nj.home.com> To: FreeBSD-gnats-submit@freebsd.org Cc: kevin.ruddy@powerdog.com Subject: bin/14817: strptime(3) '%C' conversion incorrect Message-ID: <199911110543.AAA45760@cc942873-a.ewndsr1.nj.home.com>
next in thread | raw e-mail | index | archive | help
>Number: 14817 >Category: bin >Synopsis: strptime(3) '%C' conversion incorrect >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Nov 10 21:40:01 PST 1999 >Closed-Date: >Last-Modified: >Originator: Crist J. Clark >Release: FreeBSD 3.3-STABLE i386 >Organization: >Environment: FreeBSD 3.3-STABLE. Default C library >Description: The strptime(3) function fills a time 'tm structure' from a user's string using a format also provided by the user. However, the '%C' conversion does not work as described in strftime(3) (which strptime(3) references as containing the key for the conversions), nor does a simple 'date +%C' return what the actual strptime(3) function wants. >How-To-Repeat: A C fragment, struct tm tm; strptime("19","%C",&tm); printf("%d\n",tm.tm_year); Which fails using the existing code. It should return, 0 Or of we were to substitute "20" for "19", 100 >Fix: I actually looked at strptime(3) to fix something else (it can't read formats that run together, e.g "%y%j%H%M%S"), when I noticed the way it handles '%C' is contradictory to the manpages and date(1)'s operation. It was a quick fix. Patch: --- /usr/src/lib/libc/stdtime/strptime.c Sun Aug 29 21:55:58 1999 +++ strptime.c Thu Nov 11 00:38:39 1999 @@ -1,4 +1,13 @@ /* + * 1999/11/11, cjclark@alum.mit.edu + * + * The '%C' conversion specification did not conform to the documentation + * in strftime(3) or in the operation of 'date +%C'. Fixed. The '%C' + * conversion demands _exactly_ two digits (like the output) and must + * be in the range 19-20. This 19-20 is converted to 0 or 100 being added + * to tm_year. + */ +/* * Powerdog Industries kindly requests feedback from anyone modifying * this function: * @@ -115,12 +124,6 @@ return 0; break; - case 'C': - buf = _strptime(buf, Locale->date_fmt, tm); - if (buf == 0) - return 0; - break; - case 'c': buf = _strptime(buf, "%x %X", tm); if (buf == 0) @@ -163,7 +166,20 @@ return 0; break; - case 'j': + case 'C': /* "Century" (required to be two digits) */ + if (!(isdigit((unsigned char)*buf) && isdigit((unsigned char)*(buf+1)))) + return 0; + i = 10*(*buf++ - '0'); + i += *buf++ - '0'; + + if ((i < 19) || (i > 20)) + return 0; + + tm->tm_year = i*100 - 1900; + + break; + + case 'j': /* Day of year */ if (!isdigit((unsigned char)*buf)) return 0; >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911110543.AAA45760>