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