1 /* Littlewood-Richardson Calculator 2 * Copyright (C) 1999- Anders S. Buch (asbuch at math rutgers edu) 3 * See the file LICENSE for license information. 4 */ 5 6 /* This module replaces alloc.c when lrcalc is linked programs that 7 * require lrcalc functions to free up memory and return in case of 8 * an out-of-memory event. 9 */ 10 11 #include <stdlib.h> 12 #include <stdio.h> 13 #include <string.h> 14 15 #include "alloc.h" 16 jmp_buf lrcalc_panic_frame; 17 18 typedef struct mlink { 19 struct mlink *next; 20 struct mlink *prev; 21 } mlink; 22 23 mlink root; 24 panic()25void panic() 26 { 27 mlink *link, *link0; 28 link = root.next; 29 while (link) 30 { 31 link0 = link; 32 link = link->next; 33 free(link0); 34 } 35 root.next = NULL; 36 root.prev = NULL; 37 longjmp(lrcalc_panic_frame, 1); 38 } 39 amalloc(size_t size)40void *amalloc(size_t size) 41 { 42 mlink *p = malloc(size + sizeof(mlink)); 43 if (p == NULL) 44 panic(); 45 p->next = root.next; 46 p->prev = &root; 47 root.next = p; 48 if (p->next) 49 p->next->prev = p; 50 return ((void *)p) + sizeof(mlink); 51 } 52 acalloc(size_t size,size_t num)53void *acalloc(size_t size, size_t num) 54 { 55 mlink *p = calloc(size*num + sizeof(mlink), 1); 56 if (p == NULL) 57 panic(); 58 p->next = root.next; 59 p->prev = &root; 60 root.next = p; 61 if (p->next) 62 p->next->prev = p; 63 return ((void *)p) + sizeof(mlink); 64 } 65 arealloc(void * pp,size_t size)66void *arealloc(void *pp, size_t size) 67 { 68 mlink *p = (mlink *) (pp - sizeof(mlink)); 69 p->prev->next = p->next; 70 if (p->next) 71 p->next->prev = p->prev; 72 p = realloc(p, size + sizeof(mlink)); 73 if (p == NULL) 74 { 75 free(p); 76 panic(); 77 } 78 p->next = root.next; 79 p->prev = &root; 80 root.next = p; 81 if (p->next) 82 p->next->prev = p; 83 return ((void *)p) + sizeof(mlink); 84 } 85 afree(void * pp)86void afree(void *pp) 87 { 88 mlink *p = (mlink *) (pp - sizeof(mlink)); 89 p->prev->next = p->next; 90 if (p->next) 91 p->next->prev = p->prev; 92 free(p); 93 } 94 95