/* $Id: table.c 295 2005-12-16 19:44:24Z tsaviran $ * ------------------------------------------------------- * Copyright (C) 2002-2005 Tommi Saviranta * (C) 1998-2002 Sebastian Kienzl * ------------------------------------------------------- * 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 #endif /* ifdef HAVE_CONFIG_H */ #include "etc.h" #ifdef NEED_TABLE #include "table.h" #include "common.h" #include /* #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 */