1 /* Replacements for routines missing on some systems.
2 Copyright (C) 1995-2005 Free Software Foundation, Inc.
4 This file is part of GNU Wget.
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 In addition, as a special exception, the Free Software Foundation
21 gives permission to link the code of its release of Wget with the
22 OpenSSL project's "OpenSSL" library (or with modified versions of it
23 that use the same license as the "OpenSSL" library), and distribute
24 the linked executables. You must obey the GNU General Public License
25 in all respects for all of the code used other than "OpenSSL". If you
26 modify this file, you may extend this exception to your version of the
27 file, but you are not obligated to do so. If you do not wish to do
28 so, delete this exception statement from your version. */
44 /* Some systems lack certain functions normally taken for granted.
45 For example, Windows doesn't have strptime, and some systems lack
46 strcasecmp and strncasecmp. This file should contain fallback
47 implementations of the missing functions. It should *not* define
48 new Wget-specific functions -- those should placed in utils.c or
51 /* strcasecmp and strncasecmp apparently originated with BSD 4.4.
52 SUSv3 seems to be the only standard out there (that I can find)
53 that requires their existence, so there are systems that lack them
54 still in use. Note that these don't get defined under Windows
55 because mswindows.h defines them to the equivalent Windows
56 functions stricmp and strnicmp. */
58 #ifndef HAVE_STRCASECMP
60 /* Compare S1 and S2, ignoring case, returning less than, equal to or
61 greater than zero if S1 is lexiographically less than,
62 equal to or greater than S2. */
64 strcasecmp (const char *s1, const char *s2)
66 register const unsigned char *p1 = (const unsigned char *) s1;
67 register const unsigned char *p2 = (const unsigned char *) s2;
84 #endif /* not HAVE_STRCASECMP */
86 #ifndef HAVE_STRNCASECMP
88 /* Compare no more than N characters of S1 and S2,
89 ignoring case, returning less than, equal to or
90 greater than zero if S1 is lexicographically less
91 than, equal to or greater than S2. */
93 strncasecmp (const char *s1, const char *s2, size_t n)
95 register const unsigned char *p1 = (const unsigned char *) s1;
96 register const unsigned char *p2 = (const unsigned char *) s2;
99 if (p1 == p2 || n == 0)
104 c1 = TOLOWER (*p1++);
105 c2 = TOLOWER (*p2++);
106 if (c1 == '\0' || c1 != c2)
112 #endif /* not HAVE_STRNCASECMP */
114 /* strpbrk is required by POSIX and C99, but it is missing from some
115 older systems and from Windows. */
118 /* Find the first ocurrence in S of any character in ACCEPT. */
120 strpbrk (const char *s, const char *accept)
124 const char *a = accept;
133 #endif /* HAVE_STRPBRK */
135 /* mktime is a BSD 4.3 function also required by POSIX and C99. I
136 don't know if there is a widely used system that lacks it, so it
137 might be a candidate for removal. */
140 /* From GNU libc 2.0. */
142 /* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
143 This file is part of the GNU C Library.
144 Contributed by Paul Eggert (eggert@twinsun.com). */
147 # define HAVE_LIMITS_H 1
148 # define HAVE_LOCALTIME_R 1
149 # define STDC_HEADERS 1
152 /* Assume that leap seconds are possible, unless told otherwise.
153 If the host has a `zic' command with a `-L leapsecondfilename' option,
154 then it supports leap seconds; otherwise it probably doesn't. */
155 #ifndef LEAP_SECONDS_POSSIBLE
156 # define LEAP_SECONDS_POSSIBLE 1
160 # define __P(args) args
161 #endif /* Not __P. */
168 # define INT_MIN (~0 << (sizeof (int) * CHAR_BIT - 1))
171 # define INT_MAX (~0 - INT_MIN)
175 /* The outer cast to time_t works around a bug in Cray C 5.0.3.0. */
176 # define TIME_T_MIN ((time_t) \
177 (0 < (time_t) -1 ? (time_t) 0 \
178 : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1)))
181 # define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
184 #define TM_YEAR_BASE 1900
185 #define EPOCH_YEAR 1970
188 /* Nonzero if YEAR is a leap year (every 4 years,
189 except every 100th isn't, and every 400th is). */
190 # define __isleap(year) \
191 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
194 /* How many days come before each month (0-12). */
195 /* __mon_yday[][] is common to mktime and strptime implementations.
197 const unsigned short int __mon_yday[2][13];
198 #ifndef NEED_MON_YDAY
199 # define NEED_MON_YDAY
202 static time_t ydhms_tm_diff __P ((int, int, int, int, int, const struct tm *));
203 time_t __mktime_internal __P ((struct tm *,
204 struct tm *(*) (const time_t *, struct tm *),
209 # define localtime_r __localtime_r
211 # if ! HAVE_LOCALTIME_R && ! defined localtime_r
212 /* Approximate localtime_r as best we can in its absence. */
213 # define localtime_r my_mktime_localtime_r
214 static struct tm *localtime_r __P ((const time_t *, struct tm *));
220 struct tm *l = localtime (t);
226 # endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
230 /* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP),
231 measured in seconds, ignoring leap seconds.
232 YEAR uses the same numbering as TM->tm_year.
233 All values are in range, except possibly YEAR.
234 If overflow occurs, yield the low order bits of the correct answer. */
236 ydhms_tm_diff (year, yday, hour, min, sec, tp)
237 int year, yday, hour, min, sec;
240 /* Compute intervening leap days correctly even if year is negative.
241 Take care to avoid int overflow. time_t overflow is OK, since
242 only the low order bits of the correct time_t answer are needed.
243 Don't convert to time_t until after all divisions are done, since
244 time_t might be unsigned. */
245 int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - ! (year & 3);
246 int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (tp->tm_year & 3);
247 int a100 = a4 / 25 - (a4 % 25 < 0);
248 int b100 = b4 / 25 - (b4 % 25 < 0);
249 int a400 = a100 >> 2;
250 int b400 = b100 >> 2;
251 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
252 time_t years = year - (time_t) tp->tm_year;
253 time_t days = (365 * years + intervening_leap_days
254 + (yday - tp->tm_yday));
255 return (60 * (60 * (24 * days + (hour - tp->tm_hour))
256 + (min - tp->tm_min))
257 + (sec - tp->tm_sec));
261 static time_t localtime_offset;
263 /* Convert *TP to a time_t value. */
269 /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
270 time zone names contained in the external variable `tzname' shall
271 be set as if the tzset() function had been called. */
275 return __mktime_internal (tp, localtime_r, &localtime_offset);
278 /* Convert *TP to a time_t value, inverting
279 the monotonic and mostly-unit-linear conversion function CONVERT.
280 Use *OFFSET to keep track of a guess at the offset of the result,
281 compared to what the result would be for UTC without leap seconds.
282 If *OFFSET's guess is correct, only one CONVERT call is needed. */
284 __mktime_internal (tp, convert, offset)
286 struct tm *(*convert) __P ((const time_t *, struct tm *));
292 /* The maximum number of probes (calls to CONVERT) should be enough
293 to handle any combinations of time zone rule changes, solar time,
294 and leap seconds. Posix.1 prohibits leap seconds, but some hosts
296 int remaining_probes = 4;
298 /* Time requested. Copy it in case CONVERT modifies *TP; this can
299 occur if TP is localtime's returned value and CONVERT is localtime. */
300 int sec = tp->tm_sec;
301 int min = tp->tm_min;
302 int hour = tp->tm_hour;
303 int mday = tp->tm_mday;
304 int mon = tp->tm_mon;
305 int year_requested = tp->tm_year;
306 int isdst = tp->tm_isdst;
308 /* Ensure that mon is in range, and set year accordingly. */
309 int mon_remainder = mon % 12;
310 int negative_mon_remainder = mon_remainder < 0;
311 int mon_years = mon / 12 - negative_mon_remainder;
312 int year = year_requested + mon_years;
314 /* The other values need not be in range:
315 the remaining code handles minor overflows correctly,
316 assuming int and time_t arithmetic wraps around.
317 Major overflows are caught at the end. */
319 /* Calculate day of year from year, month, and day of month.
320 The result need not be in range. */
321 int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)]
322 [mon_remainder + 12 * negative_mon_remainder])
325 int sec_requested = sec;
326 #if LEAP_SECONDS_POSSIBLE
327 /* Handle out-of-range seconds specially,
328 since ydhms_tm_diff assumes every minute has 60 seconds. */
335 /* Invert CONVERT by probing. First assume the same offset as last time.
336 Then repeatedly use the error to improve the guess. */
338 tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
339 tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
340 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
342 for (t = t0 + *offset;
343 (dt = ydhms_tm_diff (year, yday, hour, min, sec, (*convert) (&t, &tm)));
345 if (--remaining_probes == 0)
348 /* Check whether tm.tm_isdst has the requested value, if any. */
349 if (0 <= isdst && 0 <= tm.tm_isdst)
351 int dst_diff = (isdst != 0) - (tm.tm_isdst != 0);
354 /* Move two hours in the direction indicated by the disagreement,
355 probe some more, and switch to a new time if found.
356 The largest known fallback due to daylight savings is two hours:
357 once, in Newfoundland, 1988-10-30 02:00 -> 00:00. */
358 time_t ot = t - 2 * 60 * 60 * dst_diff;
359 while (--remaining_probes != 0)
362 if (! (dt = ydhms_tm_diff (year, yday, hour, min, sec,
363 (*convert) (&ot, &otm))))
370 break; /* Avoid a redundant probe. */
377 #if LEAP_SECONDS_POSSIBLE
378 if (sec_requested != tm.tm_sec)
380 /* Adjust time to reflect the tm_sec requested, not the normalized value.
381 Also, repair any damage from a false match due to a leap second. */
382 t += sec_requested - sec + (sec == 0 && tm.tm_sec == 60);
383 (*convert) (&t, &tm);
387 if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
389 /* time_t isn't large enough to rule out overflows in ydhms_tm_diff,
390 so check for major overflows. A gross check suffices,
391 since if t has overflowed, it is off by a multiple of
392 TIME_T_MAX - TIME_T_MIN + 1. So ignore any component of
393 the difference that is bounded by a small value. */
395 double dyear = (double) year_requested + mon_years - tm.tm_year;
396 double dday = 366 * dyear + mday;
397 double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
399 if (TIME_T_MAX / 3 - TIME_T_MIN / 3 < (dsec < 0 ? - dsec : dsec))
408 weak_alias (mktime, timelocal)
410 #endif /* not HAVE_MKTIME */
412 /* strptime is required by POSIX, but it is missing from Windows,
413 which means we must keep a fallback implementation. It is
414 reportedly missing or broken on many older systems as well. */
416 #ifndef HAVE_STRPTIME
417 /* From GNU libc 2.1.3. */
418 /* Ulrich, thanks for helping me out with this! --hniksic */
420 /* strptime - Convert a string representation of time to a time value.
421 Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
422 This file is part of the GNU C Library.
423 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. */
425 /* XXX This version of the implementation is not really complete.
426 Some of the fields cannot add information alone. But if seeing
427 some of them in the same format (such as year, week and weekday)
428 this is enough information for determining the date. */
431 # define __P(args) args
434 #if ! HAVE_LOCALTIME_R && ! defined localtime_r
436 # define localtime_r __localtime_r
438 /* Approximate localtime_r as best we can in its absence. */
439 # define localtime_r my_localtime_r
440 static struct tm *localtime_r __P ((const time_t *, struct tm *));
446 struct tm *l = localtime (t);
452 # endif /* ! _LIBC */
453 #endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
456 #define match_char(ch1, ch2) if (ch1 != ch2) return NULL
457 #if defined __GNUC__ && __GNUC__ >= 2
458 # define match_string(cs1, s2) \
459 ({ size_t len = strlen (cs1); \
460 int result = strncasecmp ((cs1), (s2), len) == 0; \
461 if (result) (s2) += len; \
464 /* Oh come on. Get a reasonable compiler. */
465 # define match_string(cs1, s2) \
466 (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))
468 /* We intentionally do not use isdigit() for testing because this will
469 lead to problems with the wide character version. */
470 #define get_number(from, to, n) \
476 if (*rp < '0' || *rp > '9') \
480 val += *rp++ - '0'; \
481 } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \
482 if (val < from || val > to) \
486 /* Added check for __GNUC__ extensions here for Wget. --abbotti */
487 # if defined __GNUC__ && __GNUC__ >= 2
488 # define get_alt_number(from, to, n) \
490 __label__ do_normal; \
491 if (*decided != raw) \
493 const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \
501 while (*alts != '\0') \
503 size_t len = strlen (alts); \
504 if (strncasecmp (alts, rp, len) == 0) \
511 if (*decided == not && ! any) \
513 /* If we haven't read anything it's an error. */ \
516 /* Correct the premature multiplication. */ \
522 } while (--__n > 0 && val * 10 <= to); \
523 if (val < from || val > to) \
529 get_number (from, to, n); \
534 # define get_alt_number(from, to, n) \
536 if (*decided != raw) \
538 const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \
546 while (*alts != '\0') \
548 size_t len = strlen (alts); \
549 if (strncasecmp (alts, rp, len) == 0) \
556 if (*decided == not && ! any) \
558 /* If we haven't read anything it's an error. */ \
561 /* Correct the premature multiplication. */ \
567 } while (--__n > 0 && val * 10 <= to); \
568 if (val < from || val > to) \
574 get_number (from, to, n); \
577 # endif /* defined __GNUC__ && __GNUC__ >= 2 */
579 # define get_alt_number(from, to, n) \
580 /* We don't have the alternate representation. */ \
581 get_number(from, to, n)
583 #define recursive(new_fmt) \
584 (*(new_fmt) != '\0' \
585 && (rp = strptime_internal (rp, (new_fmt), tm, decided)) != NULL)
589 /* This is defined in locale/C-time.c in the GNU libc. */
590 extern const struct locale_data _nl_C_LC_TIME;
591 extern const unsigned short int __mon_yday[2][13];
593 # define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)
594 # define ab_weekday_name \
595 (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)
596 # define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)
597 # define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
598 # define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
599 # define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string)
600 # define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
601 # define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)
602 # define HERE_T_FMT_AMPM \
603 (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)
604 # define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)
606 # define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n)
608 static char const weekday_name[][10] =
610 "Sunday", "Monday", "Tuesday", "Wednesday",
611 "Thursday", "Friday", "Saturday"
613 static char const ab_weekday_name[][4] =
615 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
617 static char const month_name[][10] =
619 "January", "February", "March", "April", "May", "June",
620 "July", "August", "September", "October", "November", "December"
622 static char const ab_month_name[][4] =
624 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
625 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
627 # define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"
628 # define HERE_D_FMT "%m/%d/%y"
629 # define HERE_AM_STR "AM"
630 # define HERE_PM_STR "PM"
631 # define HERE_T_FMT_AMPM "%I:%M:%S %p"
632 # define HERE_T_FMT "%H:%M:%S"
634 /* __mon_yday[][] is common to mktime and strptime implementations.
636 const unsigned short int __mon_yday[2][13];
637 # ifndef NEED_MON_YDAY
638 # define NEED_MON_YDAY
642 /* Status of lookup: do we use the locale data or the raw data? */
643 enum locale_status { not, loc, raw };
647 /* Nonzero if YEAR is a leap year (every 4 years,
648 except every 100th isn't, and every 400th is). */
649 # define __isleap(year) \
650 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
653 /* Compute the day of the week. */
655 day_of_the_week (struct tm *tm)
657 /* We know that January 1st 1970 was a Thursday (= 4). Compute the
658 the difference between this data in the one on TM and so determine
660 int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2);
662 + (365 * (tm->tm_year - 70))
664 - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0)
665 + (((corr_year / 4) / 25) / 4)
666 + __mon_yday[0][tm->tm_mon]
668 tm->tm_wday = ((wday % 7) + 7) % 7;
671 /* Compute the day of the year. */
673 day_of_the_year (struct tm *tm)
675 tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon]
676 + (tm->tm_mday - 1));
683 strptime_internal __P ((const char *buf, const char *format, struct tm *tm,
684 enum locale_status *decided));
690 strptime_internal (rp, fmt, tm, decided)
694 enum locale_status *decided;
697 const char *rp_backup;
702 int century, want_century;
703 int have_wday, want_xday;
705 int have_mon, have_mday;
710 have_wday = want_xday = have_yday = have_mon = have_mday = 0;
714 /* A white space in the format string matches 0 more or white
715 space in the input string. */
718 while (ISSPACE (*rp))
724 /* Any character but `%' must be matched by the same character
725 in the iput string. */
728 match_char (*fmt++, *rp++);
734 /* We need this for handling the `E' modifier. */
739 /* Make back up of current processing pointer. */
746 /* Match the `%' character itself. */
747 match_char ('%', *rp++);
751 /* Match day of week. */
752 for (cnt = 0; cnt < 7; ++cnt)
757 if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
760 && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
765 if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
768 && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
769 ab_weekday_name[cnt]))
776 && (match_string (weekday_name[cnt], rp)
777 || match_string (ab_weekday_name[cnt], rp)))
784 /* Does not match a weekday name. */
792 /* Match month name. */
793 for (cnt = 0; cnt < 12; ++cnt)
798 if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
801 && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
806 if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
809 && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
816 if (match_string (month_name[cnt], rp)
817 || match_string (ab_month_name[cnt], rp))
824 /* Does not match a month name. */
830 /* Match locale's date and time format. */
834 if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
843 if (*decided == not &&
844 strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
852 if (!recursive (HERE_D_T_FMT))
857 /* Match century number. */
858 get_number (0, 99, 2);
864 /* Match day of month. */
865 get_number (1, 31, 2);
871 if (!recursive ("%Y-%m-%d"))
879 if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
889 && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
899 /* Match standard day format. */
900 if (!recursive (HERE_D_FMT))
906 /* Match hour in 24-hour clock. */
907 get_number (0, 23, 2);
912 /* Match hour in 12-hour clock. */
913 get_number (1, 12, 2);
914 tm->tm_hour = val % 12;
918 /* Match day number of year. */
919 get_number (1, 366, 3);
920 tm->tm_yday = val - 1;
924 /* Match number of month. */
925 get_number (1, 12, 2);
926 tm->tm_mon = val - 1;
932 get_number (0, 59, 2);
937 /* Match any white space. */
938 while (ISSPACE (*rp))
942 /* Match locale's equivalent of AM/PM. */
946 if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
948 if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
952 if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
954 if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
962 if (!match_string (HERE_AM_STR, rp))
963 if (match_string (HERE_PM_STR, rp))
972 if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
981 if (*decided == not &&
982 strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
990 if (!recursive (HERE_T_FMT_AMPM))
994 if (!recursive ("%H:%M"))
999 /* The number of seconds may be very high so we cannot use
1000 the `get_number' macro. Instead read the number
1001 character for character and construct the result while
1004 if (*rp < '0' || *rp > '9')
1005 /* We need at least one digit. */
1011 secs += *rp++ - '0';
1013 while (*rp >= '0' && *rp <= '9');
1015 if (localtime_r (&secs, tm) == NULL)
1016 /* Error in function. */
1021 get_number (0, 61, 2);
1026 if (*decided != raw)
1028 if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
1030 if (*decided == loc)
1037 if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
1046 if (!recursive (HERE_T_FMT))
1050 get_number (1, 7, 1);
1051 tm->tm_wday = val % 7;
1055 get_number (0, 99, 2);
1056 /* XXX This cannot determine any field in TM. */
1059 if (*rp < '0' || *rp > '9')
1061 /* XXX Ignore the number since we would need some more
1062 information to compute a real date. */
1065 while (*rp >= '0' && *rp <= '9');
1070 get_number (0, 53, 2);
1071 /* XXX This cannot determine any field in TM without some
1075 /* Match number of weekday. */
1076 get_number (0, 6, 1);
1081 /* Match year within century. */
1082 get_number (0, 99, 2);
1083 /* The "Year 2000: The Millennium Rollover" paper suggests that
1084 values in the range 69-99 refer to the twentieth century. */
1085 tm->tm_year = val >= 69 ? val : val + 100;
1086 /* Indicate that we want to use the century, if specified. */
1091 /* Match year including century number. */
1092 get_number (0, 9999, 4);
1093 tm->tm_year = val - 1900;
1098 /* XXX How to handle this? */
1105 /* Match locale's alternate date and time format. */
1106 if (*decided != raw)
1108 const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
1111 fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
1113 if (!recursive (fmt))
1115 if (*decided == loc)
1122 if (strcmp (fmt, HERE_D_T_FMT))
1129 /* The C locale has no era information, so use the
1130 normal representation. */
1131 if (!recursive (HERE_D_T_FMT))
1138 /* Match name of base year in locale's alternate
1140 /* XXX This is currently not implemented. It should
1141 use the value _NL_CURRENT (LC_TIME, ERA). */
1144 if (*decided != raw)
1146 const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
1149 fmt = _NL_CURRENT (LC_TIME, D_FMT);
1151 if (!recursive (fmt))
1153 if (*decided == loc)
1160 if (strcmp (fmt, HERE_D_FMT))
1166 if (!recursive (HERE_D_FMT))
1170 if (*decided != raw)
1172 const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
1175 fmt = _NL_CURRENT (LC_TIME, T_FMT);
1177 if (!recursive (fmt))
1179 if (*decided == loc)
1186 if (strcmp (fmt, HERE_T_FMT))
1192 if (!recursive (HERE_T_FMT))
1200 /* We have no information about the era format. Just use
1201 the normal format. */
1202 if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
1203 && *fmt != 'x' && *fmt != 'X')
1204 /* This is an illegal format. */
1214 /* Match day of month using alternate numeric symbols. */
1215 get_alt_number (1, 31, 2);
1221 /* Match hour in 24-hour clock using alternate numeric
1223 get_alt_number (0, 23, 2);
1228 /* Match hour in 12-hour clock using alternate numeric
1230 get_alt_number (1, 12, 2);
1231 tm->tm_hour = val - 1;
1235 /* Match month using alternate numeric symbols. */
1236 get_alt_number (1, 12, 2);
1237 tm->tm_mon = val - 1;
1242 /* Match minutes using alternate numeric symbols. */
1243 get_alt_number (0, 59, 2);
1247 /* Match seconds using alternate numeric symbols. */
1248 get_alt_number (0, 61, 2);
1254 get_alt_number (0, 53, 2);
1255 /* XXX This cannot determine any field in TM without
1256 further information. */
1259 /* Match number of weekday using alternate numeric symbols. */
1260 get_alt_number (0, 6, 1);
1265 /* Match year within century using alternate numeric symbols. */
1266 get_alt_number (0, 99, 2);
1267 tm->tm_year = val >= 69 ? val : val + 100;
1279 if (have_I && is_pm)
1285 tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
1287 /* Only the century, but not the year. Strange, but so be it. */
1288 tm->tm_year = (century - 19) * 100;
1291 if (want_xday && !have_wday) {
1292 if ( !(have_mon && have_mday) && have_yday) {
1293 /* we don't have tm_mon and/or tm_mday, compute them */
1295 while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday)
1298 tm->tm_mon = t_mon - 1;
1300 tm->tm_mday = tm->tm_yday - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1;
1302 day_of_the_week (tm);
1304 if (want_xday && !have_yday)
1305 day_of_the_year (tm);
1312 strptime (buf, format, tm)
1317 enum locale_status decided;
1323 return strptime_internal (buf, format, tm, &decided);
1325 #endif /* not HAVE_STRPTIME */
1327 #ifdef NEED_MON_YDAY
1328 /* __mon_yday[][] is common to mktime and strptime implementations.
1330 const unsigned short int __mon_yday[2][13] =
1333 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
1335 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
1339 /* fnmatch is required by POSIX, but we include an implementation for
1340 the sake of systems that don't have it, most notably Windows. Some
1341 systems do have fnmatch, but Apache's installation process installs
1342 its own fnmatch.h (incompatible with the system one!) in a system
1343 include directory, effectively rendering fnmatch unusable. This
1344 has been fixed with Apache 2, where fnmatch has been moved to apr
1345 and given a prefix, but many systems out there are still (as of
1346 this writing in 2005) broken and we must cater to them.
1348 Additionally, according to anecdotal evidence and conventional
1349 wisdom I lack courage to challenge, many implementations of fnmatch
1350 are notoriously buggy and unreliable. So we use our version by
1351 default, except when compiling under systems where fnmatch is known
1352 to work (currently on GNU libc-based systems and Solaris.) */
1354 #ifndef SYSTEM_FNMATCH
1356 #define __FNM_FLAGS (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD)
1358 /* Match STRING against the filename pattern PATTERN, returning zero
1359 if it matches, FNM_NOMATCH if not. This implementation comes from
1360 an earlier version of GNU Bash. (It doesn't make sense to update
1361 it with a newer version because those versions add a lot of
1362 features Wget doesn't use or care about.) */
1365 fnmatch (const char *pattern, const char *string, int flags)
1367 register const char *p = pattern, *n = string;
1370 if ((flags & ~__FNM_FLAGS) != 0)
1376 while ((c = *p++) != '\0')
1382 return (FNM_NOMATCH);
1383 else if ((flags & FNM_PATHNAME) && *n == '/')
1384 return (FNM_NOMATCH);
1385 else if ((flags & FNM_PERIOD) && *n == '.' &&
1386 (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
1387 return (FNM_NOMATCH);
1391 if (!(flags & FNM_NOESCAPE))
1394 return (FNM_NOMATCH);
1398 if ((flags & FNM_PERIOD) && *n == '.' &&
1399 (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
1400 return (FNM_NOMATCH);
1402 for (c = *p++; c == '?' || c == '*'; c = *p++, ++n)
1403 if (((flags & FNM_PATHNAME) && *n == '/') ||
1404 (c == '?' && *n == '\0'))
1405 return (FNM_NOMATCH);
1411 char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
1412 for (--p; *n != '\0'; ++n)
1413 if ((c == '[' || *n == c1) &&
1414 fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
1416 return (FNM_NOMATCH);
1421 /* Nonzero if the sense of the character class is
1426 return (FNM_NOMATCH);
1428 if ((flags & FNM_PERIOD) && *n == '.' &&
1429 (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
1430 return (FNM_NOMATCH);
1432 /* Make sure there is a closing `]'. If there isn't,
1433 the `[' is just a character to be matched. */
1435 register const char *np;
1437 for (np = p; np && *np && *np != ']'; np++);
1442 return (FNM_NOMATCH);
1447 not = (*p == '!' || *p == '^');
1454 register char cstart = c, cend = c;
1456 if (!(flags & FNM_NOESCAPE) && c == '\\')
1457 cstart = cend = *p++;
1460 /* [ (unterminated) loses. */
1461 return (FNM_NOMATCH);
1465 if ((flags & FNM_PATHNAME) && c == '/')
1466 /* [/] can never match. */
1467 return (FNM_NOMATCH);
1469 if (c == '-' && *p != ']')
1472 if (!(flags & FNM_NOESCAPE) && cend == '\\')
1475 return (FNM_NOMATCH);
1479 if (*n >= cstart && *n <= cend)
1486 return (FNM_NOMATCH);
1492 /* Skip the rest of the [...] that already matched. */
1496 /* [... (unterminated) loses. */
1497 return (FNM_NOMATCH);
1500 if (!(flags & FNM_NOESCAPE) && c == '\\')
1501 /* 1003.2d11 is unclear if this is right. %%% */
1505 return (FNM_NOMATCH);
1511 return (FNM_NOMATCH);
1520 return (FNM_NOMATCH);
1523 #endif /* not SYSTEM_FNMATCH */