]> sjero.net Git - wget/blob - src/utils.c
f6f736183ab5e363ed4ce89338cd18b699fe2063
[wget] / src / utils.c
1 /* Various functions of utilitarian nature.
2    Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001
3    Free Software Foundation, Inc.
4
5 This file is part of GNU Wget.
6
7 GNU Wget is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GNU Wget is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Wget; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 #include <config.h>
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #ifdef HAVE_STRING_H
26 # include <string.h>
27 #else  /* not HAVE_STRING_H */
28 # include <strings.h>
29 #endif /* not HAVE_STRING_H */
30 #include <sys/types.h>
31 #ifdef HAVE_UNISTD_H
32 # include <unistd.h>
33 #endif
34 #ifdef HAVE_MMAP
35 # include <sys/mman.h>
36 #endif
37 #ifdef HAVE_PWD_H
38 # include <pwd.h>
39 #endif
40 #include <limits.h>
41 #ifdef HAVE_UTIME_H
42 # include <utime.h>
43 #endif
44 #ifdef HAVE_SYS_UTIME_H
45 # include <sys/utime.h>
46 #endif
47 #include <errno.h>
48 #ifdef NeXT
49 # include <libc.h>              /* for access() */
50 #endif
51 #include <fcntl.h>
52 #include <assert.h>
53
54 /* For TIOCGWINSZ and friends: */
55 #ifdef HAVE_SYS_IOCTL_H
56 # include <sys/ioctl.h>
57 #endif
58 #ifdef HAVE_TERMIOS_H
59 # include <termios.h>
60 #endif
61
62 #include "wget.h"
63 #include "utils.h"
64 #include "fnmatch.h"
65 #include "hash.h"
66
67 #ifndef errno
68 extern int errno;
69 #endif
70
71 /* This section implements several wrappers around the basic
72    allocation routines.  This is done for two reasons: first, so that
73    the callers of these functions need not consistently check for
74    errors.  If there is not enough virtual memory for running Wget,
75    something is seriously wrong, and Wget exits with an appropriate
76    error message.
77
78    The second reason why these are useful is that, if DEBUG_MALLOC is
79    defined, they also provide a handy (if crude) malloc debugging
80    interface that checks memory leaks.  */
81
82 /* Croak the fatal memory error and bail out with non-zero exit
83    status.  */
84 static void
85 memfatal (const char *what)
86 {
87   /* Make sure we don't try to store part of the log line, and thus
88      call malloc.  */
89   log_set_save_context (0);
90   logprintf (LOG_ALWAYS, _("%s: %s: Not enough memory.\n"), exec_name, what);
91   exit (1);
92 }
93
94 /* These functions end with _real because they need to be
95    distinguished from the debugging functions, and from the macros.
96    Explanation follows:
97
98    If memory debugging is not turned on, wget.h defines these:
99
100      #define xmalloc xmalloc_real
101      #define xrealloc xrealloc_real
102      #define xstrdup xstrdup_real
103      #define xfree free
104
105    In case of memory debugging, the definitions are a bit more
106    complex, because we want to provide more information, *and* we want
107    to call the debugging code.  (The former is the reason why xmalloc
108    and friends need to be macros in the first place.)  Then it looks
109    like this:
110
111      #define xmalloc(a) xmalloc_debug (a, __FILE__, __LINE__)
112      #define xfree(a)   xfree_debug (a, __FILE__, __LINE__)
113      #define xrealloc(a, b) xrealloc_debug (a, b, __FILE__, __LINE__)
114      #define xstrdup(a) xstrdup_debug (a, __FILE__, __LINE__)
115
116    Each of the *_debug function does its magic and calls the real one.  */
117
118 #ifdef DEBUG_MALLOC
119 # define STATIC_IF_DEBUG static
120 #else
121 # define STATIC_IF_DEBUG
122 #endif
123
124 STATIC_IF_DEBUG void *
125 xmalloc_real (size_t size)
126 {
127   void *ptr = malloc (size);
128   if (!ptr)
129     memfatal ("malloc");
130   return ptr;
131 }
132
133 STATIC_IF_DEBUG void *
134 xrealloc_real (void *ptr, size_t newsize)
135 {
136   void *newptr;
137
138   /* Not all Un*xes have the feature of realloc() that calling it with
139      a NULL-pointer is the same as malloc(), but it is easy to
140      simulate.  */
141   if (ptr)
142     newptr = realloc (ptr, newsize);
143   else
144     newptr = malloc (newsize);
145   if (!newptr)
146     memfatal ("realloc");
147   return newptr;
148 }
149
150 STATIC_IF_DEBUG char *
151 xstrdup_real (const char *s)
152 {
153   char *copy;
154
155 #ifndef HAVE_STRDUP
156   int l = strlen (s);
157   copy = malloc (l + 1);
158   if (!copy)
159     memfatal ("strdup");
160   memcpy (copy, s, l + 1);
161 #else  /* HAVE_STRDUP */
162   copy = strdup (s);
163   if (!copy)
164     memfatal ("strdup");
165 #endif /* HAVE_STRDUP */
166
167   return copy;
168 }
169
170 #ifdef DEBUG_MALLOC
171
172 /* Crude home-grown routines for debugging some malloc-related
173    problems.  Featured:
174
175    * Counting the number of malloc and free invocations, and reporting
176      the "balance", i.e. how many times more malloc was called than it
177      was the case with free.
178
179    * Making malloc store its entry into a simple array and free remove
180      stuff from that array.  At the end, print the pointers which have
181      not been freed, along with the source file and the line number.
182      This also has the side-effect of detecting freeing memory that
183      was never allocated.
184
185    Note that this kind of memory leak checking strongly depends on
186    every malloc() being followed by a free(), even if the program is
187    about to finish.  Wget is careful to free the data structure it
188    allocated in init.c.  */
189
190 static int malloc_count, free_count;
191
192 static struct {
193   char *ptr;
194   const char *file;
195   int line;
196 } malloc_debug[100000];
197
198 /* Both register_ptr and unregister_ptr take O(n) operations to run,
199    which can be a real problem.  It would be nice to use a hash table
200    for malloc_debug, but the functions in hash.c are not suitable
201    because they can call malloc() themselves.  Maybe it would work if
202    the hash table were preallocated to a huge size, and if we set the
203    rehash threshold to 1.0.  */
204
205 /* Register PTR in malloc_debug.  Abort if this is not possible
206    (presumably due to the number of current allocations exceeding the
207    size of malloc_debug.)  */
208
209 static void
210 register_ptr (void *ptr, const char *file, int line)
211 {
212   int i;
213   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
214     if (malloc_debug[i].ptr == NULL)
215       {
216         malloc_debug[i].ptr = ptr;
217         malloc_debug[i].file = file;
218         malloc_debug[i].line = line;
219         return;
220       }
221   abort ();
222 }
223
224 /* Unregister PTR from malloc_debug.  Abort if PTR is not present in
225    malloc_debug.  (This catches calling free() with a bogus pointer.)  */
226
227 static void
228 unregister_ptr (void *ptr)
229 {
230   int i;
231   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
232     if (malloc_debug[i].ptr == ptr)
233       {
234         malloc_debug[i].ptr = NULL;
235         return;
236       }
237   abort ();
238 }
239
240 /* Print the malloc debug stats that can be gathered from the above
241    information.  Currently this is the count of mallocs, frees, the
242    difference between the two, and the dump of the contents of
243    malloc_debug.  The last part are the memory leaks.  */
244
245 void
246 print_malloc_debug_stats (void)
247 {
248   int i;
249   printf ("\nMalloc:  %d\nFree:    %d\nBalance: %d\n\n",
250           malloc_count, free_count, malloc_count - free_count);
251   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
252     if (malloc_debug[i].ptr != NULL)
253       printf ("0x%08ld: %s:%d\n", (long)malloc_debug[i].ptr,
254               malloc_debug[i].file, malloc_debug[i].line);
255 }
256
257 void *
258 xmalloc_debug (size_t size, const char *source_file, int source_line)
259 {
260   void *ptr = xmalloc_real (size);
261   ++malloc_count;
262   register_ptr (ptr, source_file, source_line);
263   return ptr;
264 }
265
266 void
267 xfree_debug (void *ptr, const char *source_file, int source_line)
268 {
269   assert (ptr != NULL);
270   ++free_count;
271   unregister_ptr (ptr);
272   free (ptr);
273 }
274
275 void *
276 xrealloc_debug (void *ptr, size_t newsize, const char *source_file, int source_line)
277 {
278   void *newptr = xrealloc_real (ptr, newsize);
279   if (!ptr)
280     {
281       ++malloc_count;
282       register_ptr (newptr, source_file, source_line);
283     }
284   else if (newptr != ptr)
285     {
286       unregister_ptr (ptr);
287       register_ptr (newptr, source_file, source_line);
288     }
289   return newptr;
290 }
291
292 char *
293 xstrdup_debug (const char *s, const char *source_file, int source_line)
294 {
295   char *copy = xstrdup_real (s);
296   ++malloc_count;
297   register_ptr (copy, source_file, source_line);
298   return copy;
299 }
300
301 #endif /* DEBUG_MALLOC */
302 \f
303 /* Utility function: like xstrdup(), but also lowercases S.  */
304
305 char *
306 xstrdup_lower (const char *s)
307 {
308   char *copy = xstrdup (s);
309   char *p = copy;
310   for (; *p; p++)
311     *p = TOLOWER (*p);
312   return copy;
313 }
314
315 /* Return a count of how many times CHR occurs in STRING. */
316
317 int
318 count_char (const char *string, char chr)
319 {
320   const char *p;
321   int count = 0;
322   for (p = string; *p; p++)
323     if (*p == chr)
324       ++count;
325   return count;
326 }
327
328 /* Copy the string formed by two pointers (one on the beginning, other
329    on the char after the last char) to a new, malloc-ed location.
330    0-terminate it.  */
331 char *
332 strdupdelim (const char *beg, const char *end)
333 {
334   char *res = (char *)xmalloc (end - beg + 1);
335   memcpy (res, beg, end - beg);
336   res[end - beg] = '\0';
337   return res;
338 }
339
340 /* Parse a string containing comma-separated elements, and return a
341    vector of char pointers with the elements.  Spaces following the
342    commas are ignored.  */
343 char **
344 sepstring (const char *s)
345 {
346   char **res;
347   const char *p;
348   int i = 0;
349
350   if (!s || !*s)
351     return NULL;
352   res = NULL;
353   p = s;
354   while (*s)
355     {
356       if (*s == ',')
357         {
358           res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
359           res[i] = strdupdelim (p, s);
360           res[++i] = NULL;
361           ++s;
362           /* Skip the blanks following the ','.  */
363           while (ISSPACE (*s))
364             ++s;
365           p = s;
366         }
367       else
368         ++s;
369     }
370   res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
371   res[i] = strdupdelim (p, s);
372   res[i + 1] = NULL;
373   return res;
374 }
375 \f
376 /* Return pointer to a static char[] buffer in which zero-terminated
377    string-representation of TM (in form hh:mm:ss) is printed.
378
379    If TM is non-NULL, the current time-in-seconds will be stored
380    there.
381
382    (#### This is misleading: one would expect TM would be used instead
383    of the current time in that case.  This design was probably
384    influenced by the design time(2), and should be changed at some
385    points.  No callers use non-NULL TM anyway.)  */
386
387 char *
388 time_str (time_t *tm)
389 {
390   static char output[15];
391   struct tm *ptm;
392   time_t secs = time (tm);
393
394   if (secs == -1)
395     {
396       /* In case of error, return the empty string.  Maybe we should
397          just abort if this happens?  */
398       *output = '\0';
399       return output;
400     }
401   ptm = localtime (&secs);
402   sprintf (output, "%02d:%02d:%02d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
403   return output;
404 }
405
406 /* Like the above, but include the date: YYYY-MM-DD hh:mm:ss.  */
407
408 char *
409 datetime_str (time_t *tm)
410 {
411   static char output[20];       /* "YYYY-MM-DD hh:mm:ss" + \0 */
412   struct tm *ptm;
413   time_t secs = time (tm);
414
415   if (secs == -1)
416     {
417       /* In case of error, return the empty string.  Maybe we should
418          just abort if this happens?  */
419       *output = '\0';
420       return output;
421     }
422   ptm = localtime (&secs);
423   sprintf (output, "%04d-%02d-%02d %02d:%02d:%02d",
424            ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,
425            ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
426   return output;
427 }
428 \f
429 /* The Windows versions of the following two functions are defined in
430    mswindows.c.  */
431
432 #ifndef WINDOWS
433 void
434 fork_to_background (void)
435 {
436   pid_t pid;
437   /* Whether we arrange our own version of opt.lfilename here.  */
438   int changedp = 0;
439
440   if (!opt.lfilename)
441     {
442       opt.lfilename = unique_name (DEFAULT_LOGFILE);
443       changedp = 1;
444     }
445   pid = fork ();
446   if (pid < 0)
447     {
448       /* parent, error */
449       perror ("fork");
450       exit (1);
451     }
452   else if (pid != 0)
453     {
454       /* parent, no error */
455       printf (_("Continuing in background, pid %d.\n"), (int)pid);
456       if (changedp)
457         printf (_("Output will be written to `%s'.\n"), opt.lfilename);
458       exit (0);                 /* #### should we use _exit()? */
459     }
460
461   /* child: give up the privileges and keep running. */
462   setsid ();
463   freopen ("/dev/null", "r", stdin);
464   freopen ("/dev/null", "w", stdout);
465   freopen ("/dev/null", "w", stderr);
466 }
467 #endif /* not WINDOWS */
468 \f
469 /* "Touch" FILE, i.e. make its atime and mtime equal to the time
470    specified with TM.  */
471 void
472 touch (const char *file, time_t tm)
473 {
474 #ifdef HAVE_STRUCT_UTIMBUF
475   struct utimbuf times;
476   times.actime = times.modtime = tm;
477 #else
478   time_t times[2];
479   times[0] = times[1] = tm;
480 #endif
481
482   if (utime (file, &times) == -1)
483     logprintf (LOG_NOTQUIET, "utime(%s): %s\n", file, strerror (errno));
484 }
485
486 /* Checks if FILE is a symbolic link, and removes it if it is.  Does
487    nothing under MS-Windows.  */
488 int
489 remove_link (const char *file)
490 {
491   int err = 0;
492   struct stat st;
493
494   if (lstat (file, &st) == 0 && S_ISLNK (st.st_mode))
495     {
496       DEBUGP (("Unlinking %s (symlink).\n", file));
497       err = unlink (file);
498       if (err != 0)
499         logprintf (LOG_VERBOSE, _("Failed to unlink symlink `%s': %s\n"),
500                    file, strerror (errno));
501     }
502   return err;
503 }
504
505 /* Does FILENAME exist?  This is quite a lousy implementation, since
506    it supplies no error codes -- only a yes-or-no answer.  Thus it
507    will return that a file does not exist if, e.g., the directory is
508    unreadable.  I don't mind it too much currently, though.  The
509    proper way should, of course, be to have a third, error state,
510    other than true/false, but that would introduce uncalled-for
511    additional complexity to the callers.  */
512 int
513 file_exists_p (const char *filename)
514 {
515 #ifdef HAVE_ACCESS
516   return access (filename, F_OK) >= 0;
517 #else
518   struct stat buf;
519   return stat (filename, &buf) >= 0;
520 #endif
521 }
522
523 /* Returns 0 if PATH is a directory, 1 otherwise (any kind of file).
524    Returns 0 on error.  */
525 int
526 file_non_directory_p (const char *path)
527 {
528   struct stat buf;
529   /* Use lstat() rather than stat() so that symbolic links pointing to
530      directories can be identified correctly.  */
531   if (lstat (path, &buf) != 0)
532     return 0;
533   return S_ISDIR (buf.st_mode) ? 0 : 1;
534 }
535
536 /* Return a unique filename, given a prefix and count */
537 static char *
538 unique_name_1 (const char *fileprefix, int count)
539 {
540   char *filename;
541
542   if (count)
543     {
544       filename = (char *)xmalloc (strlen (fileprefix) + numdigit (count) + 2);
545       sprintf (filename, "%s.%d", fileprefix, count);
546     }
547   else
548     filename = xstrdup (fileprefix);
549
550   if (!file_exists_p (filename))
551     return filename;
552   else
553     {
554       xfree (filename);
555       return NULL;
556     }
557 }
558
559 /* Return a unique file name, based on PREFIX.  */
560 char *
561 unique_name (const char *prefix)
562 {
563   char *file = NULL;
564   int count = 0;
565
566   while (!file)
567     file = unique_name_1 (prefix, count++);
568   return file;
569 }
570 \f
571 /* Create DIRECTORY.  If some of the pathname components of DIRECTORY
572    are missing, create them first.  In case any mkdir() call fails,
573    return its error status.  Returns 0 on successful completion.
574
575    The behaviour of this function should be identical to the behaviour
576    of `mkdir -p' on systems where mkdir supports the `-p' option.  */
577 int
578 make_directory (const char *directory)
579 {
580   int quit = 0;
581   int i;
582   char *dir;
583
584   /* Make a copy of dir, to be able to write to it.  Otherwise, the
585      function is unsafe if called with a read-only char *argument.  */
586   STRDUP_ALLOCA (dir, directory);
587
588   /* If the first character of dir is '/', skip it (and thus enable
589      creation of absolute-pathname directories.  */
590   for (i = (*dir == '/'); 1; ++i)
591     {
592       for (; dir[i] && dir[i] != '/'; i++)
593         ;
594       if (!dir[i])
595         quit = 1;
596       dir[i] = '\0';
597       /* Check whether the directory already exists.  */
598       if (!file_exists_p (dir))
599         {
600           if (mkdir (dir, 0777) < 0)
601             return -1;
602         }
603       if (quit)
604         break;
605       else
606         dir[i] = '/';
607     }
608   return 0;
609 }
610
611 /* Merge BASE with FILE.  BASE can be a directory or a file name, FILE
612    should be a file name.
613
614    file_merge("/foo/bar", "baz")  => "/foo/baz"
615    file_merge("/foo/bar/", "baz") => "/foo/bar/baz"
616    file_merge("foo", "bar")       => "bar"
617
618    In other words, it's a simpler and gentler version of uri_merge_1.  */
619
620 char *
621 file_merge (const char *base, const char *file)
622 {
623   char *result;
624   const char *cut = (const char *)strrchr (base, '/');
625
626   if (!cut)
627     return xstrdup (file);
628
629   result = (char *)xmalloc (cut - base + 1 + strlen (file) + 1);
630   memcpy (result, base, cut - base);
631   result[cut - base] = '/';
632   strcpy (result + (cut - base) + 1, file);
633
634   return result;
635 }
636 \f
637 static int in_acclist PARAMS ((const char *const *, const char *, int));
638
639 /* Determine whether a file is acceptable to be followed, according to
640    lists of patterns to accept/reject.  */
641 int
642 acceptable (const char *s)
643 {
644   int l = strlen (s);
645
646   while (l && s[l] != '/')
647     --l;
648   if (s[l] == '/')
649     s += (l + 1);
650   if (opt.accepts)
651     {
652       if (opt.rejects)
653         return (in_acclist ((const char *const *)opt.accepts, s, 1)
654                 && !in_acclist ((const char *const *)opt.rejects, s, 1));
655       else
656         return in_acclist ((const char *const *)opt.accepts, s, 1);
657     }
658   else if (opt.rejects)
659     return !in_acclist ((const char *const *)opt.rejects, s, 1);
660   return 1;
661 }
662
663 /* Compare S1 and S2 frontally; S2 must begin with S1.  E.g. if S1 is
664    `/something', frontcmp() will return 1 only if S2 begins with
665    `/something'.  Otherwise, 0 is returned.  */
666 int
667 frontcmp (const char *s1, const char *s2)
668 {
669   for (; *s1 && *s2 && (*s1 == *s2); ++s1, ++s2);
670   return !*s1;
671 }
672
673 /* Iterate through STRLIST, and return the first element that matches
674    S, through wildcards or front comparison (as appropriate).  */
675 static char *
676 proclist (char **strlist, const char *s, enum accd flags)
677 {
678   char **x;
679
680   for (x = strlist; *x; x++)
681     if (has_wildcards_p (*x))
682       {
683         if (fnmatch (*x, s, FNM_PATHNAME) == 0)
684           break;
685       }
686     else
687       {
688         char *p = *x + ((flags & ALLABS) && (**x == '/')); /* Remove '/' */
689         if (frontcmp (p, s))
690           break;
691       }
692   return *x;
693 }
694
695 /* Returns whether DIRECTORY is acceptable for download, wrt the
696    include/exclude lists.
697
698    If FLAGS is ALLABS, the leading `/' is ignored in paths; relative
699    and absolute paths may be freely intermixed.  */
700 int
701 accdir (const char *directory, enum accd flags)
702 {
703   /* Remove starting '/'.  */
704   if (flags & ALLABS && *directory == '/')
705     ++directory;
706   if (opt.includes)
707     {
708       if (!proclist (opt.includes, directory, flags))
709         return 0;
710     }
711   if (opt.excludes)
712     {
713       if (proclist (opt.excludes, directory, flags))
714         return 0;
715     }
716   return 1;
717 }
718
719 /* Match the end of STRING against PATTERN.  For instance:
720
721    match_backwards ("abc", "bc") -> 1
722    match_backwards ("abc", "ab") -> 0
723    match_backwards ("abc", "abc") -> 1 */
724 int
725 match_tail (const char *string, const char *pattern)
726 {
727   int i, j;
728
729   for (i = strlen (string), j = strlen (pattern); i >= 0 && j >= 0; i--, j--)
730     if (string[i] != pattern[j])
731       break;
732   /* If the pattern was exhausted, the match was succesful.  */
733   if (j == -1)
734     return 1;
735   else
736     return 0;
737 }
738
739 /* Checks whether string S matches each element of ACCEPTS.  A list
740    element are matched either with fnmatch() or match_tail(),
741    according to whether the element contains wildcards or not.
742
743    If the BACKWARD is 0, don't do backward comparison -- just compare
744    them normally.  */
745 static int
746 in_acclist (const char *const *accepts, const char *s, int backward)
747 {
748   for (; *accepts; accepts++)
749     {
750       if (has_wildcards_p (*accepts))
751         {
752           /* fnmatch returns 0 if the pattern *does* match the
753              string.  */
754           if (fnmatch (*accepts, s, 0) == 0)
755             return 1;
756         }
757       else
758         {
759           if (backward)
760             {
761               if (match_tail (s, *accepts))
762                 return 1;
763             }
764           else
765             {
766               if (!strcmp (s, *accepts))
767                 return 1;
768             }
769         }
770     }
771   return 0;
772 }
773
774 /* Return the location of STR's suffix (file extension).  Examples:
775    suffix ("foo.bar")       -> "bar"
776    suffix ("foo.bar.baz")   -> "baz"
777    suffix ("/foo/bar")      -> NULL
778    suffix ("/foo.bar/baz")  -> NULL  */
779 char *
780 suffix (const char *str)
781 {
782   int i;
783
784   for (i = strlen (str); i && str[i] != '/' && str[i] != '.'; i--)
785     ;
786
787   if (str[i++] == '.')
788     return (char *)str + i;
789   else
790     return NULL;
791 }
792
793 /* Read a line from FP and return the pointer to freshly allocated
794    storage.  The stoarage space is obtained through malloc() and
795    should be freed with free() when it is no longer needed.
796
797    The length of the line is not limited, except by available memory.
798    The newline character at the end of line is retained.  The line is
799    terminated with a zero character.
800
801    After end-of-file is encountered without anything being read, NULL
802    is returned.  NULL is also returned on error.  To distinguish
803    between these two cases, use the stdio function ferror().  */
804
805 char *
806 read_whole_line (FILE *fp)
807 {
808   int length = 0;
809   int bufsize = 82;
810   char *line = (char *)xmalloc (bufsize);
811
812   while (fgets (line + length, bufsize - length, fp))
813     {
814       length += strlen (line + length);
815       if (length == 0)
816         /* Possible for example when reading from a binary file where
817            a line begins with \0.  */
818         continue;
819
820       if (line[length - 1] == '\n')
821         break;
822
823       /* fgets() guarantees to read the whole line, or to use up the
824          space we've given it.  We can double the buffer
825          unconditionally.  */
826       bufsize <<= 1;
827       line = xrealloc (line, bufsize);
828     }
829   if (length == 0 || ferror (fp))
830     {
831       xfree (line);
832       return NULL;
833     }
834   if (length + 1 < bufsize)
835     /* Relieve the memory from our exponential greediness.  We say
836        `length + 1' because the terminating \0 is not included in
837        LENGTH.  We don't need to zero-terminate the string ourselves,
838        though, because fgets() does that.  */
839     line = xrealloc (line, length + 1);
840   return line;
841 }
842 \f
843 /* Read FILE into memory.  A pointer to `struct file_memory' are
844    returned; use struct element `content' to access file contents, and
845    the element `length' to know the file length.  `content' is *not*
846    zero-terminated, and you should *not* read or write beyond the [0,
847    length) range of characters.
848
849    After you are done with the file contents, call read_file_free to
850    release the memory.
851
852    Depending on the operating system and the type of file that is
853    being read, read_file() either mmap's the file into memory, or
854    reads the file into the core using read().
855
856    If file is named "-", fileno(stdin) is used for reading instead.
857    If you want to read from a real file named "-", use "./-" instead.  */
858
859 struct file_memory *
860 read_file (const char *file)
861 {
862   int fd;
863   struct file_memory *fm;
864   long size;
865   int inhibit_close = 0;
866
867   /* Some magic in the finest tradition of Perl and its kin: if FILE
868      is "-", just use stdin.  */
869   if (HYPHENP (file))
870     {
871       fd = fileno (stdin);
872       inhibit_close = 1;
873       /* Note that we don't inhibit mmap() in this case.  If stdin is
874          redirected from a regular file, mmap() will still work.  */
875     }
876   else
877     fd = open (file, O_RDONLY);
878   if (fd < 0)
879     return NULL;
880   fm = xmalloc (sizeof (struct file_memory));
881
882 #ifdef HAVE_MMAP
883   {
884     struct stat buf;
885     if (fstat (fd, &buf) < 0)
886       goto mmap_lose;
887     fm->length = buf.st_size;
888     /* NOTE: As far as I know, the callers of this function never
889        modify the file text.  Relying on this would enable us to
890        specify PROT_READ and MAP_SHARED for a marginal gain in
891        efficiency, but at some cost to generality.  */
892     fm->content = mmap (NULL, fm->length, PROT_READ | PROT_WRITE,
893                         MAP_PRIVATE, fd, 0);
894     if (fm->content == (char *)MAP_FAILED)
895       goto mmap_lose;
896     if (!inhibit_close)
897       close (fd);
898
899     fm->mmap_p = 1;
900     return fm;
901   }
902
903  mmap_lose:
904   /* The most common reason why mmap() fails is that FD does not point
905      to a plain file.  However, it's also possible that mmap() doesn't
906      work for a particular type of file.  Therefore, whenever mmap()
907      fails, we just fall back to the regular method.  */
908 #endif /* HAVE_MMAP */
909
910   fm->length = 0;
911   size = 512;                   /* number of bytes fm->contents can
912                                    hold at any given time. */
913   fm->content = xmalloc (size);
914   while (1)
915     {
916       long nread;
917       if (fm->length > size / 2)
918         {
919           /* #### I'm not sure whether the whole exponential-growth
920              thing makes sense with kernel read.  On Linux at least,
921              read() refuses to read more than 4K from a file at a
922              single chunk anyway.  But other Unixes might optimize it
923              better, and it doesn't *hurt* anything, so I'm leaving
924              it.  */
925
926           /* Normally, we grow SIZE exponentially to make the number
927              of calls to read() and realloc() logarithmic in relation
928              to file size.  However, read() can read an amount of data
929              smaller than requested, and it would be unreasonably to
930              double SIZE every time *something* was read.  Therefore,
931              we double SIZE only when the length exceeds half of the
932              entire allocated size.  */
933           size <<= 1;
934           fm->content = xrealloc (fm->content, size);
935         }
936       nread = read (fd, fm->content + fm->length, size - fm->length);
937       if (nread > 0)
938         /* Successful read. */
939         fm->length += nread;
940       else if (nread < 0)
941         /* Error. */
942         goto lose;
943       else
944         /* EOF */
945         break;
946     }
947   if (!inhibit_close)
948     close (fd);
949   if (size > fm->length && fm->length != 0)
950     /* Due to exponential growth of fm->content, the allocated region
951        might be much larger than what is actually needed.  */
952     fm->content = xrealloc (fm->content, fm->length);
953   fm->mmap_p = 0;
954   return fm;
955
956  lose:
957   if (!inhibit_close)
958     close (fd);
959   xfree (fm->content);
960   xfree (fm);
961   return NULL;
962 }
963
964 /* Release the resources held by FM.  Specifically, this calls
965    munmap() or xfree() on fm->content, depending whether mmap or
966    malloc/read were used to read in the file.  It also frees the
967    memory needed to hold the FM structure itself.  */
968
969 void
970 read_file_free (struct file_memory *fm)
971 {
972 #ifdef HAVE_MMAP
973   if (fm->mmap_p)
974     {
975       munmap (fm->content, fm->length);
976     }
977   else
978 #endif
979     {
980       xfree (fm->content);
981     }
982   xfree (fm);
983 }
984 \f
985 /* Free the pointers in a NULL-terminated vector of pointers, then
986    free the pointer itself.  */
987 void
988 free_vec (char **vec)
989 {
990   if (vec)
991     {
992       char **p = vec;
993       while (*p)
994         xfree (*p++);
995       xfree (vec);
996     }
997 }
998
999 /* Append vector V2 to vector V1.  The function frees V2 and
1000    reallocates V1 (thus you may not use the contents of neither
1001    pointer after the call).  If V1 is NULL, V2 is returned.  */
1002 char **
1003 merge_vecs (char **v1, char **v2)
1004 {
1005   int i, j;
1006
1007   if (!v1)
1008     return v2;
1009   if (!v2)
1010     return v1;
1011   if (!*v2)
1012     {
1013       /* To avoid j == 0 */
1014       xfree (v2);
1015       return v1;
1016     }
1017   /* Count v1.  */
1018   for (i = 0; v1[i]; i++);
1019   /* Count v2.  */
1020   for (j = 0; v2[j]; j++);
1021   /* Reallocate v1.  */
1022   v1 = (char **)xrealloc (v1, (i + j + 1) * sizeof (char **));
1023   memcpy (v1 + i, v2, (j + 1) * sizeof (char *));
1024   xfree (v2);
1025   return v1;
1026 }
1027
1028 /* A set of simple-minded routines to store strings in a linked list.
1029    This used to also be used for searching, but now we have hash
1030    tables for that.  */
1031
1032 /* It's a shame that these simple things like linked lists and hash
1033    tables (see hash.c) need to be implemented over and over again.  It
1034    would be nice to be able to use the routines from glib -- see
1035    www.gtk.org for details.  However, that would make Wget depend on
1036    glib, and I want to avoid dependencies to external libraries for
1037    reasons of convenience and portability (I suspect Wget is more
1038    portable than anything ever written for Gnome).  */
1039
1040 /* Append an element to the list.  If the list has a huge number of
1041    elements, this can get slow because it has to find the list's
1042    ending.  If you think you have to call slist_append in a loop,
1043    think about calling slist_prepend() followed by slist_nreverse().  */
1044
1045 slist *
1046 slist_append (slist *l, const char *s)
1047 {
1048   slist *newel = (slist *)xmalloc (sizeof (slist));
1049   slist *beg = l;
1050
1051   newel->string = xstrdup (s);
1052   newel->next = NULL;
1053
1054   if (!l)
1055     return newel;
1056   /* Find the last element.  */
1057   while (l->next)
1058     l = l->next;
1059   l->next = newel;
1060   return beg;
1061 }
1062
1063 /* Prepend S to the list.  Unlike slist_append(), this is O(1).  */
1064
1065 slist *
1066 slist_prepend (slist *l, const char *s)
1067 {
1068   slist *newel = (slist *)xmalloc (sizeof (slist));
1069   newel->string = xstrdup (s);
1070   newel->next = l;
1071   return newel;
1072 }
1073
1074 /* Destructively reverse L. */
1075
1076 slist *
1077 slist_nreverse (slist *l)
1078 {
1079   slist *prev = NULL;
1080   while (l)
1081     {
1082       slist *next = l->next;
1083       l->next = prev;
1084       prev = l;
1085       l = next;
1086     }
1087   return prev;
1088 }
1089
1090 /* Is there a specific entry in the list?  */
1091 int
1092 slist_contains (slist *l, const char *s)
1093 {
1094   for (; l; l = l->next)
1095     if (!strcmp (l->string, s))
1096       return 1;
1097   return 0;
1098 }
1099
1100 /* Free the whole slist.  */
1101 void
1102 slist_free (slist *l)
1103 {
1104   while (l)
1105     {
1106       slist *n = l->next;
1107       xfree (l->string);
1108       xfree (l);
1109       l = n;
1110     }
1111 }
1112 \f
1113 /* Sometimes it's useful to create "sets" of strings, i.e. special
1114    hash tables where you want to store strings as keys and merely
1115    query for their existence.  Here is a set of utility routines that
1116    makes that transparent.  */
1117
1118 void
1119 string_set_add (struct hash_table *ht, const char *s)
1120 {
1121   /* First check whether the set element already exists.  If it does,
1122      do nothing so that we don't have to free() the old element and
1123      then strdup() a new one.  */
1124   if (hash_table_contains (ht, s))
1125     return;
1126
1127   /* We use "1" as value.  It provides us a useful and clear arbitrary
1128      value, and it consumes no memory -- the pointers to the same
1129      string "1" will be shared by all the key-value pairs in all `set'
1130      hash tables.  */
1131   hash_table_put (ht, xstrdup (s), "1");
1132 }
1133
1134 /* Synonym for hash_table_contains... */
1135
1136 int
1137 string_set_contains (struct hash_table *ht, const char *s)
1138 {
1139   return hash_table_contains (ht, s);
1140 }
1141
1142 static int
1143 string_set_free_mapper (void *key, void *value_ignored, void *arg_ignored)
1144 {
1145   xfree (key);
1146   return 0;
1147 }
1148
1149 void
1150 string_set_free (struct hash_table *ht)
1151 {
1152   hash_table_map (ht, string_set_free_mapper, NULL);
1153   hash_table_destroy (ht);
1154 }
1155
1156 static int
1157 free_keys_and_values_mapper (void *key, void *value, void *arg_ignored)
1158 {
1159   xfree (key);
1160   xfree (value);
1161   return 0;
1162 }
1163
1164 /* Another utility function: call free() on all keys and values of HT.  */
1165
1166 void
1167 free_keys_and_values (struct hash_table *ht)
1168 {
1169   hash_table_map (ht, free_keys_and_values_mapper, NULL);
1170 }
1171
1172 \f
1173 /* Engine for legible and legible_very_long; this function works on
1174    strings.  */
1175
1176 static char *
1177 legible_1 (const char *repr)
1178 {
1179   static char outbuf[128];
1180   int i, i1, mod;
1181   char *outptr;
1182   const char *inptr;
1183
1184   /* Reset the pointers.  */
1185   outptr = outbuf;
1186   inptr = repr;
1187   /* If the number is negative, shift the pointers.  */
1188   if (*inptr == '-')
1189     {
1190       *outptr++ = '-';
1191       ++inptr;
1192     }
1193   /* How many digits before the first separator?  */
1194   mod = strlen (inptr) % 3;
1195   /* Insert them.  */
1196   for (i = 0; i < mod; i++)
1197     *outptr++ = inptr[i];
1198   /* Now insert the rest of them, putting separator before every
1199      third digit.  */
1200   for (i1 = i, i = 0; inptr[i1]; i++, i1++)
1201     {
1202       if (i % 3 == 0 && i1 != 0)
1203         *outptr++ = ',';
1204       *outptr++ = inptr[i1];
1205     }
1206   /* Zero-terminate the string.  */
1207   *outptr = '\0';
1208   return outbuf;
1209 }
1210
1211 /* Legible -- return a static pointer to the legibly printed long.  */
1212 char *
1213 legible (long l)
1214 {
1215   char inbuf[24];
1216   /* Print the number into the buffer.  */
1217   number_to_string (inbuf, l);
1218   return legible_1 (inbuf);
1219 }
1220
1221 /* Write a string representation of NUMBER into the provided buffer.
1222    We cannot use sprintf() because we cannot be sure whether the
1223    platform supports printing of what we chose for VERY_LONG_TYPE.
1224
1225    Example: Gcc supports `long long' under many platforms, but on many
1226    of those the native libc knows nothing of it and therefore cannot
1227    print it.
1228
1229    How long BUFFER needs to be depends on the platform and the content
1230    of NUMBER.  For 64-bit VERY_LONG_TYPE (the most common case), 24
1231    bytes are sufficient.  Using more might be a good idea.
1232
1233    This function does not go through the hoops that long_to_string
1234    goes to because it doesn't aspire to be fast.  (It's called perhaps
1235    once in a Wget run.)  */
1236
1237 static void
1238 very_long_to_string (char *buffer, VERY_LONG_TYPE number)
1239 {
1240   int i = 0;
1241   int j;
1242
1243   /* Print the number backwards... */
1244   do
1245     {
1246       buffer[i++] = '0' + number % 10;
1247       number /= 10;
1248     }
1249   while (number);
1250
1251   /* ...and reverse the order of the digits. */
1252   for (j = 0; j < i / 2; j++)
1253     {
1254       char c = buffer[j];
1255       buffer[j] = buffer[i - 1 - j];
1256       buffer[i - 1 - j] = c;
1257     }
1258   buffer[i] = '\0';
1259 }
1260
1261 /* The same as legible(), but works on VERY_LONG_TYPE.  See sysdep.h.  */
1262 char *
1263 legible_very_long (VERY_LONG_TYPE l)
1264 {
1265   char inbuf[128];
1266   /* Print the number into the buffer.  */
1267   very_long_to_string (inbuf, l);
1268   return legible_1 (inbuf);
1269 }
1270
1271 /* Count the digits in a (long) integer.  */
1272 int
1273 numdigit (long number)
1274 {
1275   int cnt = 1;
1276   if (number < 0)
1277     {
1278       number = -number;
1279       ++cnt;
1280     }
1281   while ((number /= 10) > 0)
1282     ++cnt;
1283   return cnt;
1284 }
1285
1286 #define ONE_DIGIT(figure) *p++ = n / (figure) + '0'
1287 #define ONE_DIGIT_ADVANCE(figure) (ONE_DIGIT (figure), n %= (figure))
1288
1289 #define DIGITS_1(figure) ONE_DIGIT (figure)
1290 #define DIGITS_2(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_1 ((figure) / 10)
1291 #define DIGITS_3(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_2 ((figure) / 10)
1292 #define DIGITS_4(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_3 ((figure) / 10)
1293 #define DIGITS_5(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_4 ((figure) / 10)
1294 #define DIGITS_6(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_5 ((figure) / 10)
1295 #define DIGITS_7(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_6 ((figure) / 10)
1296 #define DIGITS_8(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_7 ((figure) / 10)
1297 #define DIGITS_9(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_8 ((figure) / 10)
1298 #define DIGITS_10(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_9 ((figure) / 10)
1299
1300 /* DIGITS_<11-20> are only used on machines with 64-bit longs. */
1301
1302 #define DIGITS_11(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_10 ((figure) / 10)
1303 #define DIGITS_12(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_11 ((figure) / 10)
1304 #define DIGITS_13(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_12 ((figure) / 10)
1305 #define DIGITS_14(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_13 ((figure) / 10)
1306 #define DIGITS_15(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_14 ((figure) / 10)
1307 #define DIGITS_16(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_15 ((figure) / 10)
1308 #define DIGITS_17(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_16 ((figure) / 10)
1309 #define DIGITS_18(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_17 ((figure) / 10)
1310 #define DIGITS_19(figure) ONE_DIGIT_ADVANCE (figure); DIGITS_18 ((figure) / 10)
1311
1312 /* Print NUMBER to BUFFER in base 10.  This should be completely
1313    equivalent to `sprintf(buffer, "%ld", number)', only much faster.
1314
1315    The speedup may make a difference in programs that frequently
1316    convert numbers to strings.  Some implementations of sprintf,
1317    particularly the one in GNU libc, have been known to be extremely
1318    slow compared to this function.
1319
1320    Return the pointer to the location where the terminating zero was
1321    printed.  (Equivalent to calling buffer+strlen(buffer) after the
1322    function is done.)
1323
1324    BUFFER should be big enough to accept as many bytes as you expect
1325    the number to take up.  On machines with 64-bit longs the maximum
1326    needed size is 24 bytes.  That includes the digits needed for the
1327    largest 64-bit number, the `-' sign in case it's negative, and the
1328    terminating '\0'.  */
1329
1330 char *
1331 number_to_string (char *buffer, long number)
1332 {
1333   char *p = buffer;
1334   long n = number;
1335
1336 #if (SIZEOF_LONG != 4) && (SIZEOF_LONG != 8)
1337   /* We are running in a strange or misconfigured environment.  Let
1338      sprintf cope with it.  */
1339   sprintf (buffer, "%ld", n);
1340   p += strlen (buffer);
1341 #else  /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1342
1343   if (n < 0)
1344     {
1345       *p++ = '-';
1346       n = -n;
1347     }
1348
1349   if      (n < 10)                   { DIGITS_1 (1); }
1350   else if (n < 100)                  { DIGITS_2 (10); }
1351   else if (n < 1000)                 { DIGITS_3 (100); }
1352   else if (n < 10000)                { DIGITS_4 (1000); }
1353   else if (n < 100000)               { DIGITS_5 (10000); }
1354   else if (n < 1000000)              { DIGITS_6 (100000); }
1355   else if (n < 10000000)             { DIGITS_7 (1000000); }
1356   else if (n < 100000000)            { DIGITS_8 (10000000); }
1357   else if (n < 1000000000)           { DIGITS_9 (100000000); }
1358 #if SIZEOF_LONG == 4
1359   /* ``if (1)'' serves only to preserve editor indentation. */
1360   else if (1)                        { DIGITS_10 (1000000000); }
1361 #else  /* SIZEOF_LONG != 4 */
1362   else if (n < 10000000000L)         { DIGITS_10 (1000000000L); }
1363   else if (n < 100000000000L)        { DIGITS_11 (10000000000L); }
1364   else if (n < 1000000000000L)       { DIGITS_12 (100000000000L); }
1365   else if (n < 10000000000000L)      { DIGITS_13 (1000000000000L); }
1366   else if (n < 100000000000000L)     { DIGITS_14 (10000000000000L); }
1367   else if (n < 1000000000000000L)    { DIGITS_15 (100000000000000L); }
1368   else if (n < 10000000000000000L)   { DIGITS_16 (1000000000000000L); }
1369   else if (n < 100000000000000000L)  { DIGITS_17 (10000000000000000L); }
1370   else if (n < 1000000000000000000L) { DIGITS_18 (100000000000000000L); }
1371   else                               { DIGITS_19 (1000000000000000000L); }
1372 #endif /* SIZEOF_LONG != 4 */
1373
1374   *p = '\0';
1375 #endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1376
1377   return p;
1378 }
1379
1380 #undef ONE_DIGIT
1381 #undef ONE_DIGIT_ADVANCE
1382
1383 #undef DIGITS_1
1384 #undef DIGITS_2
1385 #undef DIGITS_3
1386 #undef DIGITS_4
1387 #undef DIGITS_5
1388 #undef DIGITS_6
1389 #undef DIGITS_7
1390 #undef DIGITS_8
1391 #undef DIGITS_9
1392 #undef DIGITS_10
1393 #undef DIGITS_11
1394 #undef DIGITS_12
1395 #undef DIGITS_13
1396 #undef DIGITS_14
1397 #undef DIGITS_15
1398 #undef DIGITS_16
1399 #undef DIGITS_17
1400 #undef DIGITS_18
1401 #undef DIGITS_19
1402 \f
1403 /* Support for timers. */
1404
1405 #undef TIMER_WINDOWS
1406 #undef TIMER_GETTIMEOFDAY
1407 #undef TIMER_TIME
1408
1409 /* Depending on the OS and availability of gettimeofday(), one and
1410    only one of the above constants will be defined.  Virtually all
1411    modern Unix systems will define TIMER_GETTIMEOFDAY; Windows will
1412    use TIMER_WINDOWS.  TIMER_TIME is a catch-all method for
1413    non-Windows systems without gettimeofday.
1414
1415    #### Perhaps we should also support ftime(), which exists on old
1416    BSD 4.2-influenced systems?  (It also existed under MS DOS Borland
1417    C, if memory serves me.)  */
1418
1419 #ifdef WINDOWS
1420 # define TIMER_WINDOWS
1421 #else  /* not WINDOWS */
1422 # ifdef HAVE_GETTIMEOFDAY
1423 #  define TIMER_GETTIMEOFDAY
1424 # else
1425 #  define TIMER_TIME
1426 # endif
1427 #endif /* not WINDOWS */
1428
1429 struct wget_timer {
1430 #ifdef TIMER_GETTIMEOFDAY
1431   long secs;
1432   long usecs;
1433 #endif
1434
1435 #ifdef TIMER_TIME
1436   time_t secs;
1437 #endif
1438
1439 #ifdef TIMER_WINDOWS
1440   ULARGE_INTEGER wintime;
1441 #endif
1442 };
1443
1444 /* Allocate a timer.  It is not legal to do anything with a freshly
1445    allocated timer, except call wtimer_reset() or wtimer_delete().  */
1446
1447 struct wget_timer *
1448 wtimer_allocate (void)
1449 {
1450   struct wget_timer *wt =
1451     (struct wget_timer *)xmalloc (sizeof (struct wget_timer));
1452   return wt;
1453 }
1454
1455 /* Allocate a new timer and reset it.  Return the new timer. */
1456
1457 struct wget_timer *
1458 wtimer_new (void)
1459 {
1460   struct wget_timer *wt = wtimer_allocate ();
1461   wtimer_reset (wt);
1462   return wt;
1463 }
1464
1465 /* Free the resources associated with the timer.  Its further use is
1466    prohibited.  */
1467
1468 void
1469 wtimer_delete (struct wget_timer *wt)
1470 {
1471   xfree (wt);
1472 }
1473
1474 /* Reset timer WT.  This establishes the starting point from which
1475    wtimer_elapsed() will return the number of elapsed
1476    milliseconds.  It is allowed to reset a previously used timer.  */
1477
1478 void
1479 wtimer_reset (struct wget_timer *wt)
1480 {
1481 #ifdef TIMER_GETTIMEOFDAY
1482   struct timeval t;
1483   gettimeofday (&t, NULL);
1484   wt->secs  = t.tv_sec;
1485   wt->usecs = t.tv_usec;
1486 #endif
1487
1488 #ifdef TIMER_TIME
1489   wt->secs = time (NULL);
1490 #endif
1491
1492 #ifdef TIMER_WINDOWS
1493   FILETIME ft;
1494   SYSTEMTIME st;
1495   GetSystemTime (&st);
1496   SystemTimeToFileTime (&st, &ft);
1497   wt->wintime.HighPart = ft.dwHighDateTime;
1498   wt->wintime.LowPart  = ft.dwLowDateTime;
1499 #endif
1500 }
1501
1502 /* Return the number of milliseconds elapsed since the timer was last
1503    reset.  It is allowed to call this function more than once to get
1504    increasingly higher elapsed values.  */
1505
1506 long
1507 wtimer_elapsed (struct wget_timer *wt)
1508 {
1509 #ifdef TIMER_GETTIMEOFDAY
1510   struct timeval t;
1511   gettimeofday (&t, NULL);
1512   return (t.tv_sec - wt->secs) * 1000 + (t.tv_usec - wt->usecs) / 1000;
1513 #endif
1514
1515 #ifdef TIMER_TIME
1516   time_t now = time (NULL);
1517   return 1000 * (now - wt->secs);
1518 #endif
1519
1520 #ifdef WINDOWS
1521   FILETIME ft;
1522   SYSTEMTIME st;
1523   ULARGE_INTEGER uli;
1524   GetSystemTime (&st);
1525   SystemTimeToFileTime (&st, &ft);
1526   uli.HighPart = ft.dwHighDateTime;
1527   uli.LowPart = ft.dwLowDateTime;
1528   return (long)((uli.QuadPart - wt->wintime.QuadPart) / 10000);
1529 #endif
1530 }
1531
1532 /* Return the assessed granularity of the timer implementation.  This
1533    is important for certain code that tries to deal with "zero" time
1534    intervals.  */
1535
1536 long
1537 wtimer_granularity (void)
1538 {
1539 #ifdef TIMER_GETTIMEOFDAY
1540   /* Granularity of gettimeofday is hugely architecture-dependent.
1541      However, it appears that on modern machines it is better than
1542      1ms.  */
1543   return 1;
1544 #endif
1545
1546 #ifdef TIMER_TIME
1547   /* This is clear. */
1548   return 1000;
1549 #endif
1550
1551 #ifdef TIMER_WINDOWS
1552   /* ? */
1553   return 1;
1554 #endif
1555 }
1556 \f
1557 /* This should probably be at a better place, but it doesn't really
1558    fit into html-parse.c.  */
1559
1560 /* The function returns the pointer to the malloc-ed quoted version of
1561    string s.  It will recognize and quote numeric and special graphic
1562    entities, as per RFC1866:
1563
1564    `&' -> `&amp;'
1565    `<' -> `&lt;'
1566    `>' -> `&gt;'
1567    `"' -> `&quot;'
1568    SP  -> `&#32;'
1569
1570    No other entities are recognized or replaced.  */
1571 char *
1572 html_quote_string (const char *s)
1573 {
1574   const char *b = s;
1575   char *p, *res;
1576   int i;
1577
1578   /* Pass through the string, and count the new size.  */
1579   for (i = 0; *s; s++, i++)
1580     {
1581       if (*s == '&')
1582         i += 4;                 /* `amp;' */
1583       else if (*s == '<' || *s == '>')
1584         i += 3;                 /* `lt;' and `gt;' */
1585       else if (*s == '\"')
1586         i += 5;                 /* `quot;' */
1587       else if (*s == ' ')
1588         i += 4;                 /* #32; */
1589     }
1590   res = (char *)xmalloc (i + 1);
1591   s = b;
1592   for (p = res; *s; s++)
1593     {
1594       switch (*s)
1595         {
1596         case '&':
1597           *p++ = '&';
1598           *p++ = 'a';
1599           *p++ = 'm';
1600           *p++ = 'p';
1601           *p++ = ';';
1602           break;
1603         case '<': case '>':
1604           *p++ = '&';
1605           *p++ = (*s == '<' ? 'l' : 'g');
1606           *p++ = 't';
1607           *p++ = ';';
1608           break;
1609         case '\"':
1610           *p++ = '&';
1611           *p++ = 'q';
1612           *p++ = 'u';
1613           *p++ = 'o';
1614           *p++ = 't';
1615           *p++ = ';';
1616           break;
1617         case ' ':
1618           *p++ = '&';
1619           *p++ = '#';
1620           *p++ = '3';
1621           *p++ = '2';
1622           *p++ = ';';
1623           break;
1624         default:
1625           *p++ = *s;
1626         }
1627     }
1628   *p = '\0';
1629   return res;
1630 }
1631
1632 /* Determine the width of the terminal we're running on.  If that's
1633    not possible, return 0.  */
1634
1635 int
1636 determine_screen_width (void)
1637 {
1638   /* If there's a way to get the terminal size using POSIX
1639      tcgetattr(), somebody please tell me.  */
1640 #ifndef TIOCGWINSZ
1641   return 0;
1642 #else  /* TIOCGWINSZ */
1643   int fd;
1644   struct winsize wsz;
1645
1646   if (opt.lfilename != NULL)
1647     return 0;
1648
1649   fd = fileno (stderr);
1650   if (ioctl (fd, TIOCGWINSZ, &wsz) < 0)
1651     return 0;                   /* most likely ENOTTY */
1652
1653   return wsz.ws_col;
1654 #endif /* TIOCGWINSZ */
1655 }
1656
1657 #if 0
1658 /* A debugging function for checking whether an MD5 library works. */
1659
1660 #include "gen-md5.h"
1661
1662 char *
1663 debug_test_md5 (char *buf)
1664 {
1665   unsigned char raw[16];
1666   static char res[33];
1667   unsigned char *p1;
1668   char *p2;
1669   int cnt;
1670   ALLOCA_MD5_CONTEXT (ctx);
1671
1672   gen_md5_init (ctx);
1673   gen_md5_update ((unsigned char *)buf, strlen (buf), ctx);
1674   gen_md5_finish (ctx, raw);
1675
1676   p1 = raw;
1677   p2 = res;
1678   cnt = 16;
1679   while (cnt--)
1680     {
1681       *p2++ = XDIGIT_TO_xchar (*p1 >> 4);
1682       *p2++ = XDIGIT_TO_xchar (*p1 & 0xf);
1683       ++p1;
1684     }
1685   *p2 = '\0';
1686
1687   return res;
1688 }
1689 #endif