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()25 void 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)40 void *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)53 void *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)66 void *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)86 void 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