initial checkin
[util-vserver.git] / util-vserver / src / vunify-matchlist.c
1 // $Id$    --*- c -*--
2
3 // Copyright (C) 2003 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 "vunify-matchlist.h"
24 #include <assert.h>
25
26 bool
27 MatchList_compare(struct MatchList const *list, char const *path)
28 {
29   bool                                  res = true;
30   struct MatchItem const *              ptr = list->data;
31   struct MatchItem const * const        end_ptr = list->data + list->count;
32   
33   //write(1, path, strlen(path));
34   //write(1, "\n", 1);
35   for (; ptr<end_ptr; ++ptr) {
36     assert(ptr->cmp!=0);
37     if ((ptr->cmp)(ptr->name, path)==0) {
38       switch (ptr->type) {
39         case stINCLUDE  :  res = true;  break;
40         case stEXCLUDE  :  res = false; break;
41         default         :  abort();
42       }
43       break;
44     }
45   }
46
47   return res;
48 }
49
50 void
51 MatchList_init(struct MatchList *list, char const *root, size_t count)
52 {
53   list->skip_depth = 0;
54   list->root.d     = root;
55   list->root.l     = strlen(root);
56   list->data       = malloc(sizeof(struct MatchItem) * count);
57   list->count      = count;
58 }
59
60
61 void
62 PathInfo_append(PathInfo       * restrict lhs,
63                 PathInfo const * restrict rhs,
64                 char *buf)
65 {
66   char *                ptr = buf;
67   char const *          rhs_ptr = rhs->d;
68   size_t                rhs_len = rhs->l;
69
70   while (lhs->l>1 && lhs->d[lhs->l-1]=='/') --lhs->l;
71
72   if (lhs->l>0) {
73     while (rhs->l>0 && *rhs_ptr=='/') {
74       ++rhs_ptr;
75       --rhs_len;
76     }
77     
78     ptr = Xmemcpy(ptr, lhs->d, lhs->l);
79     if (ptr[-1]!='/')
80       ptr = Xmemcpy(ptr, "/", 1);
81   }
82 //  else if (*rhs_ptr!='/')
83 //    ptr = Xmemcpy(ptr, "/", 1);
84
85   ptr = Xmemcpy(ptr, rhs_ptr, rhs_len+1);
86
87   lhs->d = buf;
88   lhs->l = ptr-buf-1;
89 }
90
91
92 #ifdef ENSC_TESTSUITE
93 #define CHECK(LHS,RHS, EXP)                             \
94   do {                                                  \
95     PathInfo    lhs  = { LHS, sizeof(LHS)-1 };          \
96     PathInfo    rhs  = { RHS, sizeof(RHS)-1 };          \
97     char        *buf = malloc(ENSC_PI_APPSZ(lhs,rhs));  \
98     assert(ENSC_PI_APPSZ(lhs,rhs)>=sizeof(EXP));        \
99     PathInfo_append(&lhs, &rhs, buf);                   \
100     assert(memcmp(lhs.d, EXP, sizeof(EXP))==0);         \
101     assert(lhs.l == sizeof(EXP)-1);                     \
102     free(buf);                                          \
103   } while (0)
104
105
106 void
107 PathInfo_test()
108 {
109   CHECK("/var",  "/tmp", "/var/tmp");
110   CHECK("/var",   "tmp", "/var/tmp");
111   CHECK("/var/", "/tmp", "/var/tmp");
112   CHECK("/var/",  "tmp", "/var/tmp");
113   
114   CHECK("/",  "tmp",   "/tmp");
115   CHECK("/", "/tmp",   "/tmp");
116   
117   CHECK("", "/tmp",   "/tmp");
118   
119   CHECK("", "tmp",    "tmp");
120   CHECK("", "",       "");
121 }
122 #endif