src/array/array.c File Reference

#include <stdio.h>
#include "util.h"
#include "array.h"
Include dependency graph for array.c:

Go to the source code of this file.

Defines

#define INIT_SIZE   3

Functions

array_tarray_do_alloc (int size, int number)
void array_free (array_t *array)
array_tarray_dup (array_t *old)
int array_append (array_t *array1, array_t *array2)
array_tarray_join (array_t *array1, array_t *array2)
char * array_do_data (array_t *array)
int array_resize (array_t *array, int new_size)
void array_sort (array_t *array, int(*compare)(const void *, const void *))
void array_uniq (array_t *array, int(*compare)(char **, char **), void(*free_func)(char *))
int array_abort (array_t *a, int i)

Variables

int unsigned array_global_index
int array_global_insert

Define Documentation

#define INIT_SIZE   3

Definition at line 11 of file array.c.


Function Documentation

int array_abort ( array_t a,
int  i 
)

Definition at line 201 of file array.c.

00202 {
00203     fputs("array: ",stderr);
00204 
00205     switch (i) {
00206 
00207       case 0:           /* index error on insert */
00208         fprintf(stderr,"insert of %d\n",a->index);
00209         break;
00210 
00211       case 1:           /* index error on fetch */
00212         fprintf(stderr,"fetch index %d not in [0,%d]\n",
00213                 array_global_index,a->num-1);
00214         break;
00215 
00216       case 2:           /* append with different element sizes */
00217         fprintf(stderr,"append undefined for arrays of different sizes\n");
00218         break;
00219 
00220       case 3:           /* join with different element sizes */
00221         fprintf(stderr,"join not defined for arrays of different sizes\n");
00222         break;
00223 
00224       case 4:           /* size error or locked error */
00225         if (a->index >= 0) {
00226             /* Since array_insert is a macro, it is not allowed to nest a
00227                call to any routine which might move the array space through
00228                a realloc or free inside an array_insert call. */
00229             fprintf(stderr,"nested insert, append, remove, or free operations\n");
00230         } else {
00231             fprintf(stderr,"object size mismatch\n");
00232         }
00233         break;
00234     case 5: /* attempt to remove last item from empty array */
00235       fprintf(stderr, "attempt to remove from empty array");
00236       break;
00237     default:
00238         fputs("unknown error\n", stderr);
00239         break;
00240     }
00241 
00242     fail("array package error");
00243     return 0;  /* never reached */
00244 }

int array_append ( array_t array1,
array_t array2 
)

Definition at line 73 of file array.c.

00074 {
00075     char *pos;
00076 
00077     if (array1->index >= 0) array_abort(array1,4);
00078     if (array1->obj_size != array2->obj_size) {
00079         array_abort(array1,2);
00080         /* NOTREACHED */
00081     }
00082 
00083     /* make sure array1 has enough room */
00084     if (array1->n_size < array1->num + array2->num) {
00085         if (array_resize(array1, array1->num + array2->num) == ARRAY_OUT_OF_MEM) {
00086             return ARRAY_OUT_OF_MEM;
00087         }
00088     }
00089     pos = array1->space + array1->num * array1->obj_size;
00090     (void) memcpy(pos, array2->space, array2->num * array2->obj_size);
00091     array1->num += array2->num;
00092 
00093     return 1;
00094 }

array_t* array_do_alloc ( int  size,
int  number 
)

Definition at line 17 of file array.c.

00018 {
00019     array_t *array;
00020 
00021     array = ALLOC(array_t, 1);
00022     if (array == NIL(array_t)) {
00023         return NIL(array_t);
00024     }
00025     array->num = 0;
00026     array->n_size = MAX(number, INIT_SIZE);
00027     array->obj_size = size;
00028     array->index = -size;
00029     array->space = ALLOC(char, array->n_size * array->obj_size);
00030     if (array->space == NIL(char)) {
00031         return NIL(array_t);
00032     }
00033     (void) memset(array->space, 0, array->n_size * array->obj_size);
00034     return array;
00035 }

char* array_do_data ( array_t array  ) 

Definition at line 129 of file array.c.

00130 {
00131     char *data;
00132 
00133     data = ALLOC(char, array->num * array->obj_size);
00134     if (data == NIL(char)) {
00135         return NIL(char);
00136     }
00137     (void) memcpy(data, array->space, array->num * array->obj_size);
00138     return data;
00139 }

array_t* array_dup ( array_t old  ) 

