/****************************************************************************** * FIDOCONFIG --- library for fidonet configs ****************************************************************************** * areatree.c : some functions to make search areas by names faster * * by Max Chernogor , 2:464/108@fidonet * * This file is part of FIDOCONFIG library (part of the Husky FIDOnet * software project) * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * FIDOCONFIG library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FIDOCONFIG library; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA * * See also http://www.gnu.org ***************************************************************************** * $Id: areatree.c,v 1.13.2.1 2003/12/27 21:15:47 d_sergienko Exp $ */ #include #include "areatree.h" static tree* echoAreaTree = NULL; static tree* fileAreaTree = NULL; static ps_filearea fileAreaPtr = NULL; static ps_area echoAreaPtr = NULL; int fc_compareEntries(char *p_e1, char *p_e2) { ps_area e1 = (ps_area)p_e1; ps_area e2 = (ps_area)p_e2; if(stricmp(e1->areaName,e2->areaName) < 0) return -1; else if(stricmp(e1->areaName,e2->areaName) > 0) return 1; return 0; } int fc_compareFEntries(char *p_e1, char *p_e2) { ps_filearea e1 = (ps_filearea)p_e1; ps_filearea e2 = (ps_filearea)p_e2; if(stricmp(e1->areaName,e2->areaName) < 0) return -1; else if(stricmp(e1->areaName,e2->areaName) > 0) return 1; return 0; } int fc_deleteEntry(char *p_e1) { /* ugly hack to prevent compiler warnings */ p_e1 = p_e1; return 1; } int addAreaToTree(ps_area areaPtr) { return tree_add(&echoAreaTree, fc_compareEntries, (char *)areaPtr, fc_deleteEntry); } int addFileAreaToTree(ps_filearea areaPtr) { return tree_add(&fileAreaTree, fc_compareEntries, (char *)areaPtr, fc_deleteEntry); } ps_area FindAreaInTree(char* areaName) { static s_area areaSrc; if(echoAreaPtr && stricmp(echoAreaPtr->areaName,areaName) == 0) return echoAreaPtr; else areaSrc.areaName = areaName; echoAreaPtr = (ps_area)tree_srch(&echoAreaTree, fc_compareEntries, (char *)(&areaSrc)); return echoAreaPtr; } ps_filearea FindFileAreaInTree(char* areaName) { static s_filearea areaSrc; if(fileAreaPtr && stricmp(fileAreaPtr->areaName,areaName) == 0) return fileAreaPtr; else areaSrc.areaName = areaName; fileAreaPtr = (ps_filearea)tree_srch(&fileAreaTree, fc_compareFEntries, (char *)(&areaSrc)); return fileAreaPtr; } int RebuildEchoAreaTree(ps_fidoconfig config) { unsigned int i = 0; if (echoAreaTree) tree_mung(&echoAreaTree, fc_deleteEntry); tree_init(&echoAreaTree, 1); for (i=0; i < config->echoAreaCount; i++) { if ( addAreaToTree(&(config->echoAreas[i])) == 0 ) { fprintf(stderr, "\nArea [%s] defined twice\n",config->echoAreas[i].areaName ); return 0; } } for (i=0; i < config->localAreaCount; i++) { if ( addAreaToTree(&(config->localAreas[i])) == 0 ) { fprintf(stderr, "\nArea [%s] defined twice\n",config->localAreas[i].areaName ); return 0; } } echoAreaPtr = NULL; return 1; } int RebuildFileAreaTree(ps_fidoconfig config) { unsigned int i = 0; if (fileAreaTree) tree_mung(&fileAreaTree, fc_deleteEntry); tree_init(&fileAreaTree, 1); for (i=0; i < config->fileAreaCount; i++) { if ( addFileAreaToTree(&(config->fileAreas[i])) == 0 ) { fprintf(stderr, "\nFileArea [%s] defined twice\n",config->fileAreas[i].areaName ); return 0; } } fileAreaPtr = NULL; return 1; } void FreeAreaTree() { tree_mung(&echoAreaTree, fc_deleteEntry); tree_mung(&fileAreaTree, fc_deleteEntry); }