blob: 84ca21c5b311babb219dd10e0be4f2af9d68faba [file] [log] [blame]
/*
Copyright 2002-2003 John Plevyak, All Rights Reserved
*/
#define INITIAL_SET_SIZE_INDEX 2
#define INITIAL_VEC_SHIFT 3
#define INITIAL_VEC_SIZE (1 << INITIAL_VEC_SHIFT)
#define INITIAL_VEC_SIZE (1 << INITIAL_VEC_SHIFT)
#define INTEGRAL_VEC_SIZE 3
#define INTEGRAL_STACK_SIZE 8
#define TRICK_VEC_SIZE (INITIAL_VEC_SIZE - INTEGRAL_VEC_ELEMENTS)
#define SET_MAX_SEQUENTIAL 5
#define IS_BIT_SET(_v, _s) ((_v)[(_s) / 8] & 1 << ((_s) % 8))
#define SET_BIT(_v, _s) (_v)[(_s) / 8] |= (1 << ((_s) %8))
typedef struct AbstractVec {
uint n;
uint i; /* size index for use with sets */
void **v;
void *e[INTEGRAL_VEC_SIZE];
} AbstractVec;
#define Vec(_x) struct { \
uint n; \
uint i; \
_x *v; \
_x e[INTEGRAL_VEC_SIZE]; \
}
typedef struct AbstractStack {
void **start;
void **end;
void **cur;
void *initial[INTEGRAL_STACK_SIZE];
} AbstractStack;
#define Stack(_x) struct { \
_x *start; _x *end; _x *cur; _x initial[INTEGRAL_STACK_SIZE]; \
}
#define vec_move(_a, _b) do { \
(_a)->n = (_b)->n; \
if ((_b)->v == (_b)->e) { \
memcpy(&(_a)->e[0], &(_b)->e[0], sizeof((_a)->e)); \
(_a)->v = (_a)->e; \
} else (_a)->v = (_b)->v; \
vec_clear(_b); \
} while (0)
struct hash_fns_t;
typedef uint32 (*hash_fn_t)(void *, struct hash_fns_t*);
typedef int (*cmp_fn_t)(void *, void *, struct hash_fns_t*);
typedef struct hash_fns_t {
hash_fn_t hash_fn;
cmp_fn_t cmp_fn;
void *data[2];
} hash_fns_t;
#define vec_add(_v, _i) do { \
if (!(_v)->v) { \
((_v)->v = (_v)->e)[(_v)->n++] = (_i); \
break; \
} else if ((_v)->v == ((_v)->e)) { \
if (((_v)->n < INTEGRAL_VEC_SIZE)) { \
(_v)->v[(_v)->n++] = (_i); \
break; \
} \
} else if ((_v)->n & (INITIAL_VEC_SIZE - 1)) { \
(_v)->v[(_v)->n++] = (_i); \
break; \
} \
vec_add_internal((_v), _i); \
} while (0)
void vec_add_internal(void *v, void *elem);
int vec_eq(void *v, void *vv);
int set_add(void *v, void *t);
int set_union(void *v, void *vv);
void *set_add_fn(void *v, void *t, hash_fns_t *fns);
void set_union_fn(void *v, void *vv, hash_fns_t *fns);
void set_to_vec(void *av);
#define vec_clear(_v) do { (_v)->n = 0; (_v)->v = 0; } while(0)
#define vec_free(_v) do { \
if ((_v)->v && (_v)->v != (_v)->e) FREE((_v)->v); vec_clear(_v); } while(0)
#define stack_clear(_s) do { \
(_s)->start = (_s)->cur = (_s)->end = (_s)->initial; \
(_s)->end += INTEGRAL_STACK_SIZE; \
} \
while(0)
#define stack_free(_s) do { \
if ((_s)->start != (_s)->initial) FREE((_s)->start); \
stack_clear(_s); \
} while(0)
#define stack_head(_s) ((_s)->cur[-1])
#define is_stack_empty(_s) ((_s)->cur == (_s)->start)
#define stack_empty(_s) ((_s)->cur = (_s)->start)
#define stack_depth(_s) ((_s)->cur - (_s)->start)
#define stack_pop(_s) (*--((_s)->cur))
#define stack_push(_s, _x) ((_s)->cur == (_s)->end ? \
stack_push_internal((AbstractStack*)((_s)), (void*)_x) : \
(void*)(*((_s)->cur)++ = (_x)))
void * stack_push_internal(AbstractStack*, void*);
int buf_read(char *pathname, char **buf, int *len);
char *sbuf_read(char *pathname);
#define STREQ(_x,_n,_s) \
((_n == sizeof(_s)-1) && !strncasecmp(_x,_s,sizeof(_s)-1))
void d_fail(char *str, ...);
char *dup_str(char *str, char *end);
uint strhashl(char *s, int len);
void d_free(void *);
void int_list_diff(int *a, int *b, int *c);
void int_list_intersect(int *a, int *b, int *c);
int *int_list_dup(int *aa);
char *escape_string(char *s);
extern uint prime2[];
extern int verbose_level;
extern int debug_level;
extern int test_level;