00001
00002
00003
00004
00005 #ifndef ARRAY_H
00006 #define ARRAY_H
00007
00008
00009 #define ARRAY_OUT_OF_MEM -10000
00010
00011
00012
00013
00014
00015
00016
00017
00018 typedef struct array_t {
00019 char *space;
00020 int num;
00021 int n_size;
00022 int obj_size;
00023 int index;
00024 } array_t;
00025
00026 EXTERN array_t *array_do_alloc ARGS((int, int));
00027 EXTERN array_t *array_dup ARGS((array_t *));
00028 EXTERN array_t *array_join ARGS((array_t *, array_t *));
00029 EXTERN void array_free ARGS((array_t *));
00030 EXTERN int array_append ARGS((array_t *, array_t *));
00031 EXTERN void array_sort ARGS((array_t *, int (*)(const void *, const void *)));
00032 EXTERN void array_uniq ARGS((array_t *, int (*)(char **, char **), void (*)(char *)));
00033 EXTERN int array_abort ARGS((array_t *, int));
00034 EXTERN int array_resize ARGS((array_t *, int));
00035 EXTERN char *array_do_data ARGS((array_t *));
00036
00037 extern int unsigned array_global_index;
00038 extern int array_global_insert;
00039
00040 #define array_alloc(type, number) \
00041 array_do_alloc(sizeof(type), number)
00042
00043 #define array_insert(type, a, i, datum) \
00044 ( -(a)->index != sizeof(type) ? array_abort((a),4) : 0,\
00045 (a)->index = (i),\
00046 (a)->index < 0 ? array_abort((a),0) : 0,\
00047 (a)->index >= (a)->n_size ?\
00048 array_global_insert = array_resize(a, (a)->index + 1) : 0,\
00049 array_global_insert != ARRAY_OUT_OF_MEM ?\
00050 *((type *) ((a)->space + (a)->index * (a)->obj_size)) = datum : datum,\
00051 array_global_insert != ARRAY_OUT_OF_MEM ?\
00052 ((a)->index >= (a)->num ? (a)->num = (a)->index + 1 : 0) : 0,\
00053 array_global_insert != ARRAY_OUT_OF_MEM ?\
00054 ((a)->index = -(int)sizeof(type)) : ARRAY_OUT_OF_MEM )
00055
00056 #define array_insert_last(type, array, datum) \
00057 array_insert(type, array, (array)->num, datum)
00058
00059
00060 #define array_remove_last(a) \
00061 ( -(a)->index != (a)->obj_size ? array_abort((a),4) : 0,\
00062 (a)->index = -(a)->index,\
00063 (a)->num ? (a)->num-- : array_abort((a),5),\
00064 (a)->index = -(a)->index )
00065
00066 #define array_fetch(type, a, i) \
00067 (array_global_index = (i), \
00068 (array_global_index >= (unsigned) ((a)->num)) ? array_abort((a),1) : 0,\
00069 *((type *) ((a)->space + array_global_index * (a)->obj_size)))
00070
00071 #define array_fetch_p(type, a, i) \
00072 (array_global_index = (i), \
00073 (array_global_index >= (unsigned) ((a)->num)) ? array_abort((a),1) : 0,\
00074 ((type *) ((a)->space + array_global_index * (a)->obj_size)))
00075
00076 #define array_fetch_last(type, array) \
00077 array_fetch(type, array, ((array)->num)-1)
00078
00079 #define array_n(array) \
00080 (array)->num
00081
00082 #define array_data(type, array) \
00083 (type *) array_do_data(array)
00084
00085 #define arrayForEachItem( \
00086 type, \
00087 array, \
00088 i, \
00089 data \
00090 ) \
00091 for((i) = 0; \
00092 (((i) < array_n((array))) \
00093 && (((data) = array_fetch(type, (array), (i))), 1)); \
00094 (i)++)
00095
00096 #endif
00097
00098
00099
00100
00101
00102