1/* 2 * Powerdog Industries kindly requests feedback from anyone modifying 3 * this function: 4 * 5 * Date: Thu, 05 Jun 1997 23:17:17 -0400 6 * From: Kevin Ruddy <kevin.ruddy@powerdog.com> 7 * To: James FitzGibbon <james@nexis.net> 8 * Subject: Re: Use of your strptime(3) code (fwd) --- 39 unchanged lines hidden (view full) --- 48 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 49 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 50 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 51 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 52 */ 53 54#ifdef LIBC_RCS 55static const char rcsid[] = |
56 "$FreeBSD: head/lib/libc/stdtime/strptime.c 72168 2001-02-08 17:08:13Z phantom $"; |
57#endif 58 59#ifndef lint 60#ifndef NOID 61static char copyright[] = 62"@(#) Copyright (c) 1994 Powerdog Industries. All rights reserved."; 63static char sccsid[] = "@(#)strptime.c 0.1 (Powerdog) 94/03/27"; 64#endif /* !defined NOID */ --- 18 unchanged lines hidden (view full) --- 83static char * 84_strptime(const char *buf, const char *fmt, struct tm *tm) 85{ 86 char c; 87 const char *ptr; 88 int i, 89 len; 90 int Ealternative, Oalternative; |
91 struct lc_time_T *tptr = __get_current_time_locale(); |
92 93 ptr = fmt; 94 while (*ptr != 0) { 95 if (*buf == 0) 96 break; 97 98 c = *ptr++; 99 --- 13 unchanged lines hidden (view full) --- 113 switch (c) { 114 case 0: 115 case '%': 116 if (*buf++ != '%') 117 return 0; 118 break; 119 120 case '+': |
121 buf = _strptime(buf, tptr->date_fmt, tm); |
122 if (buf == 0) 123 return 0; 124 break; 125 126 case 'C': 127 if (!isdigit((unsigned char)*buf)) 128 return 0; 129 --- 34 unchanged lines hidden (view full) --- 164 break; 165 Oalternative++; 166 goto label; 167 168 case 'F': 169 case 'f': 170 if (!Ealternative) 171 break; |
172 buf = _strptime(buf, (c == 'f') ? tptr->Ef_fmt : tptr->EF_fmt, tm); |
173 if (buf == 0) 174 return 0; 175 break; 176 177 case 'R': 178 buf = _strptime(buf, "%H:%M", tm); 179 if (buf == 0) 180 return 0; --- 7 unchanged lines hidden (view full) --- 188 189 case 'T': 190 buf = _strptime(buf, "%H:%M:%S", tm); 191 if (buf == 0) 192 return 0; 193 break; 194 195 case 'X': |
196 buf = _strptime(buf, tptr->X_fmt, tm); |
197 if (buf == 0) 198 return 0; 199 break; 200 201 case 'x': |
202 buf = _strptime(buf, tptr->x_fmt, tm); |
203 if (buf == 0) 204 return 0; 205 break; 206 207 case 'j': 208 if (!isdigit((unsigned char)*buf)) 209 return 0; 210 --- 73 unchanged lines hidden (view full) --- 284 ptr++; 285 break; 286 287 case 'p': 288 /* 289 * XXX This is bogus if parsed before hour-related 290 * specifiers. 291 */ |
292 len = strlen(tptr->am); 293 if (strncasecmp(buf, tptr->am, len) == 0) { |
294 if (tm->tm_hour > 12) 295 return 0; 296 if (tm->tm_hour == 12) 297 tm->tm_hour = 0; 298 buf += len; 299 break; 300 } 301 |
302 len = strlen(tptr->pm); 303 if (strncasecmp(buf, tptr->pm, len) == 0) { |
304 if (tm->tm_hour > 12) 305 return 0; 306 if (tm->tm_hour != 12) 307 tm->tm_hour += 12; 308 buf += len; 309 break; 310 } 311 312 return 0; 313 314 case 'A': 315 case 'a': |
316 for (i = 0; i < asizeof(tptr->weekday); i++) { |
317 if (c == 'A') { |
318 len = strlen(tptr->weekday[i]); |
319 if (strncasecmp(buf, |
320 tptr->weekday[i], |
321 len) == 0) 322 break; 323 } else { |
324 len = strlen(tptr->wday[i]); |
325 if (strncasecmp(buf, |
326 tptr->wday[i], |
327 len) == 0) 328 break; 329 } 330 } |
331 if (i == asizeof(tptr->weekday)) |
332 return 0; 333 334 tm->tm_wday = i; 335 buf += len; 336 break; 337 338 case 'U': 339 case 'W': --- 62 unchanged lines hidden (view full) --- 402 if (*buf != 0 && isspace((unsigned char)*buf)) 403 while (*ptr != 0 && !isspace((unsigned char)*ptr)) 404 ptr++; 405 break; 406 407 case 'B': 408 case 'b': 409 case 'h': |
410 for (i = 0; i < asizeof(tptr->month); i++) { |
411 if (Oalternative) { 412 if (c == 'B') { |
413 len = strlen(tptr->alt_month[i]); |
414 if (strncasecmp(buf, |
415 tptr->alt_month[i], |
416 len) == 0) 417 break; 418 } 419 } else { 420 if (c == 'B') { |
421 len = strlen(tptr->month[i]); |
422 if (strncasecmp(buf, |
423 tptr->month[i], |
424 len) == 0) 425 break; 426 } else { |
427 len = strlen(tptr->mon[i]); |
428 if (strncasecmp(buf, |
429 tptr->mon[i], |
430 len) == 0) 431 break; 432 } 433 } 434 } |
435 if (i == asizeof(tptr->month)) |
436 return 0; 437 438 tm->tm_mon = i; 439 buf += len; 440 break; 441 442 case 'm': 443 if (!isdigit((unsigned char)*buf)) --- 97 unchanged lines hidden --- |