1 | /* exclude.c -- exclude file names
|
---|
2 | Copyright 1992, 1993, 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
|
---|
3 |
|
---|
4 | This program is free software; you can redistribute it and/or modify
|
---|
5 | it under the terms of the GNU General Public License as published by
|
---|
6 | the Free Software Foundation; either version 2, or (at your option)
|
---|
7 | any later version.
|
---|
8 |
|
---|
9 | This program is distributed in the hope that it will be useful,
|
---|
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
12 | GNU General Public License for more details.
|
---|
13 |
|
---|
14 | You should have received a copy of the GNU General Public License
|
---|
15 | along with this program; see the file COPYING.
|
---|
16 | If not, write to the Free Software Foundation,
|
---|
17 | 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
---|
18 |
|
---|
19 | /* Written by Paul Eggert <eggert@twinsun.com> */
|
---|
20 |
|
---|
21 | #if HAVE_CONFIG_H
|
---|
22 | # include <config.h>
|
---|
23 | #endif
|
---|
24 |
|
---|
25 | #include <errno.h>
|
---|
26 | #ifndef errno
|
---|
27 | extern int errno;
|
---|
28 | #endif
|
---|
29 | #include <exclude.h>
|
---|
30 | #include <fnmatch.h>
|
---|
31 | #include <stdio.h>
|
---|
32 | #include <sys/types.h>
|
---|
33 |
|
---|
34 | void *xmalloc PARAMS ((size_t));
|
---|
35 | void *xrealloc PARAMS ((void *, size_t));
|
---|
36 |
|
---|
37 | /* Keep track of excluded file name patterns. */
|
---|
38 |
|
---|
39 | struct exclude
|
---|
40 | {
|
---|
41 | char const **exclude;
|
---|
42 | int exclude_alloc;
|
---|
43 | int exclude_count;
|
---|
44 | };
|
---|
45 |
|
---|
46 | struct exclude *
|
---|
47 | new_exclude (void)
|
---|
48 | {
|
---|
49 | struct exclude *ex = (struct exclude *) xmalloc (sizeof (struct exclude));
|
---|
50 | ex->exclude_count = 0;
|
---|
51 | ex->exclude_alloc = 64;
|
---|
52 | ex->exclude = (char const **) xmalloc (ex->exclude_alloc * sizeof (char *));
|
---|
53 | return ex;
|
---|
54 | }
|
---|
55 |
|
---|
56 | int
|
---|
57 | excluded_filename (struct exclude const *ex, char const *f, int options)
|
---|
58 | {
|
---|
59 | char const * const *exclude = ex->exclude;
|
---|
60 | int exclude_count = ex->exclude_count;
|
---|
61 | int i;
|
---|
62 |
|
---|
63 | for (i = 0; i < exclude_count; i++)
|
---|
64 | if (fnmatch (exclude[i], f, options) == 0)
|
---|
65 | return 1;
|
---|
66 |
|
---|
67 | return 0;
|
---|
68 | }
|
---|
69 |
|
---|
70 | void
|
---|
71 | add_exclude (struct exclude *ex, char const *pattern)
|
---|
72 | {
|
---|
73 | if (ex->exclude_alloc <= ex->exclude_count)
|
---|
74 | ex->exclude = (char const **) xrealloc (ex->exclude,
|
---|
75 | ((ex->exclude_alloc *= 2)
|
---|
76 | * sizeof (char *)));
|
---|
77 |
|
---|
78 | ex->exclude[ex->exclude_count++] = pattern;
|
---|
79 | }
|
---|
80 |
|
---|
81 | int
|
---|
82 | add_exclude_file (void (*add_func) PARAMS ((struct exclude *, char const *)),
|
---|
83 | struct exclude *ex, char const *filename, char line_end)
|
---|
84 | {
|
---|
85 | int use_stdin = filename[0] == '-' && !filename[1];
|
---|
86 | FILE *in;
|
---|
87 | char *buf;
|
---|
88 | char *p;
|
---|
89 | char const *pattern;
|
---|
90 | char const *lim;
|
---|
91 | size_t buf_alloc = 1024;
|
---|
92 | size_t buf_count = 0;
|
---|
93 | int c;
|
---|
94 | int e = 0;
|
---|
95 |
|
---|
96 | if (use_stdin)
|
---|
97 | in = stdin;
|
---|
98 | else if (! (in = fopen (filename, "r")))
|
---|
99 | return -1;
|
---|
100 |
|
---|
101 | buf = xmalloc (buf_alloc);
|
---|
102 |
|
---|
103 | while ((c = getc (in)) != EOF)
|
---|
104 | {
|
---|
105 | buf[buf_count++] = c;
|
---|
106 | if (buf_count == buf_alloc)
|
---|
107 | buf = xrealloc (buf, buf_alloc *= 2);
|
---|
108 | }
|
---|
109 |
|
---|
110 | buf = xrealloc (buf, buf_count + 1);
|
---|
111 |
|
---|
112 | if (ferror (in))
|
---|
113 | e = errno;
|
---|
114 |
|
---|
115 | if (!use_stdin && fclose (in) != 0)
|
---|
116 | e = errno;
|
---|
117 |
|
---|
118 | for (pattern = p = buf, lim = buf + buf_count; p <= lim; p++)
|
---|
119 | if (p < lim ? *p == line_end : buf < p && p[-1])
|
---|
120 | {
|
---|
121 | *p = '\0';
|
---|
122 | (*add_func) (ex, pattern);
|
---|
123 | pattern = p + 1;
|
---|
124 | }
|
---|
125 |
|
---|
126 | errno = e;
|
---|
127 | return e ? -1 : 0;
|
---|
128 | }
|
---|