Definition at line 49 of file array.c.

00050 {
00051     array_t *newa;
00052 
00053     newa = ALLOC(array_t, 1);
00054     if (newa == NIL(array_t)) {
00055         return NIL(array_t);
00056     }
00057     newa->num = old->num;
00058     newa->n_size = old->num;
00059     newa->obj_size = old->obj_size;
00060     newa->index = -newa->obj_size;
00061     newa->space = ALLOC(char, newa->n_size * newa->obj_size);
00062     if (newa->space == NIL(char)) {
00063         FREE(newa);
00064         return NIL(array_t);
00065     }
00066     (void) memcpy(newa->space, old->space, old->num * old->obj_size);
00067     return newa;
00068 }

void array_free ( array_t array  ) 

Definition at line 39 of file array.c.

00040 {
00041     if (array == NIL(array_t)) return;
00042     if (array->index >= 0) array_abort(array,4);
00043     FREE(array->space);
00044     FREE(array);
00045 }

array_t* array_join ( array_t array1,
array_t array2 
)

Definition at line 99 of file array.c.

00100 {
00101     array_t *array;
00102     char *pos;
00103 
00104     if (array1->obj_size != array2->obj_size) {
00105         array_abort(array1,3);
00106         fail("array: join not defined for arrays of different sizes\n");
00107         /* NOTREACHED */
00108     }
00109     array = ALLOC(array_t, 1);
00110     if (array == NIL(array_t)) {
00111         return NIL(array_t);
00112     }
00113     array->num = array1->num + array2->num;
00114     array->n_size = array->num;
00115     array->obj_size = array1->obj_size;
00116     array->index = -array->obj_size;
00117     array->space = ALLOC(char, array->n_size * array->obj_size);
00118     if (array->space == NIL(char)) {
00119         FREE(array);
00120         return NIL(array_t);
00121     }
00122     (void) memcpy(array->space, array1->space, array1->num * array1->obj_size);
00123     pos = array->space + array1->num * array1->obj_size;
00124     (void) memcpy(pos, array2->space, array2->num * array2->obj_size);
00125     return array;
00126 }

int array_resize ( array_t array,
int  new_size 
)

Definition at line 143 of file array.c.

00144 {
00145     int old_size;
00146     char *pos, *newspace;
00147 
00148     /* Note that this is not an exported function, and does not check if
00149        the array is locked since that is already done by the caller. */
00150     old_size = array->n_size;
00151     array->n_size = MAX(array->n_size * 2, new_size);
00152     newspace = REALLOC(char, array->space, array->n_size * array->obj_size);
00153     if (newspace == NIL(char)) {
00154         array->n_size = old_size;
00155         return ARRAY_OUT_OF_MEM;
00156     } else {
00157         array->space = newspace;
00158     }
00159     pos = array->space + old_size * array->obj_size;
00160     (void) memset(pos, 0, (array->n_size - old_size)*array->obj_size);
00161     return 1;
00162 }

void array_sort ( array_t array,
int(*)(const void *, const void *)  compare 
)

Definition at line 165 of file array.c.

00166 {
00167     qsort((void *)array->space, array->num, array->obj_size, compare);
00168 }

void array_uniq ( array_t array,
int(*)(char **, char **)  compare,
void(*)(char *)  free_func 
)

Definition at line 172 of file array.c.

00173 {
00174     int i, last;
00175     char *dest, *obj1, *obj2;
00176 
00177     dest = array->space;
00178     obj1 = array->space;
00179     obj2 = array->space + array->obj_size;
00180     last = array->num;
00181 
00182     for(i = 1; i < last; i++) {
00183         if ((*compare)((char **) obj1, (char **) obj2) != 0) {
00184             if (dest != obj1) {
00185                 (void) memcpy(dest, obj1, array->obj_size);
00186             }
00187             dest += array->obj_size;
00188         } else {
00189             if (free_func != 0) (*free_func)(obj1);
00190             array->num--;
00191         }
00192         obj1 += array->obj_size;
00193         obj2 += array->obj_size;
00194     }
00195     if (dest != obj1) {
00196         (void) memcpy(dest, obj1, array->obj_size);
00197     }
00198 }


Variable Documentation

int unsigned array_global_index

Definition at line 13 of file array.c.

Definition at line 14 of file array.c.


Generated on Tue Jan 12 13:57:08 2010 for glu-2.2 by  doxygen 1.6.1