]> sjero.net Git - wget/blob - src/utils.c
[svn] Applied Philipp Thomas's safe-ctype patch. Published in
[wget] / src / utils.c
1 /* Various functions of utilitarian nature.
2    Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
3
4 This file is part of Wget.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 #include <config.h>
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #ifdef HAVE_STRING_H
25 # include <string.h>
26 #else  /* not HAVE_STRING_H */
27 # include <strings.h>
28 #endif /* not HAVE_STRING_H */
29 #include <sys/types.h>
30 #ifdef HAVE_UNISTD_H
31 # include <unistd.h>
32 #endif
33 #ifdef HAVE_MMAP
34 # include <sys/mman.h>
35 #endif
36 #ifdef HAVE_PWD_H
37 # include <pwd.h>
38 #endif
39 #include <limits.h>
40 #ifdef HAVE_UTIME_H
41 # include <utime.h>
42 #endif
43 #ifdef HAVE_SYS_UTIME_H
44 # include <sys/utime.h>
45 #endif
46 #include <errno.h>
47 #ifdef NeXT
48 # include <libc.h>              /* for access() */
49 #endif
50 #include <fcntl.h>
51 #include <assert.h>
52
53 #include "wget.h"
54 #include "utils.h"
55 #include "fnmatch.h"
56 #include "hash.h"
57
58 #ifndef errno
59 extern int errno;
60 #endif
61
62 /* This section implements several wrappers around the basic
63    allocation routines.  This is done for two reasons: first, so that
64    the callers of these functions need not consistently check for
65    errors.  If there is not enough virtual memory for running Wget,
66    something is seriously wrong, and Wget exits with an appropriate
67    error message.
68
69    The second reason why these are useful is that, if DEBUG_MALLOC is
70    defined, they also provide a handy (if crude) malloc debugging
71    interface that checks memory leaks.  */
72
73 /* Croak the fatal memory error and bail out with non-zero exit
74    status.  */
75 static void
76 memfatal (const char *what)
77 {
78   /* HACK: expose save_log_p from log.c, so we can turn it off in
79      order to prevent saving the log.  Saving the log is dangerous
80      because logprintf() and logputs() can call malloc(), so this
81      could infloop.  When logging is turned off, infloop can no longer
82      happen.
83
84      #### This is no longer really necessary because the new routines
85      in log.c cons only if the line exceeds eighty characters.  But
86      this can come at the end of a line, so it's OK to be careful.
87
88      On a more serious note, it would be good to have a
89      log_forced_shutdown() routine that exposes this cleanly.  */
90   extern int save_log_p;
91
92   save_log_p = 0;
93   logprintf (LOG_ALWAYS, _("%s: %s: Not enough memory.\n"), exec_name, what);
94   exit (1);
95 }
96
97 /* These functions end with _real because they need to be
98    distinguished from the debugging functions, and from the macros.
99    Explanation follows:
100
101    If memory debugging is not turned on, wget.h defines these:
102
103      #define xmalloc xmalloc_real
104      #define xrealloc xrealloc_real
105      #define xstrdup xstrdup_real
106      #define xfree free
107
108    In case of memory debugging, the definitions are a bit more
109    complex, because we want to provide more information, *and* we want
110    to call the debugging code.  (The former is the reason why xmalloc
111    and friends need to be macros in the first place.)  Then it looks
112    like this:
113
114      #define xmalloc(a) xmalloc_debug (a, __FILE__, __LINE__)
115      #define xfree(a)   xfree_debug (a, __FILE__, __LINE__)
116      #define xrealloc(a, b) xrealloc_debug (a, b, __FILE__, __LINE__)
117      #define xstrdup(a) xstrdup_debug (a, __FILE__, __LINE__)
118
119    Each of the *_debug function does its magic and calls the real one.  */
120
121 #ifdef DEBUG_MALLOC
122 # define STATIC_IF_DEBUG static
123 #else
124 # define STATIC_IF_DEBUG
125 #endif
126
127 STATIC_IF_DEBUG void *
128 xmalloc_real (size_t size)
129 {
130   void *ptr = malloc (size);
131   if (!ptr)
132     memfatal ("malloc");
133   return ptr;
134 }
135
136 STATIC_IF_DEBUG void *
137 xrealloc_real (void *ptr, size_t newsize)
138 {
139   void *newptr;
140
141   /* Not all Un*xes have the feature of realloc() that calling it with
142      a NULL-pointer is the same as malloc(), but it is easy to
143      simulate.  */
144   if (ptr)
145     newptr = realloc (ptr, newsize);
146   else
147     newptr = malloc (newsize);
148   if (!newptr)
149     memfatal ("realloc");
150   return newptr;
151 }
152
153 STATIC_IF_DEBUG char *
154 xstrdup_real (const char *s)
155 {
156   char *copy;
157
158 #ifndef HAVE_STRDUP
159   int l = strlen (s);
160   copy = malloc (l + 1);
161   if (!copy)
162     memfatal ("strdup");
163   memcpy (copy, s, l + 1);
164 #else  /* HAVE_STRDUP */
165   copy = strdup (s);
166   if (!copy)
167     memfatal ("strdup");
168 #endif /* HAVE_STRDUP */
169
170   return copy;
171 }
172
173 #ifdef DEBUG_MALLOC
174
175 /* Crude home-grown routines for debugging some malloc-related
176    problems.  Featured:
177
178    * Counting the number of malloc and free invocations, and reporting
179      the "balance", i.e. how many times more malloc was called than it
180      was the case with free.
181
182    * Making malloc store its entry into a simple array and free remove
183      stuff from that array.  At the end, print the pointers which have
184      not been freed, along with the source file and the line number.
185      This also has the side-effect of detecting freeing memory that
186      was never allocated.
187
188    Note that this kind of memory leak checking strongly depends on
189    every malloc() being followed by a free(), even if the program is
190    about to finish.  Wget is careful to free the data structure it
191    allocated in init.c.  */
192
193 static int malloc_count, free_count;
194
195 static struct {
196   char *ptr;
197   const char *file;
198   int line;
199 } malloc_debug[100000];
200
201 /* Both register_ptr and unregister_ptr take O(n) operations to run,
202    which can be a real problem.  It would be nice to use a hash table
203    for malloc_debug, but the functions in hash.c are not suitable
204    because they can call malloc() themselves.  Maybe it would work if
205    the hash table were preallocated to a huge size, and if we set the
206    rehash threshold to 1.0.  */
207
208 /* Register PTR in malloc_debug.  Abort if this is not possible
209    (presumably due to the number of current allocations exceeding the
210    size of malloc_debug.)  */
211
212 static void
213 register_ptr (void *ptr, const char *file, int line)
214 {
215   int i;
216   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
217     if (malloc_debug[i].ptr == NULL)
218       {
219         malloc_debug[i].ptr = ptr;
220         malloc_debug[i].file = file;
221         malloc_debug[i].line = line;
222         return;
223       }
224   abort ();
225 }
226
227 /* Unregister PTR from malloc_debug.  Abort if PTR is not present in
228    malloc_debug.  (This catches calling free() with a bogus pointer.)  */
229
230 static void
231 unregister_ptr (void *ptr)
232 {
233   int i;
234   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
235     if (malloc_debug[i].ptr == ptr)
236       {
237         malloc_debug[i].ptr = NULL;
238         return;
239       }
240   abort ();
241 }
242
243 /* Print the malloc debug stats that can be gathered from the above
244    information.  Currently this is the count of mallocs, frees, the
245    difference between the two, and the dump of the contents of
246    malloc_debug.  The last part are the memory leaks.  */
247
248 void
249 print_malloc_debug_stats (void)
250 {
251   int i;
252   printf ("\nMalloc:  %d\nFree:    %d\nBalance: %d\n\n",
253           malloc_count, free_count, malloc_count - free_count);
254   for (i = 0; i < ARRAY_SIZE (malloc_debug); i++)
255     if (malloc_debug[i].ptr != NULL)
256       printf ("0x%08ld: %s:%d\n", (long)malloc_debug[i].ptr,
257               malloc_debug[i].file, malloc_debug[i].line);
258 }
259
260 void *
261 xmalloc_debug (size_t size, const char *source_file, int source_line)
262 {
263   void *ptr = xmalloc_real (size);
264   ++malloc_count;
265   register_ptr (ptr, source_file, source_line);
266   return ptr;
267 }
268
269 void
270 xfree_debug (void *ptr, const char *source_file, int source_line)
271 {
272   assert (ptr != NULL);
273   ++free_count;
274   unregister_ptr (ptr);
275   free (ptr);
276 }
277
278 void *
279 xrealloc_debug (void *ptr, size_t newsize, const char *source_file, int source_line)
280 {
281   void *newptr = xrealloc_real (ptr, newsize);
282   if (!ptr)
283     {
284       ++malloc_count;
285       register_ptr (newptr, source_file, source_line);
286     }
287   else if (newptr != ptr)
288     {
289       unregister_ptr (ptr);
290       register_ptr (newptr, source_file, source_line);
291     }
292   return newptr;
293 }
294
295 char *
296 xstrdup_debug (const char *s, const char *source_file, int source_line)
297 {
298   char *copy = xstrdup_real (s);
299   ++malloc_count;
300   register_ptr (copy, source_file, source_line);
301   return copy;
302 }
303
304 #endif /* DEBUG_MALLOC */
305 \f
306 /* Copy the string formed by two pointers (one on the beginning, other
307    on the char after the last char) to a new, malloc-ed location.
308    0-terminate it.  */
309 char *
310 strdupdelim (const char *beg, const char *end)
311 {
312   char *res = (char *)xmalloc (end - beg + 1);
313   memcpy (res, beg, end - beg);
314   res[end - beg] = '\0';
315   return res;
316 }
317
318 /* Parse a string containing comma-separated elements, and return a
319    vector of char pointers with the elements.  Spaces following the
320    commas are ignored.  */
321 char **
322 sepstring (const char *s)
323 {
324   char **res;
325   const char *p;
326   int i = 0;
327
328   if (!s || !*s)
329     return NULL;
330   res = NULL;
331   p = s;
332   while (*s)
333     {
334       if (*s == ',')
335         {
336           res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
337           res[i] = strdupdelim (p, s);
338           res[++i] = NULL;
339           ++s;
340           /* Skip the blanks following the ','.  */
341           while (ISSPACE (*s))
342             ++s;
343           p = s;
344         }
345       else
346         ++s;
347     }
348   res = (char **)xrealloc (res, (i + 2) * sizeof (char *));
349   res[i] = strdupdelim (p, s);
350   res[i + 1] = NULL;
351   return res;
352 }
353 \f
354 /* Return pointer to a static char[] buffer in which zero-terminated
355    string-representation of TM (in form hh:mm:ss) is printed.  It is
356    shamelessly non-reentrant, but it doesn't matter, really.
357
358    If TM is non-NULL, the time_t of the current time will be stored
359    there.  */
360 char *
361 time_str (time_t *tm)
362 {
363   static char tms[15];
364   struct tm *ptm;
365   time_t tim;
366
367   *tms = '\0';
368   tim = time (tm);
369   if (tim == -1)
370     return tms;
371   ptm = localtime (&tim);
372   sprintf (tms, "%02d:%02d:%02d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
373   return tms;
374 }
375
376 /* Returns an error message for ERRNUM.  #### This requires more work.
377    This function, as well as the whole error system, is very
378    ill-conceived.  */
379 const char *
380 uerrmsg (uerr_t errnum)
381 {
382   switch (errnum)
383     {
384     case URLUNKNOWN:
385       return _("Unknown/unsupported protocol");
386       break;
387     case URLBADPORT:
388       return _("Invalid port specification");
389       break;
390     case URLBADHOST:
391       return _("Invalid host name");
392       break;
393     default:
394       abort ();
395       /* $@#@#$ compiler.  */
396       return NULL;
397     }
398 }
399 \f
400 /* The Windows versions of the following two functions are defined in
401    mswindows.c.  */
402
403 /* A cuserid() immitation using getpwuid(), to avoid hassling with
404    utmp.  Besides, not all systems have cuesrid().  Under Windows, it
405    is defined in mswindows.c.
406
407    If WHERE is non-NULL, the username will be stored there.
408    Otherwise, it will be returned as a static buffer (as returned by
409    getpwuid()).  In the latter case, the buffer should be copied
410    before calling getpwuid() or pwd_cuserid() again.  */
411 #ifndef WINDOWS
412 char *
413 pwd_cuserid (char *where)
414 {
415   struct passwd *pwd;
416
417   if (!(pwd = getpwuid (getuid ())) || !pwd->pw_name)
418     return NULL;
419   if (where)
420     {
421       strcpy (where, pwd->pw_name);
422       return where;
423     }
424   else
425     return pwd->pw_name;
426 }
427
428 void
429 fork_to_background (void)
430 {
431   pid_t pid;
432   /* Whether we arrange our own version of opt.lfilename here.  */
433   int changedp = 0;
434
435   if (!opt.lfilename)
436     {
437       opt.lfilename = unique_name (DEFAULT_LOGFILE);
438       changedp = 1;
439     }
440   pid = fork ();
441   if (pid < 0)
442     {
443       /* parent, error */
444       perror ("fork");
445       exit (1);
446     }
447   else if (pid != 0)
448     {
449       /* parent, no error */
450       printf (_("Continuing in background.\n"));
451       if (changedp)
452         printf (_("Output will be written to `%s'.\n"), opt.lfilename);
453       exit (0);
454     }
455   /* child: keep running */
456 }
457 #endif /* not WINDOWS */
458 \f
459 /* Canonicalize PATH, and return a new path.  The new path differs from PATH
460    in that:
461         Multple `/'s are collapsed to a single `/'.
462         Leading `./'s and trailing `/.'s are removed.
463         Trailing `/'s are removed.
464         Non-leading `../'s and trailing `..'s are handled by removing
465         portions of the path.
466
467    E.g. "a/b/c/./../d/.." will yield "a/b".  This function originates
468    from GNU Bash.
469
470    Changes for Wget:
471         Always use '/' as stub_char.
472         Don't check for local things using canon_stat.
473         Change the original string instead of strdup-ing.
474         React correctly when beginning with `./' and `../'.  */
475 void
476 path_simplify (char *path)
477 {
478   register int i, start, ddot;
479   char stub_char;
480
481   if (!*path)
482     return;
483
484   /*stub_char = (*path == '/') ? '/' : '.';*/
485   stub_char = '/';
486
487   /* Addition: Remove all `./'-s preceding the string.  If `../'-s
488      precede, put `/' in front and remove them too.  */
489   i = 0;
490   ddot = 0;
491   while (1)
492     {
493       if (path[i] == '.' && path[i + 1] == '/')
494         i += 2;
495       else if (path[i] == '.' && path[i + 1] == '.' && path[i + 2] == '/')
496         {
497           i += 3;
498           ddot = 1;
499         }
500       else
501         break;
502     }
503   if (i)
504     strcpy (path, path + i - ddot);
505
506   /* Replace single `.' or `..' with `/'.  */
507   if ((path[0] == '.' && path[1] == '\0')
508       || (path[0] == '.' && path[1] == '.' && path[2] == '\0'))
509     {
510       path[0] = stub_char;
511       path[1] = '\0';
512       return;
513     }
514   /* Walk along PATH looking for things to compact.  */
515   i = 0;
516   while (1)
517     {
518       if (!path[i])
519         break;
520
521       while (path[i] && path[i] != '/')
522         i++;
523
524       start = i++;
525
526       /* If we didn't find any slashes, then there is nothing left to do.  */
527       if (!path[start])
528         break;
529
530       /* Handle multiple `/'s in a row.  */
531       while (path[i] == '/')
532         i++;
533
534       if ((start + 1) != i)
535         {
536           strcpy (path + start + 1, path + i);
537           i = start + 1;
538         }
539
540       /* Check for trailing `/'.  */
541       if (start && !path[i])
542         {
543         zero_last:
544           path[--i] = '\0';
545           break;
546         }
547
548       /* Check for `../', `./' or trailing `.' by itself.  */
549       if (path[i] == '.')
550         {
551           /* Handle trailing `.' by itself.  */
552           if (!path[i + 1])
553             goto zero_last;
554
555           /* Handle `./'.  */
556           if (path[i + 1] == '/')
557             {
558               strcpy (path + i, path + i + 1);
559               i = (start < 0) ? 0 : start;
560               continue;
561             }
562
563           /* Handle `../' or trailing `..' by itself.  */
564           if (path[i + 1] == '.' &&
565               (path[i + 2] == '/' || !path[i + 2]))
566             {
567               while (--start > -1 && path[start] != '/');
568               strcpy (path + start + 1, path + i + 2);
569               i = (start < 0) ? 0 : start;
570               continue;
571             }
572         }       /* path == '.' */
573     } /* while */
574
575   if (!*path)
576     {
577       *path = stub_char;
578       path[1] = '\0';
579     }
580 }
581 \f
582 /* "Touch" FILE, i.e. make its atime and mtime equal to the time
583    specified with TM.  */
584 void
585 touch (const char *file, time_t tm)
586 {
587 #ifdef HAVE_STRUCT_UTIMBUF
588   struct utimbuf times;
589   times.actime = times.modtime = tm;
590 #else
591   time_t times[2];
592   times[0] = times[1] = tm;
593 #endif
594
595   if (utime (file, &times) == -1)
596     logprintf (LOG_NOTQUIET, "utime(%s): %s\n", file, strerror (errno));
597 }
598
599 /* Checks if FILE is a symbolic link, and removes it if it is.  Does
600    nothing under MS-Windows.  */
601 int
602 remove_link (const char *file)
603 {
604   int err = 0;
605   struct stat st;
606
607   if (lstat (file, &st) == 0 && S_ISLNK (st.st_mode))
608     {
609       DEBUGP (("Unlinking %s (symlink).\n", file));
610       err = unlink (file);
611       if (err != 0)
612         logprintf (LOG_VERBOSE, _("Failed to unlink symlink `%s': %s\n"),
613                    file, strerror (errno));
614     }
615   return err;
616 }
617
618 /* Does FILENAME exist?  This is quite a lousy implementation, since
619    it supplies no error codes -- only a yes-or-no answer.  Thus it
620    will return that a file does not exist if, e.g., the directory is
621    unreadable.  I don't mind it too much currently, though.  The
622    proper way should, of course, be to have a third, error state,
623    other than true/false, but that would introduce uncalled-for
624    additional complexity to the callers.  */
625 int
626 file_exists_p (const char *filename)
627 {
628 #ifdef HAVE_ACCESS
629   return access (filename, F_OK) >= 0;
630 #else
631   struct stat buf;
632   return stat (filename, &buf) >= 0;
633 #endif
634 }
635
636 /* Returns 0 if PATH is a directory, 1 otherwise (any kind of file).
637    Returns 0 on error.  */
638 int
639 file_non_directory_p (const char *path)
640 {
641   struct stat buf;
642   /* Use lstat() rather than stat() so that symbolic links pointing to
643      directories can be identified correctly.  */
644   if (lstat (path, &buf) != 0)
645     return 0;
646   return S_ISDIR (buf.st_mode) ? 0 : 1;
647 }
648
649 /* Return a unique filename, given a prefix and count */
650 static char *
651 unique_name_1 (const char *fileprefix, int count)
652 {
653   char *filename;
654
655   if (count)
656     {
657       filename = (char *)xmalloc (strlen (fileprefix) + numdigit (count) + 2);
658       sprintf (filename, "%s.%d", fileprefix, count);
659     }
660   else
661     filename = xstrdup (fileprefix);
662
663   if (!file_exists_p (filename))
664     return filename;
665   else
666     {
667       xfree (filename);
668       return NULL;
669     }
670 }
671
672 /* Return a unique file name, based on PREFIX.  */
673 char *
674 unique_name (const char *prefix)
675 {
676   char *file = NULL;
677   int count = 0;
678
679   while (!file)
680     file = unique_name_1 (prefix, count++);
681   return file;
682 }
683 \f
684 /* Create DIRECTORY.  If some of the pathname components of DIRECTORY
685    are missing, create them first.  In case any mkdir() call fails,
686    return its error status.  Returns 0 on successful completion.
687
688    The behaviour of this function should be identical to the behaviour
689    of `mkdir -p' on systems where mkdir supports the `-p' option.  */
690 int
691 make_directory (const char *directory)
692 {
693   int quit = 0;
694   int i;
695   char *dir;
696
697   /* Make a copy of dir, to be able to write to it.  Otherwise, the
698      function is unsafe if called with a read-only char *argument.  */
699   STRDUP_ALLOCA (dir, directory);
700
701   /* If the first character of dir is '/', skip it (and thus enable
702      creation of absolute-pathname directories.  */
703   for (i = (*dir == '/'); 1; ++i)
704     {
705       for (; dir[i] && dir[i] != '/'; i++)
706         ;
707       if (!dir[i])
708         quit = 1;
709       dir[i] = '\0';
710       /* Check whether the directory already exists.  */
711       if (!file_exists_p (dir))
712         {
713           if (mkdir (dir, 0777) < 0)
714             return -1;
715         }
716       if (quit)
717         break;
718       else
719         dir[i] = '/';
720     }
721   return 0;
722 }
723 \f
724 static int in_acclist PARAMS ((const char *const *, const char *, int));
725
726 /* Determine whether a file is acceptable to be followed, according to
727    lists of patterns to accept/reject.  */
728 int
729 acceptable (const char *s)
730 {
731   int l = strlen (s);
732
733   while (l && s[l] != '/')
734     --l;
735   if (s[l] == '/')
736     s += (l + 1);
737   if (opt.accepts)
738     {
739       if (opt.rejects)
740         return (in_acclist ((const char *const *)opt.accepts, s, 1)
741                 && !in_acclist ((const char *const *)opt.rejects, s, 1));
742       else
743         return in_acclist ((const char *const *)opt.accepts, s, 1);
744     }
745   else if (opt.rejects)
746     return !in_acclist ((const char *const *)opt.rejects, s, 1);
747   return 1;
748 }
749
750 /* Compare S1 and S2 frontally; S2 must begin with S1.  E.g. if S1 is
751    `/something', frontcmp() will return 1 only if S2 begins with
752    `/something'.  Otherwise, 0 is returned.  */
753 int
754 frontcmp (const char *s1, const char *s2)
755 {
756   for (; *s1 && *s2 && (*s1 == *s2); ++s1, ++s2);
757   return !*s1;
758 }
759
760 /* Iterate through STRLIST, and return the first element that matches
761    S, through wildcards or front comparison (as appropriate).  */
762 static char *
763 proclist (char **strlist, const char *s, enum accd flags)
764 {
765   char **x;
766
767   for (x = strlist; *x; x++)
768     if (has_wildcards_p (*x))
769       {
770         if (fnmatch (*x, s, FNM_PATHNAME) == 0)
771           break;
772       }
773     else
774       {
775         char *p = *x + ((flags & ALLABS) && (**x == '/')); /* Remove '/' */
776         if (frontcmp (p, s))
777           break;
778       }
779   return *x;
780 }
781
782 /* Returns whether DIRECTORY is acceptable for download, wrt the
783    include/exclude lists.
784
785    If FLAGS is ALLABS, the leading `/' is ignored in paths; relative
786    and absolute paths may be freely intermixed.  */
787 int
788 accdir (const char *directory, enum accd flags)
789 {
790   /* Remove starting '/'.  */
791   if (flags & ALLABS && *directory == '/')
792     ++directory;
793   if (opt.includes)
794     {
795       if (!proclist (opt.includes, directory, flags))
796         return 0;
797     }
798   if (opt.excludes)
799     {
800       if (proclist (opt.excludes, directory, flags))
801         return 0;
802     }
803   return 1;
804 }
805
806 /* Match the end of STRING against PATTERN.  For instance:
807
808    match_backwards ("abc", "bc") -> 1
809    match_backwards ("abc", "ab") -> 0
810    match_backwards ("abc", "abc") -> 1 */
811 static int
812 match_backwards (const char *string, const char *pattern)
813 {
814   int i, j;
815
816   for (i = strlen (string), j = strlen (pattern); i >= 0 && j >= 0; i--, j--)
817     if (string[i] != pattern[j])
818       break;
819   /* If the pattern was exhausted, the match was succesful.  */
820   if (j == -1)
821     return 1;
822   else
823     return 0;
824 }
825
826 /* Checks whether string S matches each element of ACCEPTS.  A list
827    element are matched either with fnmatch() or match_backwards(),
828    according to whether the element contains wildcards or not.
829
830    If the BACKWARD is 0, don't do backward comparison -- just compare
831    them normally.  */
832 static int
833 in_acclist (const char *const *accepts, const char *s, int backward)
834 {
835   for (; *accepts; accepts++)
836     {
837       if (has_wildcards_p (*accepts))
838         {
839           /* fnmatch returns 0 if the pattern *does* match the
840              string.  */
841           if (fnmatch (*accepts, s, 0) == 0)
842             return 1;
843         }
844       else
845         {
846           if (backward)
847             {
848               if (match_backwards (s, *accepts))
849                 return 1;
850             }
851           else
852             {
853               if (!strcmp (s, *accepts))
854                 return 1;
855             }
856         }
857     }
858   return 0;
859 }
860
861 /* Return the malloc-ed suffix of STR.  For instance:
862    suffix ("foo.bar")       -> "bar"
863    suffix ("foo.bar.baz")   -> "baz"
864    suffix ("/foo/bar")      -> NULL
865    suffix ("/foo.bar/baz")  -> NULL  */
866 char *
867 suffix (const char *str)
868 {
869   int i;
870
871   for (i = strlen (str); i && str[i] != '/' && str[i] != '.'; i--);
872   if (str[i++] == '.')
873     return xstrdup (str + i);
874   else
875     return NULL;
876 }
877
878 /* Read a line from FP.  The function reallocs the storage as needed
879    to accomodate for any length of the line.  Reallocs are done
880    storage exponentially, doubling the storage after each overflow to
881    minimize the number of calls to realloc() and fgets().  The newline
882    character at the end of line is retained.
883
884    After end-of-file is encountered without anything being read, NULL
885    is returned.  NULL is also returned on error.  To distinguish
886    between these two cases, use the stdio function ferror().  */
887
888 char *
889 read_whole_line (FILE *fp)
890 {
891   int length = 0;
892   int bufsize = 81;
893   char *line = (char *)xmalloc (bufsize);
894
895   while (fgets (line + length, bufsize - length, fp))
896     {
897       length += strlen (line + length);
898       assert (length > 0);
899       if (line[length - 1] == '\n')
900         break;
901       /* fgets() guarantees to read the whole line, or to use up the
902          space we've given it.  We can double the buffer
903          unconditionally.  */
904       bufsize <<= 1;
905       line = xrealloc (line, bufsize);
906     }
907   if (length == 0 || ferror (fp))
908     {
909       xfree (line);
910       return NULL;
911     }
912   if (length + 1 < bufsize)
913     /* Relieve the memory from our exponential greediness.  We say
914        `length + 1' because the terminating \0 is not included in
915        LENGTH.  We don't need to zero-terminate the string ourselves,
916        though, because fgets() does that.  */
917     line = xrealloc (line, length + 1);
918   return line;
919 }
920 \f
921 /* Read FILE into memory.  A pointer to `struct file_memory' are
922    returned; use struct element `content' to access file contents, and
923    the element `length' to know the file length.  `content' is *not*
924    zero-terminated, and you should *not* read or write beyond the [0,
925    length) range of characters.
926
927    After you are done with the file contents, call read_file_free to
928    release the memory.
929
930    Depending on the operating system and the type of file that is
931    being read, read_file() either mmap's the file into memory, or
932    reads the file into the core using read().
933
934    If file is named "-", fileno(stdin) is used for reading instead.
935    If you want to read from a real file named "-", use "./-" instead.  */
936
937 struct file_memory *
938 read_file (const char *file)
939 {
940   int fd;
941   struct file_memory *fm;
942   long size;
943   int inhibit_close = 0;
944
945   /* Some magic in the finest tradition of Perl and its kin: if FILE
946      is "-", just use stdin.  */
947   if (HYPHENP (file))
948     {
949       fd = fileno (stdin);
950       inhibit_close = 1;
951       /* Note that we don't inhibit mmap() in this case.  If stdin is
952          redirected from a regular file, mmap() will still work.  */
953     }
954   else
955     fd = open (file, O_RDONLY);
956   if (fd < 0)
957     return NULL;
958   fm = xmalloc (sizeof (struct file_memory));
959
960 #ifdef HAVE_MMAP
961   {
962     struct stat buf;
963     if (fstat (fd, &buf) < 0)
964       goto mmap_lose;
965     fm->length = buf.st_size;
966     /* NOTE: As far as I know, the callers of this function never
967        modify the file text.  Relying on this would enable us to
968        specify PROT_READ and MAP_SHARED for a marginal gain in
969        efficiency, but at some cost to generality.  */
970     fm->content = mmap (NULL, fm->length, PROT_READ | PROT_WRITE,
971                         MAP_PRIVATE, fd, 0);
972     if (fm->content == MAP_FAILED)
973       goto mmap_lose;
974     if (!inhibit_close)
975       close (fd);
976
977     fm->mmap_p = 1;
978     return fm;
979   }
980
981  mmap_lose:
982   /* The most common reason why mmap() fails is that FD does not point
983      to a plain file.  However, it's also possible that mmap() doesn't
984      work for a particular type of file.  Therefore, whenever mmap()
985      fails, we just fall back to the regular method.  */
986 #endif /* HAVE_MMAP */
987
988   fm->length = 0;
989   size = 512;                   /* number of bytes fm->contents can
990                                    hold at any given time. */
991   fm->content = xmalloc (size);
992   while (1)
993     {
994       long nread;
995       if (fm->length > size / 2)
996         {
997           /* #### I'm not sure whether the whole exponential-growth
998              thing makes sense with kernel read.  On Linux at least,
999              read() refuses to read more than 4K from a file at a
1000              single chunk anyway.  But other Unixes might optimize it
1001              better, and it doesn't *hurt* anything, so I'm leaving
1002              it.  */
1003
1004           /* Normally, we grow SIZE exponentially to make the number
1005              of calls to read() and realloc() logarithmic in relation
1006              to file size.  However, read() can read an amount of data
1007              smaller than requested, and it would be unreasonably to
1008              double SIZE every time *something* was read.  Therefore,
1009              we double SIZE only when the length exceeds half of the
1010              entire allocated size.  */
1011           size <<= 1;
1012           fm->content = xrealloc (fm->content, size);
1013         }
1014       nread = read (fd, fm->content + fm->length, size - fm->length);
1015       if (nread > 0)
1016         /* Successful read. */
1017         fm->length += nread;
1018       else if (nread < 0)
1019         /* Error. */
1020         goto lose;
1021       else
1022         /* EOF */
1023         break;
1024     }
1025   if (!inhibit_close)
1026     close (fd);
1027   if (size > fm->length && fm->length != 0)
1028     /* Due to exponential growth of fm->content, the allocated region
1029        might be much larger than what is actually needed.  */
1030     fm->content = xrealloc (fm->content, fm->length);
1031   fm->mmap_p = 0;
1032   return fm;
1033
1034  lose:
1035   if (!inhibit_close)
1036     close (fd);
1037   xfree (fm->content);
1038   xfree (fm);
1039   return NULL;
1040 }
1041
1042 /* Release the resources held by FM.  Specifically, this calls
1043    munmap() or xfree() on fm->content, depending whether mmap or
1044    malloc/read were used to read in the file.  It also frees the
1045    memory needed to hold the FM structure itself.  */
1046
1047 void
1048 read_file_free (struct file_memory *fm)
1049 {
1050 #ifdef HAVE_MMAP
1051   if (fm->mmap_p)
1052     {
1053       munmap (fm->content, fm->length);
1054     }
1055   else
1056 #endif
1057     {
1058       xfree (fm->content);
1059     }
1060   xfree (fm);
1061 }
1062 \f
1063 /* Free the pointers in a NULL-terminated vector of pointers, then
1064    free the pointer itself.  */
1065 void
1066 free_vec (char **vec)
1067 {
1068   if (vec)
1069     {
1070       char **p = vec;
1071       while (*p)
1072         xfree (*p++);
1073       xfree (vec);
1074     }
1075 }
1076
1077 /* Append vector V2 to vector V1.  The function frees V2 and
1078    reallocates V1 (thus you may not use the contents of neither
1079    pointer after the call).  If V1 is NULL, V2 is returned.  */
1080 char **
1081 merge_vecs (char **v1, char **v2)
1082 {
1083   int i, j;
1084
1085   if (!v1)
1086     return v2;
1087   if (!v2)
1088     return v1;
1089   if (!*v2)
1090     {
1091       /* To avoid j == 0 */
1092       xfree (v2);
1093       return v1;
1094     }
1095   /* Count v1.  */
1096   for (i = 0; v1[i]; i++);
1097   /* Count v2.  */
1098   for (j = 0; v2[j]; j++);
1099   /* Reallocate v1.  */
1100   v1 = (char **)xrealloc (v1, (i + j + 1) * sizeof (char **));
1101   memcpy (v1 + i, v2, (j + 1) * sizeof (char *));
1102   xfree (v2);
1103   return v1;
1104 }
1105
1106 /* A set of simple-minded routines to store strings in a linked list.
1107    This used to also be used for searching, but now we have hash
1108    tables for that.  */
1109
1110 /* It's a shame that these simple things like linked lists and hash
1111    tables (see hash.c) need to be implemented over and over again.  It
1112    would be nice to be able to use the routines from glib -- see
1113    www.gtk.org for details.  However, that would make Wget depend on
1114    glib, and I want to avoid dependencies to external libraries for
1115    reasons of convenience and portability (I suspect Wget is more
1116    portable than anything ever written for Gnome).  */
1117
1118 /* Append an element to the list.  If the list has a huge number of
1119    elements, this can get slow because it has to find the list's
1120    ending.  If you think you have to call slist_append in a loop,
1121    think about calling slist_prepend() followed by slist_nreverse().  */
1122
1123 slist *
1124 slist_append (slist *l, const char *s)
1125 {
1126   slist *newel = (slist *)xmalloc (sizeof (slist));
1127   slist *beg = l;
1128
1129   newel->string = xstrdup (s);
1130   newel->next = NULL;
1131
1132   if (!l)
1133     return newel;
1134   /* Find the last element.  */
1135   while (l->next)
1136     l = l->next;
1137   l->next = newel;
1138   return beg;
1139 }
1140
1141 /* Prepend S to the list.  Unlike slist_append(), this is O(1).  */
1142
1143 slist *
1144 slist_prepend (slist *l, const char *s)
1145 {
1146   slist *newel = (slist *)xmalloc (sizeof (slist));
1147   newel->string = xstrdup (s);
1148   newel->next = l;
1149   return newel;
1150 }
1151
1152 /* Destructively reverse L. */
1153
1154 slist *
1155 slist_nreverse (slist *l)
1156 {
1157   slist *prev = NULL;
1158   while (l)
1159     {
1160       slist *next = l->next;
1161       l->next = prev;
1162       prev = l;
1163       l = next;
1164     }
1165   return prev;
1166 }
1167
1168 /* Is there a specific entry in the list?  */
1169 int
1170 slist_contains (slist *l, const char *s)
1171 {
1172   for (; l; l = l->next)
1173     if (!strcmp (l->string, s))
1174       return 1;
1175   return 0;
1176 }
1177
1178 /* Free the whole slist.  */
1179 void
1180 slist_free (slist *l)
1181 {
1182   while (l)
1183     {
1184       slist *n = l->next;
1185       xfree (l->string);
1186       xfree (l);
1187       l = n;
1188     }
1189 }
1190 \f
1191 /* Sometimes it's useful to create "sets" of strings, i.e. special
1192    hash tables where you want to store strings as keys and merely
1193    query for their existence.  Here is a set of utility routines that
1194    makes that transparent.  */
1195
1196 void
1197 string_set_add (struct hash_table *ht, const char *s)
1198 {
1199   /* First check whether the set element already exists.  If it does,
1200      do nothing so that we don't have to free() the old element and
1201      then strdup() a new one.  */
1202   if (hash_table_exists (ht, s))
1203     return;
1204
1205   /* We use "1" as value.  It provides us a useful and clear arbitrary
1206      value, and it consumes no memory -- the pointers to the same
1207      string "1" will be shared by all the key-value pairs in all `set'
1208      hash tables.  */
1209   hash_table_put (ht, xstrdup (s), "1");
1210 }
1211
1212 /* Synonym for hash_table_exists... */
1213
1214 int
1215 string_set_exists (struct hash_table *ht, const char *s)
1216 {
1217   return hash_table_exists (ht, s);
1218 }
1219
1220 static int
1221 string_set_free_mapper (void *key, void *value_ignored, void *arg_ignored)
1222 {
1223   xfree (key);
1224   return 0;
1225 }
1226
1227 void
1228 string_set_free (struct hash_table *ht)
1229 {
1230   hash_table_map (ht, string_set_free_mapper, NULL);
1231   hash_table_destroy (ht);
1232 }
1233
1234 static int
1235 free_keys_and_values_mapper (void *key, void *value, void *arg_ignored)
1236 {
1237   xfree (key);
1238   xfree (value);
1239   return 0;
1240 }
1241
1242 /* Another utility function: call free() on all keys and values of HT.  */
1243
1244 void
1245 free_keys_and_values (struct hash_table *ht)
1246 {
1247   hash_table_map (ht, free_keys_and_values_mapper, NULL);
1248 }
1249
1250 \f
1251 /* Engine for legible and legible_long_long; this function works on
1252    strings.  */
1253
1254 static char *
1255 legible_1 (const char *repr)
1256 {
1257   static char outbuf[128];
1258   int i, i1, mod;
1259   char *outptr;
1260   const char *inptr;
1261
1262   /* Reset the pointers.  */
1263   outptr = outbuf;
1264   inptr = repr;
1265   /* If the number is negative, shift the pointers.  */
1266   if (*inptr == '-')
1267     {
1268       *outptr++ = '-';
1269       ++inptr;
1270     }
1271   /* How many digits before the first separator?  */
1272   mod = strlen (inptr) % 3;
1273   /* Insert them.  */
1274   for (i = 0; i < mod; i++)
1275     *outptr++ = inptr[i];
1276   /* Now insert the rest of them, putting separator before every
1277      third digit.  */
1278   for (i1 = i, i = 0; inptr[i1]; i++, i1++)
1279     {
1280       if (i % 3 == 0 && i1 != 0)
1281         *outptr++ = ',';
1282       *outptr++ = inptr[i1];
1283     }
1284   /* Zero-terminate the string.  */
1285   *outptr = '\0';
1286   return outbuf;
1287 }
1288
1289 /* Legible -- return a static pointer to the legibly printed long.  */
1290 char *
1291 legible (long l)
1292 {
1293   char inbuf[24];
1294   /* Print the number into the buffer.  */
1295   long_to_string (inbuf, l);
1296   return legible_1 (inbuf);
1297 }
1298
1299 /* The same as legible(), but works on VERY_LONG_TYPE.  See sysdep.h.  */
1300 char *
1301 legible_very_long (VERY_LONG_TYPE l)
1302 {
1303   char inbuf[128];
1304   /* Print the number into the buffer.  */
1305   sprintf (inbuf, VERY_LONG_FORMAT, l);
1306   return legible_1 (inbuf);
1307 }
1308
1309 /* Count the digits in a (long) integer.  */
1310 int
1311 numdigit (long a)
1312 {
1313   int res = 1;
1314   while ((a /= 10) != 0)
1315     ++res;
1316   return res;
1317 }
1318
1319 /* Print NUMBER to BUFFER.  This is equivalent to sprintf(buffer,
1320    "%ld", number), only much faster.
1321
1322    BUFFER should accept 24 bytes.  This should suffice for the longest
1323    numbers on 64-bit machines, including the `-' sign and the trailing
1324    \0.  */
1325 void
1326 long_to_string (char *buffer, long number)
1327 {
1328 #if (SIZEOF_LONG != 4) && (SIZEOF_LONG != 8)
1329   /* Huh? */
1330   sprintf (buffer, "%ld", number);
1331 #else /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1332   char *p = buffer;
1333   int force = 0;
1334
1335   if (number < 0)
1336     {
1337       *p++ = '-';
1338       number = -number;
1339     }
1340
1341 #define FROB(figure) do {                                               \
1342     if (force || number >= figure)                                      \
1343       *p++ = number / figure + '0', number %= figure, force = 1;        \
1344     } while (0)
1345 #if SIZEOF_LONG == 8
1346   FROB (1000000000000000000L);
1347   FROB (100000000000000000L);
1348   FROB (10000000000000000L);
1349   FROB (1000000000000000L);
1350   FROB (100000000000000L);
1351   FROB (10000000000000L);
1352   FROB (1000000000000L);
1353   FROB (100000000000L);
1354   FROB (10000000000L);
1355 #endif /* SIZEOF_LONG == 8 */
1356   FROB (1000000000);
1357   FROB (100000000);
1358   FROB (10000000);
1359   FROB (1000000);
1360   FROB (100000);
1361   FROB (10000);
1362   FROB (1000);
1363   FROB (100);
1364   FROB (10);
1365 #undef FROB
1366   *p++ = number + '0';
1367   *p = '\0';
1368 #endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
1369 }
1370 \f
1371 /* This should probably be at a better place, but it doesn't really
1372    fit into html-parse.c.  */
1373
1374 /* The function returns the pointer to the malloc-ed quoted version of
1375    string s.  It will recognize and quote numeric and special graphic
1376    entities, as per RFC1866:
1377
1378    `&' -> `&amp;'
1379    `<' -> `&lt;'
1380    `>' -> `&gt;'
1381    `"' -> `&quot;'
1382    SP  -> `&#32;'
1383
1384    No other entities are recognized or replaced.  */
1385 char *
1386 html_quote_string (const char *s)
1387 {
1388   const char *b = s;
1389   char *p, *res;
1390   int i;
1391
1392   /* Pass through the string, and count the new size.  */
1393   for (i = 0; *s; s++, i++)
1394     {
1395       if (*s == '&')
1396         i += 4;                 /* `amp;' */
1397       else if (*s == '<' || *s == '>')
1398         i += 3;                 /* `lt;' and `gt;' */
1399       else if (*s == '\"')
1400         i += 5;                 /* `quot;' */
1401       else if (*s == ' ')
1402         i += 4;                 /* #32; */
1403     }
1404   res = (char *)xmalloc (i + 1);
1405   s = b;
1406   for (p = res; *s; s++)
1407     {
1408       switch (*s)
1409         {
1410         case '&':
1411           *p++ = '&';
1412           *p++ = 'a';
1413           *p++ = 'm';
1414           *p++ = 'p';
1415           *p++ = ';';
1416           break;
1417         case '<': case '>':
1418           *p++ = '&';
1419           *p++ = (*s == '<' ? 'l' : 'g');
1420           *p++ = 't';
1421           *p++ = ';';
1422           break;
1423         case '\"':
1424           *p++ = '&';
1425           *p++ = 'q';
1426           *p++ = 'u';
1427           *p++ = 'o';
1428           *p++ = 't';
1429           *p++ = ';';
1430           break;
1431         case ' ':
1432           *p++ = '&';
1433           *p++ = '#';
1434           *p++ = '3';
1435           *p++ = '2';
1436           *p++ = ';';
1437           break;
1438         default:
1439           *p++ = *s;
1440         }
1441     }
1442   *p = '\0';
1443   return res;
1444 }