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