src/array/array.c File Reference
#include <stdio.h>
#include "util.h"
#include "array.h"
Go to the source code of this file.
Defines |
#define | INIT_SIZE 3 |
Functions |
array_t * | array_do_alloc (int size, int number) |
void | array_free (array_t *array) |
array_t * | array_dup (array_t *old) |
int | array_append (array_t *array1, array_t *array2) |
array_t * | array_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
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:
00208 fprintf(stderr,"insert of %d\n",a->index);
00209 break;
00210
00211 case 1:
00212 fprintf(stderr,"fetch index %d not in [0,%d]\n",
00213 array_global_index,a->num-1);
00214 break;
00215
00216 case 2:
00217 fprintf(stderr,"append undefined for arrays of different sizes\n");
00218 break;
00219
00220 case 3:
00221 fprintf(stderr,"join not defined for arrays of different sizes\n");
00222 break;
00223
00224 case 4:
00225 if (a->index >= 0) {
00226
00227
00228
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:
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;
00244 }
array_t* array_do_alloc |
( |
int |
size, |
|
|
int |
number | |
|
) |
| | |
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 }
void array_free |
( |
array_t * |
array |
) |
|
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
00149
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 | |
|
) |
| | |
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