rhughes@241: #ifndef _RAZOR_INTERNAL_H_ rhughes@241: #define _RAZOR_INTERNAL_H_ rhughes@241: krh@248: #include krh@248: #include krh@248: krh@248: void *zalloc(size_t size); krh@248: krh@248: struct array { krh@248: void *data; krh@248: int size, alloc; krh@248: }; krh@248: krh@248: void array_init(struct array *array); krh@248: void array_release(struct array *array); krh@248: void *array_add(struct array *array, int size); krh@248: krh@248: krh@248: struct list_head { krh@248: uint32_t list_ptr : 24; krh@248: uint32_t flags : 8; krh@248: }; krh@248: krh@248: struct list { krh@248: uint32_t data : 24; krh@248: uint32_t flags : 8; krh@248: }; krh@248: krh@248: void list_set_empty(struct list_head *head); krh@248: void list_set_ptr(struct list_head *head, uint32_t ptr); krh@248: void list_set_array(struct list_head *head, struct array *pool, struct array *items, int force_indirect); krh@248: krh@248: struct list *list_first(struct list_head *head, struct array *pool); krh@248: struct list *list_next(struct list *list); krh@248: krh@248: void list_remap_pool(struct array *pool, uint32_t *map); krh@248: void list_remap_head(struct list_head *list, uint32_t *map); krh@248: krh@248: krh@248: struct hashtable { krh@248: struct array buckets; krh@248: struct array *pool; krh@248: }; krh@248: krh@248: void hashtable_init(struct hashtable *table, struct array *pool); krh@248: void hashtable_release(struct hashtable *table); krh@248: uint32_t hashtable_insert(struct hashtable *table, const char *key); krh@248: uint32_t hashtable_lookup(struct hashtable *table, const char *key); krh@248: uint32_t hashtable_tokenize(struct hashtable *table, const char *string); krh@248: krh@248: krh@248: struct razor_set_section { krh@248: uint32_t type; krh@248: uint32_t offset; krh@248: uint32_t size; krh@248: }; krh@248: krh@248: struct razor_set_header { krh@248: uint32_t magic; krh@248: uint32_t version; krh@248: struct razor_set_section sections[0]; krh@248: }; krh@248: krh@248: #define RAZOR_MAGIC 0x7a7a7a7a krh@248: #define RAZOR_VERSION 1 krh@248: krh@248: #define RAZOR_STRING_POOL 0 krh@248: #define RAZOR_PACKAGES 1 krh@248: #define RAZOR_PROPERTIES 2 krh@248: #define RAZOR_FILES 3 krh@248: #define RAZOR_PACKAGE_POOL 4 krh@248: #define RAZOR_PROPERTY_POOL 5 krh@248: #define RAZOR_FILE_POOL 6 krh@248: krh@248: struct razor_package { krh@248: uint32_t name : 24; krh@248: uint32_t flags : 8; krh@248: uint32_t version; krh@248: uint32_t arch; krh@248: struct list_head properties; krh@248: struct list_head files; krh@248: }; krh@248: krh@248: struct razor_property { krh@248: uint32_t name; krh@248: uint32_t flags; krh@248: uint32_t version; krh@248: struct list_head packages; krh@248: }; krh@248: krh@248: struct razor_entry { krh@248: uint32_t name : 24; krh@248: uint32_t flags : 8; krh@248: uint32_t start; krh@248: struct list_head packages; krh@248: }; krh@248: krh@248: #define RAZOR_ENTRY_LAST 0x80 krh@248: krh@248: struct razor_set { krh@248: struct array string_pool; krh@248: struct array packages; krh@248: struct array properties; krh@248: struct array files; krh@248: struct array package_pool; krh@248: struct array property_pool; krh@248: struct array file_pool; krh@248: struct razor_set_header *header; krh@248: }; krh@248: krh@248: struct import_entry { krh@248: uint32_t package; krh@248: char *name; krh@248: }; krh@248: krh@248: struct import_directory { krh@248: uint32_t name, count; krh@248: struct array files; krh@248: struct array packages; krh@248: struct import_directory *last; krh@248: }; krh@248: krh@248: struct razor_importer { krh@248: struct razor_set *set; krh@248: struct hashtable table; krh@248: struct razor_package *package; krh@248: struct array properties; krh@248: struct array files; krh@248: struct array file_requires; krh@248: }; krh@248: krh@248: struct razor_package_iterator { krh@248: struct razor_set *set; krh@248: struct razor_package *package, *end; krh@248: struct list *index; krh@248: int free_index; krh@248: }; krh@248: krh@248: void krh@248: razor_package_iterator_init_for_property(struct razor_package_iterator *pi, krh@248: struct razor_set *set, krh@248: struct razor_property *property); krh@248: krh@248: struct razor_property_iterator { krh@248: struct razor_set *set; krh@248: struct razor_property *property, *end; krh@248: struct list *index; krh@248: }; krh@248: rhughes@241: #define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1)) rhughes@241: krh@248: struct razor_entry * krh@248: razor_set_find_entry(struct razor_set *set, krh@248: struct razor_entry *dir, const char *pattern); krh@248: krh@248: struct razor_merger * krh@248: razor_merger_create(struct razor_set *set1, struct razor_set *set2); krh@248: void krh@248: razor_merger_add_package(struct razor_merger *merger, krh@248: struct razor_package *package); krh@248: struct razor_set * krh@248: razor_merger_finish(struct razor_merger *merger); krh@248: rhughes@241: /* Utility functions */ rhughes@241: rhughes@241: int razor_create_dir(const char *root, const char *path); rhughes@241: int razor_write(int fd, const void *data, size_t size); rhughes@241: rhughes@241: rhughes@241: typedef int (*razor_compare_with_data_func_t)(const void *p1, rhughes@241: const void *p, rhughes@241: void *data); rhughes@241: uint32_t * rhughes@241: razor_qsort_with_data(void *base, size_t nelem, size_t size, rhughes@241: razor_compare_with_data_func_t compare, void *data); rhughes@241: rhughes@241: #endif /* _RAZOR_INTERNAL_H_ */