exclude.c revision 131554
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 27extern int errno; 28#endif 29#include <exclude.h> 30#include <fnmatch.h> 31#include <stdio.h> 32#include <sys/types.h> 33 34void *xmalloc PARAMS ((size_t)); 35void *xrealloc PARAMS ((void *, size_t)); 36 37/* Keep track of excluded file name patterns. */ 38 39struct exclude 40 { 41 char const **exclude; 42 int exclude_alloc; 43 int exclude_count; 44 }; 45 46struct exclude * 47new_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 56int 57excluded_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 70void 71add_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 81int 82add_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} 129