/* Replacements for routines missing on some systems.
- Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1995-2005 Free Software Foundation, Inc.
This file is part of GNU Wget.
#include <stdio.h>
#include <stdlib.h>
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif /* HAVE_STRING_H */
+#include <string.h>
-#include <sys/types.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
-#include <limits.h>
#include <errno.h>
-#ifndef errno
-extern int errno;
-#endif
#include "wget.h"
-#ifndef HAVE_STRERROR
-/* A strerror() clone, for systems that don't have it. */
-char *
-strerror (int err)
-{
- /* This loses on a system without `sys_errlist'. */
- extern char *sys_errlist[];
- return sys_errlist[err];
-}
-#endif /* not HAVE_STRERROR */
-
/* Some systems don't have some str* functions in libc. Here we
define them. The same goes for strptime. */
}
#endif /* not HAVE_STRNCASECMP */
-#ifndef HAVE_STRSTR
-/* From GNU libc 2.0.6. */
-/* Return the first ocurrence of NEEDLE in HAYSTACK. */
-/*
- * My personal strstr() implementation that beats most other algorithms.
- * Until someone tells me otherwise, I assume that this is the
- * fastest implementation of strstr() in C.
- * I deliberately chose not to comment it. You should have at least
- * as much fun trying to understand it, as I had to write it :-).
- *
- * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
-typedef unsigned chartype;
-
-char *
-strstr (phaystack, pneedle)
- const char *phaystack;
- const char *pneedle;
-{
- register const unsigned char *haystack, *needle;
- register chartype b, c;
-
- haystack = (const unsigned char *) phaystack;
- needle = (const unsigned char *) pneedle;
-
- b = *needle;
- if (b != '\0')
- {
- haystack--; /* possible ANSI violation */
- do
- {
- c = *++haystack;
- if (c == '\0')
- goto ret0;
- }
- while (c != b);
-
- c = *++needle;
- if (c == '\0')
- goto foundneedle;
- ++needle;
- goto jin;
-
- for (;;)
- {
- register chartype a;
- register const unsigned char *rhaystack, *rneedle;
-
- do
- {
- a = *++haystack;
- if (a == '\0')
- goto ret0;
- if (a == b)
- break;
- a = *++haystack;
- if (a == '\0')
- goto ret0;
-shloop: }
- while (a != b);
-
-jin: a = *++haystack;
- if (a == '\0')
- goto ret0;
-
- if (a != c)
- goto shloop;
-
- rhaystack = haystack-- + 1;
- rneedle = needle;
- a = *rneedle;
-
- if (*rhaystack == a)
- do
- {
- if (a == '\0')
- goto foundneedle;
- ++rhaystack;
- a = *++needle;
- if (*rhaystack != a)
- break;
- if (a == '\0')
- goto foundneedle;
- ++rhaystack;
- a = *++needle;
- }
- while (*rhaystack == a);
-
- needle = rneedle; /* took the register-poor approach */
-
- if (a == '\0')
- break;
- }
- }
-foundneedle:
- return (char*) haystack;
-ret0:
- return 0;
-}
-#endif /* not HAVE_STRSTR */
-
#ifndef HAVE_STRPBRK
/* Find the first ocurrence in S of any character in ACCEPT. */
char *
#endif
#ifndef __P
-# define __P(args) PARAMS (args)
+# define __P(args) args
#endif /* Not __P. */
#ifndef CHAR_BIT
this is enough information for determining the date. */
#ifndef __P
-# define __P(args) PARAMS (args)
+# define __P(args) args
#endif /* not __P */
#if ! HAVE_LOCALTIME_R && ! defined localtime_r
};
#endif
-/* Currently unused in Wget. Uncomment if we start using memmove
- again. */
-#if 0
-
-#ifndef HAVE_MEMMOVE
-void *
-memmove (char *dest, const char *source, unsigned length)
-{
- char *d0 = dest;
- if (source < dest)
- /* Moving from low mem to hi mem; start at end. */
- for (source += length, dest += length; length; --length)
- *--dest = *--source;
- else if (source != dest)
- {
- /* Moving from hi mem to low mem; start at beginning. */
- for (; length; --length)
- *dest++ = *source++;
- }
- return (void *) d0;
-}
-#endif /* not HAVE_MEMMOVE */
-
-#endif /* 0 */
+/* fnmatch is defined by POSIX, but we include an implementation for
+ the sake of systems that don't have it. Some systems do have
+ fnmatch, but Apache installs its own fnmatch.h (incompatible with
+ the system one) in a system include directory, effectively
+ rendering fnmatch unusable.
-/* fnmatch is a POSIX function, but we include an implementation for
- the sake of systems that don't have it. Furthermore, according to
- anecdotal evidence, historical implementations of fnmatch are buggy
- and unreliable. So we use our version, except when compiling under
- systems where fnmatch is known to work (currently glibc.) */
+ Additionally according to anecdotal evidence and conventional
+ wisdom I lack courage to challenge, many implementations of fnmatch
+ are notoriously buggy and unreliable. So we use our version by
+ default, except when compiling under systems where fnmatch is known
+ to work (currently on GNU libc-based systems and Solaris.) */
#ifndef SYSTEM_FNMATCH
/* Match STRING against the filename pattern PATTERN, returning zero
if it matches, FNM_NOMATCH if not. This implementation comes from
an earlier version of GNU Bash. (It doesn't make sense to update
- it with a newer version because it adds a lot of features Wget
- doesn't use or care about.) */
+ it with a newer version because those versions add a lot of
+ features Wget doesn't use or care about.) */
int
fnmatch (const char *pattern, const char *string, int flags)