15 * <binary data of array, if any>
22 unsigned long arraysize = 0, arraysizemax = 0;
25 printf("darray: %d arrays (%lu bytes/%lu Mbytes) exist\n", arraycount, arraysize, arraysize/1024/1024); \
26 if (arraycount < 0) { \
27 printf("darray error: more arrays freed than allocated\n"); \
30 if (arraysize < 0) { \
31 printf("darray error: more array data freed than allocated\n"); \
37 static darray_t *array_start = NULL;
39 unsigned long darrayGetSize(const darray_t *array)
41 unsigned long size = sizeof(double), i;
43 for (i = 0; i < array->ndimensions; i++)
44 size *= array->dimension[i];
50 darray_t *_darrayCreate(int ndimensions, int *dimension, const char *file, int line)
55 array = (darray_t *)malloc(sizeof(darray_t));
60 array->ndimensions = ndimensions;
61 array->inuse = 0x00000000;
63 array->dimension = (int *)malloc(ndimensions * sizeof(int));
64 if (!array->dimension) {
68 memcpy(array->dimension, dimension, ndimensions * sizeof(int));
70 size = darrayGetSize(array);
72 array->data = (double *)malloc(size);
74 free(array->dimension);
78 memset(array->data, 0, size);
82 array->next = array_start;
84 array->inuse = 0x08154711;
86 printf("darray: Creating\n");
89 arraysize += darrayGetSize(array);
90 if (arraysize > arraysizemax)
91 arraysizemax = arraysize;
98 printf("darray: No memory to allocate (used %lu Mbytes)\n", arraysize/1024/1024);
105 void darrayDestroy(darray_t *array)
110 printf("darray: Destroying\n");
115 if (array->inuse != 0x08154711) {
116 printf("darray: double free\n");
121 array_p = &array_start;
122 while (*array_p != array)
123 array_p = &(*array_p)->next;
124 *array_p = array->next;
127 arraysize -= darrayGetSize(array);
130 array->inuse = 0x00000000;
131 free(array->dimension);
136 /* move array content to destination array. the source array is freed */
137 void darrayMove(darray_t *src, darray_t *dst)
139 darray_t **array_p, *temp;
142 printf("darray: Moving\n");
147 if (src->inuse != 0x08154711) {
148 printf("darray: cannot move from already freed array\n");
152 if (dst->inuse != 0x08154711) {
153 printf("darray: cannot move to already freed array\n");
157 array_p = &array_start;
158 while (*array_p != src)
159 array_p = &(*array_p)->next;
160 *array_p = src->next;
161 free(dst->dimension);
163 temp = dst->next; /* preserve dst->next */
164 memcpy(dst, src, sizeof(darray_t));
165 dst->next = temp; /* restore dst->next */
168 arraysize -= darrayGetSize(src);
171 src->inuse = 0x00000000;
175 darray_t *darrayClone(darray_t *array)
180 printf("darray: Cloning\n");
185 if (array->inuse != 0x08154711) {
186 printf("darray: cannot clone already freed array\n");
190 new = _darrayCreate(array->ndimensions, array->dimension, array->file, array->line);
193 memcpy(new->data, array->data, darrayGetSize(array));
198 /* get info about darray */
199 void darrayInfo(const darray_t *array)
202 printf(" darray is NULL\n");
205 if (array->inuse != 0x08154711)
206 printf(" darray was freed before\n");
207 printf(" darray was allocated in file %s, line %d\n", array->file, array->line);
210 for (i = 0; i < array->ndimensions; i++)
211 printf(" Dimension %d: %d\n", i+1, array->dimension[i]);
214 void darrayDone(void)
216 darray_t *array = array_start;
219 printf("darray: Leaking array!\n");
224 printf("darray: maximum memory usage was %lu Mbytes\n", arraysizemax/1024/1024);
230 void darrayCheckList(void)
232 darray_t *array = array_start;
235 if (array->inuse != 0x08154711) {
236 printf("array's list is corrupt. this is the corrupt entry:\n");
245 void darrayCheckPr(const darray_t *array, const double *ptr, int num)
247 if (ptr < array->data) {
248 printf("darrayCheckPr FALED: pointer access before array data\n");
251 if (((unsigned char *)(array->data) + array->size) < ((unsigned char *)ptr + num*sizeof(double))) {
252 printf("darrayCheckPr FALED: pointer access past array data\n");