#if !defined(DARRAY_H)
#define DARRAY_H
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{char *data;
unsigned items;
unsigned alloc;
unsigned short esize;
unsigned short get;
} darray_t, *darray_ptr;
extern void *Darray_find(darray_t *a,unsigned n);
extern int darray_delete(darray_t *a,unsigned n);
extern void darray_free(darray_t *a);
extern int darray_append(darray_t *p, int ch);
extern void darray_cat(void *da, char *s);
#if defined(__GNUC__)
static __inline__ void darray_init(darray_t *a,unsigned size,unsigned get)
{
a->esize = size;
a->get = get;
a->items = a->alloc = 0;
a->data = NULL;
}
static __inline__ void *darray_find(darray_t *a,unsigned n)
{
if (n < a->alloc && n < a->items)
return (void *) (a->data + n * a->esize);
return Darray_find(a,n);
}
static inline float
darray_float(darray_ptr f0, float f)
{
float *fp = (float *) darray_find(f0, f0->items);
*fp = f;
return f;
}
static inline short
darray_short(darray_ptr f0, short f)
{
short *fp = (short *) darray_find(f0, f0->items);
*fp = f;
return f;
}
#else
extern float darray_float(darray_ptr f0, float f);
extern short darray_short(darray_ptr f0, short f);
#define darray_init(a,sz,gt) \
((a)->esize = (sz), (a)->get = (gt), (a)->items = (a)->alloc = 0, (a)->data = NULL)
#define darray_find(a,n) \
(((n) < (a)->alloc && (n) < (a)->items) \
? (void *) ((a)->data + (n) * (a)->esize) \
: Darray_find(a,n))
#endif
extern int darray_fget(FILE * f, darray_ptr p);
#ifdef __cplusplus
}
#endif
#endif