1 /* Replacements for routines missing on some systems.
2 Copyright (C) 1995, 1996, 1997 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. */
28 #endif /* HAVE_STRING_H */
30 #include <sys/types.h>
39 /* A strerror() clone, for systems that don't have it. */
43 /* This loses on a system without `sys_errlist'. */
44 extern char *sys_errlist[];
45 return sys_errlist[err];
47 #endif /* not HAVE_STRERROR */
49 /* Some systems don't have some str* functions in libc. Here we
50 define them. The same goes for strptime. */
52 #ifndef HAVE_STRCASECMP
54 /* Compare S1 and S2, ignoring case, returning less than, equal to or
55 greater than zero if S1 is lexiographically less than,
56 equal to or greater than S2. */
58 strcasecmp (const char *s1, const char *s2)
60 register const unsigned char *p1 = (const unsigned char *) s1;
61 register const unsigned char *p2 = (const unsigned char *) s2;
78 #endif /* not HAVE_STRCASECMP */
80 #ifndef HAVE_STRNCASECMP
82 /* Compare no more than N characters of S1 and S2,
83 ignoring case, returning less than, equal to or
84 greater than zero if S1 is lexicographically less
85 than, equal to or greater than S2. */
87 strncasecmp (const char *s1, const char *s2, size_t n)
89 register const unsigned char *p1 = (const unsigned char *) s1;
90 register const unsigned char *p2 = (const unsigned char *) s2;
93 if (p1 == p2 || n == 0)
100 if (c1 == '\0' || c1 != c2)
106 #endif /* not HAVE_STRNCASECMP */
109 /* From GNU libc 2.0.6. */
110 /* Return the first ocurrence of NEEDLE in HAYSTACK. */
112 * My personal strstr() implementation that beats most other algorithms.
113 * Until someone tells me otherwise, I assume that this is the
114 * fastest implementation of strstr() in C.
115 * I deliberately chose not to comment it. You should have at least
116 * as much fun trying to understand it, as I had to write it :-).
118 * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
119 typedef unsigned chartype;
122 strstr (phaystack, pneedle)
123 const char *phaystack;
126 register const unsigned char *haystack, *needle;
127 register chartype b, c;
129 haystack = (const unsigned char *) phaystack;
130 needle = (const unsigned char *) pneedle;
135 haystack--; /* possible ANSI violation */
153 register const unsigned char *rhaystack, *rneedle;
168 jin: a = *++haystack;
175 rhaystack = haystack-- + 1;
193 while (*rhaystack == a);
195 needle = rneedle; /* took the register-poor approach */
202 return (char*) haystack;
206 #endif /* not HAVE_STRSTR */
209 /* Find the first ocurrence in S of any character in ACCEPT. */
211 strpbrk (const char *s, const char *accept)
215 const char *a = accept;
224 #endif /* HAVE_STRPBRK */
227 /* From GNU libc 2.0. */
229 /* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
230 This file is part of the GNU C Library.
231 Contributed by Paul Eggert (eggert@twinsun.com). */
234 # define HAVE_LIMITS_H 1
235 # define HAVE_LOCALTIME_R 1
236 # define STDC_HEADERS 1
239 /* Assume that leap seconds are possible, unless told otherwise.
240 If the host has a `zic' command with a `-L leapsecondfilename' option,
241 then it supports leap seconds; otherwise it probably doesn't. */
242 #ifndef LEAP_SECONDS_POSSIBLE
243 # define LEAP_SECONDS_POSSIBLE 1
247 # define __P(args) PARAMS (args)
248 #endif /* Not __P. */
255 # define INT_MIN (~0 << (sizeof (int) * CHAR_BIT - 1))
258 # define INT_MAX (~0 - INT_MIN)
262 /* The outer cast to time_t works around a bug in Cray C 5.0.3.0. */
263 # define TIME_T_MIN ((time_t) \
264 (0 < (time_t) -1 ? (time_t) 0 \
265 : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1)))
268 # define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
271 #define TM_YEAR_BASE 1900
272 #define EPOCH_YEAR 1970
275 /* Nonzero if YEAR is a leap year (every 4 years,
276 except every 100th isn't, and every 400th is). */
277 # define __isleap(year) \
278 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
281 /* How many days come before each month (0-12). */
282 const unsigned short int __mon_yday[2][13] =
285 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
287 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
290 static time_t ydhms_tm_diff __P ((int, int, int, int, int, const struct tm *));
291 time_t __mktime_internal __P ((struct tm *,
292 struct tm *(*) (const time_t *, struct tm *),
297 # define localtime_r __localtime_r
299 # if ! HAVE_LOCALTIME_R && ! defined localtime_r
300 /* Approximate localtime_r as best we can in its absence. */
301 # define localtime_r my_mktime_localtime_r
302 static struct tm *localtime_r __P ((const time_t *, struct tm *));
308 struct tm *l = localtime (t);
314 # endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
318 /* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP),
319 measured in seconds, ignoring leap seconds.
320 YEAR uses the same numbering as TM->tm_year.
321 All values are in range, except possibly YEAR.
322 If overflow occurs, yield the low order bits of the correct answer. */
324 ydhms_tm_diff (year, yday, hour, min, sec, tp)
325 int year, yday, hour, min, sec;
328 /* Compute intervening leap days correctly even if year is negative.
329 Take care to avoid int overflow. time_t overflow is OK, since
330 only the low order bits of the correct time_t answer are needed.
331 Don't convert to time_t until after all divisions are done, since
332 time_t might be unsigned. */
333 int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - ! (year & 3);
334 int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (tp->tm_year & 3);
335 int a100 = a4 / 25 - (a4 % 25 < 0);
336 int b100 = b4 / 25 - (b4 % 25 < 0);
337 int a400 = a100 >> 2;
338 int b400 = b100 >> 2;
339 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
340 time_t years = year - (time_t) tp->tm_year;
341 time_t days = (365 * years + intervening_leap_days
342 + (yday - tp->tm_yday));
343 return (60 * (60 * (24 * days + (hour - tp->tm_hour))
344 + (min - tp->tm_min))
345 + (sec - tp->tm_sec));
349 static time_t localtime_offset;
351 /* Convert *TP to a time_t value. */
357 /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
358 time zone names contained in the external variable `tzname' shall
359 be set as if the tzset() function had been called. */
363 return __mktime_internal (tp, localtime_r, &localtime_offset);
366 /* Convert *TP to a time_t value, inverting
367 the monotonic and mostly-unit-linear conversion function CONVERT.
368 Use *OFFSET to keep track of a guess at the offset of the result,
369 compared to what the result would be for UTC without leap seconds.
370 If *OFFSET's guess is correct, only one CONVERT call is needed. */
372 __mktime_internal (tp, convert, offset)
374 struct tm *(*convert) __P ((const time_t *, struct tm *));
380 /* The maximum number of probes (calls to CONVERT) should be enough
381 to handle any combinations of time zone rule changes, solar time,
382 and leap seconds. Posix.1 prohibits leap seconds, but some hosts
384 int remaining_probes = 4;
386 /* Time requested. Copy it in case CONVERT modifies *TP; this can
387 occur if TP is localtime's returned value and CONVERT is localtime. */
388 int sec = tp->tm_sec;
389 int min = tp->tm_min;
390 int hour = tp->tm_hour;
391 int mday = tp->tm_mday;
392 int mon = tp->tm_mon;
393 int year_requested = tp->tm_year;
394 int isdst = tp->tm_isdst;
396 /* Ensure that mon is in range, and set year accordingly. */
397 int mon_remainder = mon % 12;
398 int negative_mon_remainder = mon_remainder < 0;
399 int mon_years = mon / 12 - negative_mon_remainder;
400 int year = year_requested + mon_years;
402 /* The other values need not be in range:
403 the remaining code handles minor overflows correctly,
404 assuming int and time_t arithmetic wraps around.
405 Major overflows are caught at the end. */
407 /* Calculate day of year from year, month, and day of month.
408 The result need not be in range. */
409 int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)]
410 [mon_remainder + 12 * negative_mon_remainder])
413 int sec_requested = sec;
414 #if LEAP_SECONDS_POSSIBLE
415 /* Handle out-of-range seconds specially,
416 since ydhms_tm_diff assumes every minute has 60 seconds. */
423 /* Invert CONVERT by probing. First assume the same offset as last time.
424 Then repeatedly use the error to improve the guess. */
426 tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
427 tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
428 t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
430 for (t = t0 + *offset;
431 (dt = ydhms_tm_diff (year, yday, hour, min, sec, (*convert) (&t, &tm)));
433 if (--remaining_probes == 0)
436 /* Check whether tm.tm_isdst has the requested value, if any. */
437 if (0 <= isdst && 0 <= tm.tm_isdst)
439 int dst_diff = (isdst != 0) - (tm.tm_isdst != 0);
442 /* Move two hours in the direction indicated by the disagreement,
443 probe some more, and switch to a new time if found.
444 The largest known fallback due to daylight savings is two hours:
445 once, in Newfoundland, 1988-10-30 02:00 -> 00:00. */
446 time_t ot = t - 2 * 60 * 60 * dst_diff;
447 while (--remaining_probes != 0)
450 if (! (dt = ydhms_tm_diff (year, yday, hour, min, sec,
451 (*convert) (&ot, &otm))))
458 break; /* Avoid a redundant probe. */
465 #if LEAP_SECONDS_POSSIBLE
466 if (sec_requested != tm.tm_sec)
468 /* Adjust time to reflect the tm_sec requested, not the normalized value.
469 Also, repair any damage from a false match due to a leap second. */
470 t += sec_requested - sec + (sec == 0 && tm.tm_sec == 60);
471 (*convert) (&t, &tm);
475 if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
477 /* time_t isn't large enough to rule out overflows in ydhms_tm_diff,
478 so check for major overflows. A gross check suffices,
479 since if t has overflowed, it is off by a multiple of
480 TIME_T_MAX - TIME_T_MIN + 1. So ignore any component of
481 the difference that is bounded by a small value. */
483 double dyear = (double) year_requested + mon_years - tm.tm_year;
484 double dday = 366 * dyear + mday;
485 double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
487 if (TIME_T_MAX / 3 - TIME_T_MIN / 3 < (dsec < 0 ? - dsec : dsec))
496 weak_alias (mktime, timelocal)
498 #endif /* not HAVE_MKTIME */
501 #ifndef HAVE_STRPTIME
502 /* From GNU libc 2.0.6. */
503 /* Ulrich, thanks for helping me out with this! --hniksic */
505 /* strptime - Convert a string representation of time to a time value.
506 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
507 This file is part of the GNU C Library.
508 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. */
510 /* XXX This version of the implementation is not really complete.
511 Some of the fields cannot add information alone. But if seeing
512 some of them in the same format (such as year, week and weekday)
513 this is enough information for determining the date. */
516 # define __P(args) PARAMS (args)
519 #if ! HAVE_LOCALTIME_R && ! defined (localtime_r)
521 #define localtime_r __localtime_r
523 /* Approximate localtime_r as best we can in its absence. */
524 #define localtime_r my_localtime_r
525 static struct tm *localtime_r __P ((const time_t *, struct tm *));
531 struct tm *l = localtime (t);
538 #endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
541 #define match_char(ch1, ch2) if (ch1 != ch2) return NULL
542 #if defined __GNUC__ && __GNUC__ >= 2
543 # define match_string(cs1, s2) \
544 ({ size_t len = strlen (cs1); \
545 int result = strncasecmp ((cs1), (s2), len) == 0; \
546 if (result) (s2) += len; \
549 /* Oh come on. Get a reasonable compiler. */
550 # define match_string(cs1, s2) \
551 (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))
553 /* We intentionally do not use isdigit() for testing because this will
554 lead to problems with the wide character version. */
555 #define get_number(from, to) \
558 if (*rp < '0' || *rp > '9') \
562 val += *rp++ - '0'; \
563 } while (val * 10 <= to && *rp >= '0' && *rp <= '9'); \
564 if (val < from || val > to) \
568 # define get_alt_number(from, to) \
570 if (*decided != raw) \
572 const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \
574 while (*alts != '\0') \
576 size_t len = strlen (alts); \
577 if (strncasecmp (alts, rp, len) == 0) \
579 alts = strchr (alts, '\0') + 1; \
584 if (*decided == loc && val != 0) \
593 get_number (from, to); \
596 # define get_alt_number(from, to) \
597 /* We don't have the alternate representation. */ \
600 #define recursive(new_fmt) \
601 (*(new_fmt) != '\0' \
602 && (rp = strptime_internal (rp, (new_fmt), tm, decided)) != NULL)
606 /* This is defined in locale/C-time.c in the GNU libc. */
607 extern const struct locale_data _nl_C_LC_TIME;
609 # define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)
610 # define ab_weekday_name \
611 (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)
612 # define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)
613 # define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
614 # define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
615 # define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
616 # define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
617 # define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)
618 # define HERE_T_FMT_AMPM \
619 (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)
620 # define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)
622 static char const weekday_name[][10] =
624 "Sunday", "Monday", "Tuesday", "Wednesday",
625 "Thursday", "Friday", "Saturday"
627 static char const ab_weekday_name[][4] =
629 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
631 static char const month_name[][10] =
633 "January", "February", "March", "April", "May", "June",
634 "July", "August", "September", "October", "November", "December"
636 static char const ab_month_name[][4] =
638 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
639 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
641 # define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"
642 # define HERE_D_FMT "%m/%d/%y"
643 # define HERE_AM_STR "AM"
644 # define HERE_PM_STR "PM"
645 # define HERE_T_FMT_AMPM "%I:%M:%S %p"
646 # define HERE_T_FMT "%H:%M:%S"
649 /* Status of lookup: do we use the locale data or the raw data? */
650 enum locale_status { not, loc, raw };
653 strptime_internal __P ((const char *buf, const char *format, struct tm *tm,
654 enum locale_status *decided));
657 strptime_internal (buf, format, tm, decided)
661 enum locale_status *decided;
675 /* A white space in the format string matches 0 more or white
676 space in the input string. */
679 while (ISSPACE (*rp))
685 /* Any character but `%' must be matched by the same character
686 in the iput string. */
689 match_char (*fmt++, *rp++);
695 /* We need this for handling the `E' modifier. */
701 /* Match the `%' character itself. */
702 match_char ('%', *rp++);
706 /* Match day of week. */
707 for (cnt = 0; cnt < 7; ++cnt)
712 if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
715 && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
720 if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
723 && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
724 ab_weekday_name[cnt]))
731 && (match_string (weekday_name[cnt], rp)
732 || match_string (ab_weekday_name[cnt], rp)))
739 /* Does not match a weekday name. */
746 /* Match month name. */
747 for (cnt = 0; cnt < 12; ++cnt)
752 if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
755 && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
760 if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
763 && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
770 if (match_string (month_name[cnt], rp)
771 || match_string (ab_month_name[cnt], rp))
778 /* Does not match a month name. */
783 /* Match locale's date and time format. */
787 if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
794 if (*decided == not &&
795 strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
802 if (!recursive (HERE_D_T_FMT))
806 /* Match century number. */
808 /* We don't need the number. */
812 /* Match day of month. */
820 if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
828 && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
837 /* Match standard day format. */
838 if (!recursive (HERE_D_FMT))
842 /* Match hour in 24-hour clock. */
848 /* Match hour in 12-hour clock. */
850 tm->tm_hour = val % 12;
854 /* Match day number of year. */
856 tm->tm_yday = val - 1;
859 /* Match number of month. */
861 tm->tm_mon = val - 1;
870 /* Match any white space. */
871 while (ISSPACE (*rp))
875 /* Match locale's equivalent of AM/PM. */
879 if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
881 if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
885 if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
887 if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
895 if (!match_string (HERE_AM_STR, rp))
896 if (match_string (HERE_PM_STR, rp))
905 if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
912 if (*decided == not &&
913 strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
921 if (!recursive (HERE_T_FMT_AMPM))
925 if (!recursive ("%H:%M"))
930 /* The number of seconds may be very high so we cannot use
931 the `get_number' macro. Instead read the number
932 character for character and construct the result while
935 if (*rp < '0' || *rp > '9')
936 /* We need at least one digit. */
944 while (*rp >= '0' && *rp <= '9');
946 if (localtime_r (&secs, tm) == NULL)
947 /* Error in function. */
959 if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
966 if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
975 if (!recursive (HERE_T_FMT))
980 tm->tm_wday = val % 7;
984 /* XXX This cannot determine any field in TM. */
987 if (*rp < '0' || *rp > '9')
989 /* XXX Ignore the number since we would need some more
990 information to compute a real date. */
993 while (*rp >= '0' && *rp <= '9');
999 /* XXX This cannot determine any field in TM without some
1003 /* Match number of weekday. */
1008 /* Match year within century. */
1010 tm->tm_year = val >= 50 ? val : val + 100;
1013 /* Match year including century number. */
1014 if (sizeof (time_t) > 4)
1015 get_number (0, 9999);
1017 get_number (0, 2036);
1018 tm->tm_year = val - 1900;
1021 /* XXX How to handle this? */
1028 /* Match locale's alternate date and time format. */
1029 if (*decided != raw)
1031 const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
1034 fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
1036 if (!recursive (fmt))
1038 if (*decided == loc)
1043 if (strcmp (fmt, HERE_D_T_FMT))
1049 /* The C locale has no era information, so use the
1050 normal representation. */
1051 if (!recursive (HERE_D_T_FMT))
1057 /* Match name of base year in locale's alternate
1059 /* XXX This is currently not implemented. It should
1060 use the value _NL_CURRENT (LC_TIME, ERA). */
1063 if (*decided != raw)
1065 const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
1068 fmt = _NL_CURRENT (LC_TIME, D_FMT);
1070 if (!recursive (fmt))
1072 if (*decided == loc)
1077 if (strcmp (fmt, HERE_D_FMT))
1083 if (!recursive (HERE_D_FMT))
1087 if (*decided != raw)
1089 const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
1092 fmt = _NL_CURRENT (LC_TIME, T_FMT);
1094 if (!recursive (fmt))
1096 if (*decided == loc)
1101 if (strcmp (fmt, HERE_T_FMT))
1107 if (!recursive (HERE_T_FMT))
1115 /* We have no information about the era format. Just use
1116 the normal format. */
1117 if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
1118 && *fmt != 'x' && *fmt != 'X')
1119 /* This is an illegal format. */
1129 /* Match day of month using alternate numeric symbols. */
1130 get_alt_number (1, 31);
1134 /* Match hour in 24-hour clock using alternate numeric
1136 get_alt_number (0, 23);
1141 /* Match hour in 12-hour clock using alternate numeric
1143 get_alt_number (1, 12);
1144 tm->tm_hour = val - 1;
1148 /* Match month using alternate numeric symbols. */
1149 get_alt_number (1, 12);
1150 tm->tm_mon = val - 1;
1153 /* Match minutes using alternate numeric symbols. */
1154 get_alt_number (0, 59);
1158 /* Match seconds using alternate numeric symbols. */
1159 get_alt_number (0, 61);
1165 get_alt_number (0, 53);
1166 /* XXX This cannot determine any field in TM without
1167 further information. */
1170 /* Match number of weekday using alternate numeric symbols. */
1171 get_alt_number (0, 6);
1175 /* Match year within century using alternate numeric symbols. */
1176 get_alt_number (0, 99);
1187 if (have_I && is_pm)
1195 strptime (buf, format, tm)
1200 enum locale_status decided;
1206 return strptime_internal (buf, format, tm, &decided);
1208 #endif /* not HAVE_STRPTIME */
1214 /* A simple usleep implementation based on select(). For Unix and
1215 Unix-like systems. */
1218 usleep (unsigned long usec)
1223 select (0, NULL, NULL, NULL, &tm);
1227 #endif /* not WINDOWS */
1228 #endif /* not HAVE_USLEEP */
1231 #ifndef HAVE_MEMMOVE
1233 memmove (char *dest, const char *source, unsigned length)
1237 /* Moving from low mem to hi mem; start at end. */
1238 for (source += length, dest += length; length; --length)
1239 *--dest = *--source;
1240 else if (source != dest)
1242 /* Moving from hi mem to low mem; start at beginning. */
1243 for (; length; --length)
1244 *dest++ = *source++;
1248 #endif /* not HAVE_MEMMOVE */