diff options
Diffstat (limited to 'kstars/kstars/indi/fli/libfli-mem.c')
-rw-r--r-- | kstars/kstars/indi/fli/libfli-mem.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/kstars/kstars/indi/fli/libfli-mem.c b/kstars/kstars/indi/fli/libfli-mem.c new file mode 100644 index 00000000..f6bee1bc --- /dev/null +++ b/kstars/kstars/indi/fli/libfli-mem.c @@ -0,0 +1,203 @@ +/* + + Copyright (c) 2000, 2002 Finger Lakes Instrumentation (FLI), L.L.C. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + + Neither the name of Finger Lakes Instrumentation (FLI), LLC + nor the names of its contributors may be used to endorse or + promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + ====================================================================== + + Finger Lakes Instrumentation, L.L.C. (FLI) + web: http://www.fli-cam.com + email: support@fli-cam.com + +*/ + +#include <stdlib.h> +#include <string.h> + +#include "libfli-libfli.h" +#include "libfli-mem.h" + +#define DEFAULT_NUM_POINTERS (1024) + +static struct { + void **pointers; + int total; + int used; +} allocated = {NULL, 0, 0}; + +void *xmalloc(size_t size) +{ + int i; + void *ptr; + + if (allocated.used + 1 > allocated.total) + { + void **tmp; + int num; + + num = (allocated.total == 0 ? DEFAULT_NUM_POINTERS : 2 * allocated.total); + + if ((tmp = (void **)realloc(allocated.pointers, + num * sizeof(void **))) == NULL) + return NULL; + + allocated.pointers = tmp; + memset(&allocated.pointers[allocated.total], 0, num * sizeof(void **)); + allocated.total += num; + } + + if ((ptr = malloc(size)) == NULL) + return NULL; + + for (i = 0; i < allocated.total; i++) + { + if (allocated.pointers[i] == NULL) + break; + } + + if (i == allocated.total) + { + /* This shouldn't happen */ + debug(FLIDEBUG_WARN, "Internal memory allocation error"); + free(ptr); + + return NULL; + } + + allocated.pointers[i] = ptr; + allocated.used++; + + return ptr; +} + + +void *xcalloc(size_t nmemb, size_t size) +{ + void *ptr; + + if ((ptr = xmalloc(nmemb * size)) == NULL) + return NULL; + + memset(ptr, 0, nmemb * size); + + return ptr; +} + +void xfree(void *ptr) +{ + int i; + + for (i = 0; i < allocated.total; i++) + { + if (allocated.pointers[i] == ptr) + { + free(ptr); + allocated.pointers[i] = NULL; + allocated.used--; + + return; + } + } + + debug(FLIDEBUG_WARN, "Attempting to free an invalid pointer"); + + return; +} + +void *xrealloc(void *ptr, size_t size) +{ + int i; + + for (i = 0; i < allocated.total; i++) + { + if (allocated.pointers[i] == ptr) + { + void *tmp; + + if ((tmp = realloc(ptr, size)) == NULL) + return NULL; + + allocated.pointers[i] = tmp; + + return tmp; + } + } + + debug(FLIDEBUG_WARN, "Attempting to realloc an invalid pointer"); + + return NULL; +} + +int xfree_all(void) +{ + int i; + int freed = 0; + + for (i = 0; i < allocated.total; i++) + { + if (allocated.pointers[i] != NULL) + { + free(allocated.pointers[i]); + allocated.pointers[i] = NULL; + allocated.used--; + freed++; + } + } + + if (allocated.used != 0) + debug(FLIDEBUG_WARN, "Internal memory handling error"); + + if (allocated.pointers != NULL) + free(allocated.pointers); + + allocated.pointers = NULL; + allocated.used = 0; + allocated.total = 0; + + return freed; +} + +char *xstrdup(const char *s) +{ + void *tmp; + size_t len; + + len = strlen(s) + 1; + + if ((tmp = xmalloc(len)) == NULL) + return NULL; + + memcpy(tmp, s, len); + + return tmp; +} |