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