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