merge with 0.30.213
[util-vserver.git] / lib_internal / matchlist-appendfiles.c
1 // $Id: matchlist-appendfiles.c 1423 2004-04-06 08:43:20Z ensc $    --*- c -*--
2
3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
4 //  
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; version 2 of the License.
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; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18
19 #ifdef HAVE_CONFIG_H
20 #  include <config.h>
21 #endif
22
23 #include "matchlist.h"
24 #include <fnmatch.h>
25 #include <assert.h>
26
27 static int
28 fnmatchWrap(char const *a, char const *b)
29 {
30   return fnmatch(a, b, 0);
31 }
32
33 static MatchItemCompareFunc
34 determineCompareFunc(char const UNUSED *fname)
35 {
36   return fnmatchWrap;
37 }
38
39 void
40 MatchList_appendFiles(struct MatchList *list, size_t idx,
41                       char **files, size_t count,
42                       bool auto_type)
43 {
44   struct MatchItem      *ptr = list->data + idx;
45   size_t                i;
46   
47   assert(idx+count <= list->count);
48
49   if (auto_type) {
50     for (i=0; i<count; ++i) {
51       char      *file = files[i];
52       switch (file[0]) {
53         case '+'        :  ptr->type = stINCLUDE; ++file; break;
54         case '~'        :  ptr->type = stSKIP;    ++file; break;
55         case '-'        :  ++file; /*@fallthrough@*/
56         default         :  ptr->type = stEXCLUDE; break;
57       }
58       ptr->cmp  = determineCompareFunc(file);
59       ptr->name = file;
60       ++ptr;
61     }
62   }
63   else {
64     for (i=0; i<count; ++i) {
65       ptr->type = stEXCLUDE;
66       ptr->name = files[i];
67       ptr->cmp  = 0;
68       ++ptr;
69     }
70   }
71 }