1 /******************************************************************************
2 * FIDOCONFIG --- library for fidonet configs
3 ******************************************************************************
4 * areatree.c : some functions to make search areas by names faster
5 *
6 * by Max Chernogor <mihz@mail.ru>, 2:464/108@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 "fidoconf.h"
42 #include "areatree.h"
43
44 static tree* echoAreaTree = NULL;
45 static tree* fileAreaTree = NULL;
46
47 static ps_area fileAreaPtr = NULL;
48 static ps_area echoAreaPtr = NULL;
49
50
51
fc_compareEntries(char * p_e1,char * p_e2)52 int fc_compareEntries(char *p_e1, char *p_e2)
53 {
54 ps_area e1 = (ps_area)p_e1;
55 ps_area e2 = (ps_area)p_e2;
56 if(stricmp(e1->areaName,e2->areaName) < 0)
57 return -1;
58 else if(stricmp(e1->areaName,e2->areaName) > 0)
59 return 1;
60 return 0;
61 }
62
fc_deleteEntry(char * p_e1)63 int fc_deleteEntry(char *p_e1) {
64
65 unused(p_e1);
66
67 return 1;
68 }
69
70
FindAreaInTree(char * areaName)71 ps_area FindAreaInTree(char* areaName)
72 {
73 static s_area areaSrc;
74
75 if(!areaName) return NULL;
76 if(echoAreaPtr && stricmp(echoAreaPtr->areaName,areaName) == 0)
77 return echoAreaPtr;
78 else
79 areaSrc.areaName = areaName;
80 echoAreaPtr = (ps_area)tree_srch(&echoAreaTree, fc_compareEntries, (char *)(&areaSrc));
81 return echoAreaPtr;
82 }
83
FindFileAreaInTree(char * areaName)84 ps_area FindFileAreaInTree(char* areaName)
85 {
86 static s_area areaSrc;
87 if(fileAreaPtr && stricmp(fileAreaPtr->areaName,areaName) == 0)
88 return fileAreaPtr;
89 else
90 areaSrc.areaName = areaName;
91 fileAreaPtr = (ps_area)tree_srch(&fileAreaTree, fc_compareEntries, (char *)(&areaSrc));
92 return fileAreaPtr;
93 }
94
95
RebuildEchoAreaTree(ps_fidoconfig config)96 int RebuildEchoAreaTree(ps_fidoconfig config)
97 {
98 unsigned int i = 0;
99
100 if (echoAreaTree)
101 tree_mung(&echoAreaTree, fc_deleteEntry);
102 tree_init(&echoAreaTree, 1);
103
104 for (i=0; i < config->echoAreaCount; i++)
105 {
106 if ( tree_add(&echoAreaTree, fc_compareEntries, (char *)(&(config->echoAreas[i])), fc_deleteEntry ) == 0 )
107 {
108 fprintf(stderr, "\nArea [%s] defined twice\n",config->echoAreas[i].areaName );
109 return 0;
110 }
111 }
112 for (i=0; i < config->localAreaCount; i++)
113 {
114 if ( tree_add(&echoAreaTree, fc_compareEntries, (char *)(&(config->localAreas[i])), fc_deleteEntry ) == 0 )
115 {
116 fprintf(stderr, "\nArea [%s] defined twice\n",config->localAreas[i].areaName );
117 return 0;
118 }
119 }
120 echoAreaPtr = NULL;
121 return 1;
122 }
123
124
RebuildFileAreaTree(ps_fidoconfig config)125 int RebuildFileAreaTree(ps_fidoconfig config)
126 {
127 unsigned int i = 0;
128
129 if (fileAreaTree)
130 tree_mung(&fileAreaTree, fc_deleteEntry);
131 tree_init(&fileAreaTree, 1);
132
133 for (i=0; i < config->fileAreaCount; i++)
134 {
135 if ( tree_add(&fileAreaTree, fc_compareEntries, (char *)(&(config->fileAreas[i])), fc_deleteEntry) == 0 )
136 {
137 fprintf(stderr, "\nFileArea [%s] defined twice\n",config->fileAreas[i].areaName );
138 return 0;
139 }
140 }
141 fileAreaPtr = NULL;
142 return 1;
143 }
144
145
FreeAreaTree()146 void FreeAreaTree()
147 {
148 tree_mung(&echoAreaTree, fc_deleteEntry);
149 tree_mung(&fileAreaTree, fc_deleteEntry);
150 }
151