/******************************************************************************
 * FIDOCONFIG --- library for fidonet configs
 ******************************************************************************
 * areatree.c : some functions to make search areas by names faster
 *
 * by Max Chernogor <mihz@mail.ru>, 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 <string.h>
#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);
}
