-#endif /* not __GNUC__ */
-
-/* These are from log.c, but they are used everywhere, so we declare
- them here. */
-enum log_options { LOG_VERBOSE, LOG_NOTQUIET, LOG_NONVERBOSE, LOG_ALWAYS };
-
-#ifdef HAVE_STDARG_H
-void logprintf PARAMS ((enum log_options, const char *, ...))
- GCC_FORMAT_ATTR (2, 3);
-void debug_logprintf PARAMS ((const char *, ...)) GCC_FORMAT_ATTR (1, 2);
-#else /* not HAVE_STDARG_H */
-void logprintf ();
-void debug_logprintf ();
-#endif /* not HAVE_STDARG_H */
-void logputs PARAMS ((enum log_options, const char *));
-void logflush PARAMS ((void));
-void log_set_flush PARAMS ((int));
-int log_set_save_context PARAMS ((int));
-
-/* Defined in `utils.c', but used literally everywhere. */
-#ifndef DEBUG_MALLOC
-
-#define xmalloc xmalloc_real
-#define xrealloc xrealloc_real
-#define xstrdup xstrdup_real
-#define xfree free
-
-void *xmalloc_real PARAMS ((size_t));
-void *xrealloc_real PARAMS ((void *, size_t));
-char *xstrdup_real PARAMS ((const char *));
-
-#else /* DEBUG_MALLOC */
-
-#define xmalloc(s) xmalloc_debug (s, __FILE__, __LINE__)
-#define xfree(p) xfree_debug (p, __FILE__, __LINE__)
-#define xrealloc(p, s) xrealloc_debug (p, s, __FILE__, __LINE__)
-#define xstrdup(p) xstrdup_debug (p, __FILE__, __LINE__)
-
-void *xmalloc_debug PARAMS ((size_t, const char *, int));
-void xfree_debug PARAMS ((void *, const char *, int));
-void *xrealloc_debug PARAMS ((void *, size_t, const char *, int));
-char *xstrdup_debug PARAMS ((const char *, const char *, int));
-
-#endif /* DEBUG_MALLOC */
-
-/* #### Find a better place for this. */
-/* The log file to which Wget writes to after HUP. */
-#define DEFAULT_LOGFILE "wget-log"
-
-#define MD5_HASHLEN 16
-\f
-/* Useful macros used across the code: */
+# define LIKELY(exp) (exp)
+# define UNLIKELY(exp) (exp)
+#endif
+
+/* Execute the following statement if debugging is both enabled at
+ compile-time and requested at run-time; a no-op otherwise. */
+
+#ifdef ENABLE_DEBUG
+# define IF_DEBUG if (UNLIKELY (opt.debug))
+#else
+# define IF_DEBUG if (0)
+#endif
+
+/* Print ARGS if debugging is enabled and requested, otherwise do
+ nothing. This must be called with an extra level of parentheses
+ because it's not possible to pass a variable number of arguments to
+ a macro (in portable C89). ARGS are like arguments to printf. */
+
+#define DEBUGP(args) do { IF_DEBUG { debug_logprintf args; } } while (0)
+
+/* Pick an integer type large enough for file sizes, content lengths,
+ and such. Because today's files can be very large, it should be a
+ signed integer at least 64 bits wide. This can't be typedeffed to
+ off_t because: a) off_t is always 32-bit on Windows, and b) we
+ don't necessarily want to tie having a 64-bit type for internal
+ calculations to having LFS support. */
+
+#ifdef WINDOWS
+ /* nothing to do, see mswindows.h */
+#elif SIZEOF_LONG >= 8
+ /* long is large enough, so use it. */
+ typedef long wgint;
+# define SIZEOF_WGINT SIZEOF_LONG
+#elif SIZEOF_LONG_LONG >= 8
+ /* long long is large enough and available, use that */
+ typedef long long wgint;
+# define SIZEOF_WGINT SIZEOF_LONG_LONG
+#elif HAVE_INT64_T
+ typedef int64_t wgint;
+# define SIZEOF_WGINT 8
+#elif SIZEOF_OFF_T >= 8
+ /* In case off_t is typedeffed to a large non-standard type that our
+ tests don't find. */
+ typedef off_t wgint;
+# define SIZEOF_WGINT SIZEOF_OFF_T
+#else
+ /* Fall back to using long, which is always available and in most
+ cases large enough. */
+ typedef long wgint;
+# define SIZEOF_WGINT SIZEOF_LONG
+#endif
+
+/* Pick a strtol-compatible function that will work with wgint. The
+ choices are strtol, strtoll, or our own implementation of strtoll
+ in cmpt.c, activated with NEED_STRTOLL. */
+
+#ifdef WINDOWS
+ /* nothing to do, see mswindows.h */
+#elif SIZEOF_WGINT == SIZEOF_LONG
+# define str_to_wgint strtol
+#elif SIZEOF_WGINT == SIZEOF_LONG_LONG
+# define str_to_wgint strtoll
+# ifndef HAVE_STRTOLL
+# define NEED_STRTOLL
+# define strtoll_type long long
+# endif
+#else
+ /* wgint has a strange size; synthesize strtoll and use it. */
+# define str_to_wgint strtoll
+# define NEED_STRTOLL
+# define strtoll_type wgint
+#endif
+
+#define WGINT_MAX TYPE_MAXIMUM (wgint)
+
+/* Declare our strtoll replacement. */
+#ifdef NEED_STRTOLL
+strtoll_type strtoll (const char *, char **, int);
+#endif
+
+/* Now define a large numeric type useful for storing sizes of *sums*
+ of downloads, such as the value of the --quota option. This should
+ be a type able to hold 2G+ values even on systems without large
+ file support. (It is useful to limit Wget's download quota to say
+ 10G even if a single file cannot be that large.)
+
+ To make sure we get the largest size possible, we use `double' on
+ systems without a 64-bit integral type. (Since it is used in very
+ few places in Wget, this is acceptable.) */
+
+#if SIZEOF_WGINT >= 8
+/* just use wgint */
+typedef wgint SUM_SIZE_INT;
+#else
+/* On systems without LFS, use double, which buys us integers up to 2^53. */
+typedef double SUM_SIZE_INT;
+#endif