/* $Id: table.c 295 2005-12-16 19:44:24Z tsaviran $
* -------------------------------------------------------
* Copyright (C) 2002-2005 Tommi Saviranta <wnd@iki.fi>
* (C) 1998-2002 Sebastian Kienzl <zap@riot.org>
* -------------------------------------------------------
* This program 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 of the License, or
* (at your option) any later version.
*
* This program 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.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* ifdef HAVE_CONFIG_H */
#include "etc.h"
#ifdef NEED_TABLE
#include "table.h"
#include "common.h"
#include <stdlib.h>
/* #define DEBUG */
void **
table_add_item(void **data, int elementsize, int *entries, int *indx)
{
int i;
int ind = -1;
for (i = 0; i < *entries; i++) {
if (data[i] == NULL) {
ind = i; /* xfree pointer found */
#ifdef DEBUG
printf("using empty pointer at index %d.\n", ind);
#endif /* ifdef DEBUG */
}
}
if (ind < 0) {
/* Allocate new pointer. */
++(*entries);
data = (void **) xrealloc(data, *entries * sizeof(void *));
ind = *entries - 1;
#ifdef DEBUG
printf("allocating new pointer. %d entries, index %d\n",
*entries, ind);
#endif /* ifdef DEBUG */
}
data[ind] = (void *) xmalloc(elementsize);
*indx = ind;
return data;
} /* void **table_add_item(void **data, int elementsize, int *entries,
int *indx) */
void **
table_compact(void **data, int *entries)
{
#ifdef DEBUG
int x = 0;
#endif /* ifdef DEBUG */
int i = *entries - 1;
while (i >= 0 && data[i] == NULL) { i--; }
i++;
if (*entries != 0 && i == 0) {
xfree(data);
data = NULL;
} else {
data = (void **) xrealloc(data, i * sizeof(void *));
}
*entries = i;
#ifdef DEBUG
printf("reduced %d (size %d)\n", x, *entries);
if (*entries == 0) {
printf("ignore: pointer-array is now empty\n");
}
#endif /* ifdef DEBUG */
return data;
} /* void **table_compact(void **data, int *entries) */
void **
table_rem_item(void **data, int number, int *entries)
{
if (number >= 0 && number < *entries) {
#ifdef DEBUG
printf("deleting entry %d, compacting table: ", number);
#endif /* ifdef DEBUG */
xfree(data[number]);
data[number] = NULL;
}
data = table_compact(data, entries);
return data;
} /* void **table_rem_item(void **data, int number, int *entries) */
void **
table_free(void **data, int *entries, int clear)
{
int i;
for (i = 0; i < *entries; i++) {
xfree(data[i]);
}
xfree(data);
if (clear == 1) {
*entries = 0;
}
return 0;
} /* void **table_free(void **data, int *entries, int clear) */
#endif /* ifdef NEED_TABLE */
syntax highlighted by Code2HTML, v. 0.9.1