1 /******************************************************************************
2 * FIDOCONFIG --- library for fidonet configs
3 ******************************************************************************
4 * grptree.c : functions to implement grouplists
5 *
6 * by Dmitry Sergienko <trooper@email.dp.ua>, 2:464/910@fidonet
7 *
8 * This file is part of FIDOCONFIG library (part of the Husky FIDOnet
9 * software project)
10 *
11 * This is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published
13 * by the Free Software Foundation; either version 2, or (at your option)
14 * any later version.
15 *
16 * FIDOCONFIG library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with FIDOCONFIG library; see the file COPYING. If not, write
23 * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA
24 *
25 * See also http://www.gnu.org
26 *****************************************************************************
27 * $Id$
28 */
29
30 #include <string.h>
31 #include <huskylib/huskylib.h>
32
33 #ifdef HAS_STRINGS_H
34 # include <strings.h>
35 #endif /* HAS_STRINGS_H */
36
37 /* export functions from DLL */
38 #define DLLEXPORT
39 #include <huskylib/huskyext.h>
40
41 #include "common.h"
42 #include "grptree.h"
43
44 tree *groupTree = NULL;
45
grp_compareEntries_Add(char * p_g1,char * p_g2)46 int grp_compareEntries_Add(char *p_g1, char *p_g2)
47 {
48
49 unused(p_g1);
50 unused(p_g2);
51
52 return 1; /* we build a list instead of btree. */
53 }
54
grp_compareEntries_Search(char * areaName,char * grptree_item)55 int grp_compareEntries_Search(char *areaName, char *grptree_item)
56 {
57 grp_t *g = (grp_t *)grptree_item;
58 char *pattern;
59 char *plist_tmp;
60 char *plist;
61 int found = 0;
62
63 if (!areaName || !grptree_item) return 1;
64
65 plist_tmp = sstrdup(g->patternList);
66 plist = plist_tmp;
67
68 pattern = strtok(plist, " \t,");
69 if (pattern) {
70 if ((found = patimat(areaName, pattern)) == 0)
71 while((pattern = strtok(NULL, " \t,")) != NULL)
72 if ((found = patimat(areaName, pattern)) != 0)
73 break;
74 }
75 nfree(plist_tmp);
76
77 return !found;
78 }
79
grp_compareEntries_SearchByName(char * groupName,char * grptree_item)80 int grp_compareEntries_SearchByName(char *groupName, char *grptree_item)
81 {
82 grp_t *g = (grp_t *)grptree_item;
83
84 if (!groupName || !grptree_item) return 1;
85
86 if (stricmp(groupName, g->name))
87 return 1;
88 else
89 return 0;
90 }
91
grp_deleteEntry(char * p_g)92 int grp_deleteEntry(char *p_g) {
93 grp_t *g = (grp_t *) p_g;
94 if (!g) return 1;
95 nfree(g->name);
96 nfree(g->patternList);
97 nfree(g->area);
98 return 1;
99 }
100
addGrpToTree(grp_t * grp)101 int addGrpToTree(grp_t *grp)
102 {
103 return tree_add(&groupTree, grp_compareEntries_Add, (char *)grp, grp_deleteEntry);
104 }
105
freeGrpTree()106 void freeGrpTree()
107 {
108 tree_mung(&groupTree, grp_deleteEntry);
109 }
110
111 /* adds patterns to new group (returns 1) or to existing group (returns 0) */
addPatternToGrpTree(char * grpname,char * patternList)112 int addPatternToGrpTree(char *grpname, char *patternList)
113 {
114 grp_t *g;
115
116 if ((g = findGroupByName(grpname)) == NULL) {
117 g = (grp_t *) scalloc(sizeof(grp_t), 1);
118 g->name = (char *) sstrdup(grpname);
119 g->patternList = (char *) sstrdup(patternList);
120 g->area = scalloc(sizeof(s_area), 1);
121 addGrpToTree(g);
122 return 1;
123 } else {
124 xstrscat(&(g->patternList), " ", patternList, NULLP);
125 return 0;
126 }
127 }
128
129 /*
130 int addPatternListToGrpTree(char *grpname, char *plist)
131 {
132 char *pattern;
133 char *plist_tmp;
134
135 if (!grpname || !plist) return 0;
136
137 plist_tmp = sstrdup(plist);
138 plist = plist_tmp;
139
140 pattern = strtok(plist, " \t,");
141 if (pattern) {
142 addPatternToGrpTree(grpname, pattern);
143 while((pattern = strtok(NULL, " \t,")))
144 addPatternToGrpTree(grpname, pattern);
145 }
146 nfree(plist_tmp);
147 return 1;
148 }
149 */
150
initGroupTree()151 void initGroupTree()
152 {
153 tree_init(&groupTree, 0);
154 }
155
findGroupForArea(char * areaName)156 grp_t *findGroupForArea(char *areaName)
157 {
158 if (!areaName) return 0;
159 return (grp_t *) tree_srch(&groupTree, grp_compareEntries_Search, areaName);
160 }
161
findGroupByName(char * groupName)162 grp_t *findGroupByName(char *groupName)
163 {
164 if (!groupName) return 0;
165 return (grp_t *) tree_srch(&groupTree, grp_compareEntries_SearchByName, groupName);
166 }
167
168 /* DEBUG
169 main(int argc, char **argv)
170 {
171 grp_t *t;
172 initGroupTree();
173 addPatternToGrpTree("SU", "su.* xsu.*");
174 addPatternToGrpTree("humor", "*.HumoR *.prikol humor.*");
175 t = findGroupForArea(argv[1]);
176 if (t)
177 printf("%s\n", t->pattern);
178 else
179 printf("not found\n");
180 freeGrpTree();
181 }
182 */
183