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);
101 printf("%s: failed to allocate memory\n", __func__);
107 void darrayDestroy(darray_t *array)
112 printf("darray: Destroying\n");
117 if (array->inuse != 0x08154711) {
118 printf("darray: double free\n");
123 array_p = &array_start;
124 while (*array_p != array)
125 array_p = &(*array_p)->next;
126 *array_p = array->next;
129 arraysize -= darrayGetSize(array);
132 array->inuse = 0x00000000;
133 free(array->dimension);
138 /* move array content to destination array. the source array is freed */
139 void darrayMove(darray_t *src, darray_t *dst)
141 darray_t **array_p, *temp;
144 printf("darray: Moving\n");
149 if (src->inuse != 0x08154711) {
150 printf("darray: cannot move from already freed array\n");
154 if (dst->inuse != 0x08154711) {
155 printf("darray: cannot move to already freed array\n");
159 array_p = &array_start;
160 while (*array_p != src)
161 array_p = &(*array_p)->next;
162 *array_p = src->next;
163 free(dst->dimension);
165 temp = dst->next; /* preserve dst->next */
166 memcpy(dst, src, sizeof(darray_t));
167 dst->next = temp; /* restore dst->next */
170 arraysize -= darrayGetSize(src);
173 src->inuse = 0x00000000;
177 darray_t *darrayClone(darray_t *array)
182 printf("darray: Cloning\n");
187 if (array->inuse != 0x08154711) {
188 printf("darray: cannot clone already freed array\n");
192 new = _darrayCreate(array->ndimensions, array->dimension, array->file, array->line);
195 memcpy(new->data, array->data, darrayGetSize(array));
200 /* get info about darray */
201 void darrayInfo(const darray_t *array)
204 printf(" darray is NULL\n");
207 if (array->inuse != 0x08154711)
208 printf(" darray was freed before\n");
209 printf(" darray was allocated in file %s, line %d\n", array->file, array->line);
212 for (i = 0; i < array->ndimensions; i++)
213 printf(" Dimension %d: %d\n", i+1, array->dimension[i]);
216 void darrayDone(void)
218 darray_t *array = array_start;
221 printf("darray: Leaking array!\n");
226 printf("darray: maximum memory usage was %lu Mbytes\n", arraysizemax/1024/1024);
232 void darrayCheckList(void)
234 darray_t *array = array_start;
237 if (array->inuse != 0x08154711) {
238 printf("array's list is corrupt. this is the corrupt entry:\n");
247 void darrayCheckPr(const darray_t *array, const double *ptr, int num)
249 if (ptr < array->data) {
250 printf("darrayCheckPr FALED: pointer access before array data\n");
253 if (((unsigned char *)(array->data) + array->size) < ((unsigned char *)ptr + num*sizeof(double))) {
254 printf("darrayCheckPr FALED: pointer access past array data\n");