1 #ifndef BAG_H 2 #define BAG_H 3 /* general utilities for C */ 4 5 6 #include <vstr.h> 7 8 typedef struct Bag_obj 9 { 10 const char *key; 11 void *val; 12 } Bag_obj; 13 14 typedef struct Bag 15 { 16 size_t num; 17 size_t sz; 18 void (*free_key_func)(void *); 19 void (*free_val_func)(void *); 20 21 unsigned int can_resize : 1; 22 23 Bag_obj VSTR__STRUCT_HACK_ARRAY(data); 24 } Bag; 25 26 typedef struct Bag_iter 27 { 28 Bag *bag; 29 size_t num; 30 } Bag_iter; 31 32 extern Bag *bag_make(size_t, void (*)(void *), void (*)(void *)); 33 extern void bag_free(Bag *); 34 35 extern Bag *bag_add_obj(Bag *, const char *, void *); 36 extern Bag *bag_add_cstr(Bag *, const char *, char *); 37 38 extern void bag_del_all(Bag *); 39 40 extern void bag_sort(Bag *, int (*)(const void *, const void *)); 41 extern int bag_cb_sort_key_coll(const void *, const void *); 42 extern int bag_cb_sort_key_case(const void *, const void *); 43 extern int bag_cb_sort_key_vers(const void *, const void *); 44 extern int bag_cb_sort_key_cmp(const void *, const void *); 45 46 extern const Bag_obj *bag_iter_beg(Bag *, Bag_iter *); 47 extern const Bag_obj *bag_iter_nxt(Bag_iter *); 48 49 extern const Bag_obj *bag_srch_eq(Bag *, 50 int (*)(const Bag_obj *, const void *), 51 const void *); 52 extern int bag_cb_srch_eq_key_ptr(const Bag_obj *, const void *); 53 extern int bag_cb_srch_eq_val_ptr(const Bag_obj *, const void *); 54 55 extern void bag_cb_free_nothing(void *); 56 extern void bag_cb_free_ref(void *); 57 extern void bag_cb_free_malloc(void *); 58 59 #endif 60