This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-mbse/mbfido/grlist.c
2005-08-28 14:52:14 +00:00

140 lines
2.8 KiB
C

/*****************************************************************************
*
* $Id$
* Purpose ...............: Announce new files and FileFind
*
*****************************************************************************
* Copyright (C) 1997-2005
*
* Michiel Broek FIDO: 2:2801/16
* Beekmansbos 10 Internet: mbroek@ux123.pttnwb.nl
* 1971 BV IJmuiden
* the Netherlands
*
* This file is part of MBSE BBS.
*
* This BBS 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.
*
* MBSE BBS 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 MBSE BBS; see the file COPYING. If not, write to the Free
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*****************************************************************************/
#include "../config.h"
#include "../lib/mbselib.h"
#include "grlist.h"
/*
* Tidy the groupnames array
*/
void tidy_grlist(gr_list ** fdp)
{
gr_list *tmp, *old;
for (tmp = *fdp; tmp; tmp = old) {
old = tmp->next;
free(tmp);
}
*fdp = NULL;
}
/*
* Add a group to the array
*/
void fill_grlist(gr_list **fdp, char *groupname, char *echoname)
{
gr_list *tmp;
/*
* Count files in group if the group already exists.
*/
if (*fdp != NULL) {
for (tmp = *fdp; tmp; tmp = tmp->next)
if ((strcmp(groupname, tmp->group) == 0) &&
(strcmp(echoname, tmp->echo) == 0)) {
tmp->count++;
return;
}
}
/*
* Add a new group
*/
tmp = (gr_list *)malloc(sizeof(gr_list));
tmp->next = *fdp;
snprintf(tmp->group, 13, "%s", groupname);
snprintf(tmp->echo, 21, "%s", echoname);
tmp->count = 1;
*fdp = tmp;
}
int compgroup(gr_list **, gr_list **);
/*
* Sort the array of groups
*/
void sort_grlist(gr_list **fdp)
{
gr_list *ta, **vector;
size_t n = 0, i;
if (*fdp == NULL)
return;
for (ta = *fdp; ta; ta = ta->next)
n++;
vector = (gr_list **)malloc(n * sizeof(gr_list *));
i = 0;
for (ta = *fdp; ta; ta = ta->next) {
vector[i++] = ta;
}
qsort(vector, n, sizeof(gr_list*), (int(*)(const void*, const void*))compgroup);
(*fdp) = vector[0];
i = 1;
for (ta = *fdp; ta; ta = ta->next) {
if (i < n)
ta->next = vector[i++];
else
ta->next = NULL;
}
free(vector);
return;
}
int compgroup(gr_list **fdp1, gr_list **fdp2)
{
int rc;
rc = strcmp((*fdp1)->group, (*fdp2)->group);
if (rc != 0)
return rc;
return strcmp((*fdp1)->echo, (*fdp2)->echo);
}