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