librazor/razor-internal.h
author Kristian H?gsberg <krh@redhat.com>
Fri Jun 20 23:13:09 2008 -0400 (2008-06-20)
changeset 257 0c3db660514d
parent 241 c3eb520e2219
child 258 29d5002bd17f
permissions -rw-r--r--
When uniquifying properties, also sort them on the owning package.

This ensures that whenever two packages provide or (or require, obsolete
or conflict) the same property, they appear in the same order in the
propertys list of packages.
rhughes@241
     1
#ifndef _RAZOR_INTERNAL_H_
rhughes@241
     2
#define _RAZOR_INTERNAL_H_
rhughes@241
     3
krh@248
     4
#include <stdlib.h>
krh@248
     5
#include <stdint.h>
krh@248
     6
krh@248
     7
void *zalloc(size_t size);
krh@248
     8
krh@248
     9
struct array {
krh@248
    10
	void *data;
krh@248
    11
	int size, alloc;
krh@248
    12
};
krh@248
    13
krh@248
    14
void array_init(struct array *array);
krh@248
    15
void array_release(struct array *array);
krh@248
    16
void *array_add(struct array *array, int size);
krh@248
    17
krh@248
    18
krh@248
    19
struct list_head {
krh@248
    20
	uint32_t list_ptr : 24;
krh@248
    21
	uint32_t flags    : 8;
krh@248
    22
};
krh@248
    23
krh@248
    24
struct list {
krh@248
    25
	uint32_t data  : 24;
krh@248
    26
	uint32_t flags : 8;
krh@248
    27
};
krh@248
    28
krh@248
    29
void list_set_empty(struct list_head *head);
krh@248
    30
void list_set_ptr(struct list_head *head, uint32_t ptr);
krh@248
    31
void list_set_array(struct list_head *head, struct array *pool, struct array *items, int force_indirect);
krh@248
    32
krh@248
    33
struct list *list_first(struct list_head *head, struct array *pool);
krh@248
    34
struct list *list_next(struct list *list);
krh@248
    35
krh@248
    36
void list_remap_pool(struct array *pool, uint32_t *map);
krh@248
    37
void list_remap_head(struct list_head *list, uint32_t *map);
krh@248
    38
krh@248
    39
krh@248
    40
struct hashtable {
krh@248
    41
	struct array buckets;
krh@248
    42
	struct array *pool;
krh@248
    43
};
krh@248
    44
krh@248
    45
void hashtable_init(struct hashtable *table, struct array *pool);
krh@248
    46
void hashtable_release(struct hashtable *table);
krh@248
    47
uint32_t hashtable_insert(struct hashtable *table, const char *key);
krh@248
    48
uint32_t hashtable_lookup(struct hashtable *table, const char *key);
krh@248
    49
uint32_t hashtable_tokenize(struct hashtable *table, const char *string);
krh@248
    50
krh@248
    51
krh@248
    52
struct razor_set_section {
krh@248
    53
	uint32_t type;
krh@248
    54
	uint32_t offset;
krh@248
    55
	uint32_t size;
krh@248
    56
};
krh@248
    57
krh@248
    58
struct razor_set_header {
krh@248
    59
	uint32_t magic;
krh@248
    60
	uint32_t version;
krh@248
    61
	struct razor_set_section sections[0];
krh@248
    62
};
krh@248
    63
krh@248
    64
#define RAZOR_MAGIC 0x7a7a7a7a
krh@248
    65
#define RAZOR_VERSION 1
krh@248
    66
krh@248
    67
#define RAZOR_STRING_POOL	0
krh@248
    68
#define RAZOR_PACKAGES		1
krh@248
    69
#define RAZOR_PROPERTIES	2
krh@248
    70
#define RAZOR_FILES		3
krh@248
    71
#define RAZOR_PACKAGE_POOL	4
krh@248
    72
#define RAZOR_PROPERTY_POOL	5
krh@248
    73
#define RAZOR_FILE_POOL		6
krh@248
    74
krh@248
    75
struct razor_package {
krh@248
    76
	uint32_t name  : 24;
krh@248
    77
	uint32_t flags : 8;
krh@248
    78
	uint32_t version;
krh@248
    79
	uint32_t arch;
krh@248
    80
	struct list_head properties;
krh@248
    81
	struct list_head files;
krh@248
    82
};
krh@248
    83
krh@248
    84
struct razor_property {
krh@248
    85
	uint32_t name;
krh@248
    86
	uint32_t flags;
krh@248
    87
	uint32_t version;
krh@248
    88
	struct list_head packages;
krh@248
    89
};
krh@248
    90
krh@248
    91
struct razor_entry {
krh@248
    92
	uint32_t name  : 24;
krh@248
    93
	uint32_t flags : 8;
krh@248
    94
	uint32_t start;
krh@248
    95
	struct list_head packages;
krh@248
    96
};
krh@248
    97
krh@248
    98
#define RAZOR_ENTRY_LAST	0x80
krh@248
    99
krh@248
   100
struct razor_set {
krh@248
   101
	struct array string_pool;
krh@248
   102
 	struct array packages;
krh@248
   103
 	struct array properties;
krh@248
   104
 	struct array files;
krh@248
   105
	struct array package_pool;
krh@248
   106
 	struct array property_pool;
krh@248
   107
 	struct array file_pool;
krh@248
   108
	struct razor_set_header *header;
krh@248
   109
};
krh@248
   110
krh@248
   111
struct import_entry {
krh@248
   112
	uint32_t package;
krh@248
   113
	char *name;
krh@248
   114
};
krh@248
   115
krh@248
   116
struct import_directory {
krh@248
   117
	uint32_t name, count;
krh@248
   118
	struct array files;
krh@248
   119
	struct array packages;
krh@248
   120
	struct import_directory *last;
krh@248
   121
};
krh@248
   122
krh@248
   123
struct razor_importer {
krh@248
   124
	struct razor_set *set;
krh@248
   125
	struct hashtable table;
krh@248
   126
	struct razor_package *package;
krh@248
   127
	struct array properties;
krh@248
   128
	struct array files;
krh@248
   129
	struct array file_requires;
krh@248
   130
};
krh@248
   131
krh@248
   132
struct razor_package_iterator {
krh@248
   133
	struct razor_set *set;
krh@248
   134
	struct razor_package *package, *end;
krh@248
   135
	struct list *index;
krh@248
   136
	int free_index;
krh@248
   137
};
krh@248
   138
krh@248
   139
void
krh@248
   140
razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
krh@248
   141
					 struct razor_set *set,
krh@248
   142
					 struct razor_property *property);
krh@248
   143
krh@248
   144
struct razor_property_iterator {
krh@248
   145
	struct razor_set *set;
krh@248
   146
	struct razor_property *property, *end;
krh@248
   147
	struct list *index;
krh@248
   148
};
krh@248
   149
rhughes@241
   150
#define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1))
rhughes@241
   151
krh@248
   152
struct razor_entry *
krh@248
   153
razor_set_find_entry(struct razor_set *set,
krh@248
   154
		     struct razor_entry *dir, const char *pattern);
krh@248
   155
krh@248
   156
struct razor_merger *
krh@248
   157
razor_merger_create(struct razor_set *set1, struct razor_set *set2);
krh@248
   158
void
krh@248
   159
razor_merger_add_package(struct razor_merger *merger,
krh@248
   160
			 struct razor_package *package);
krh@248
   161
struct razor_set *
krh@248
   162
razor_merger_finish(struct razor_merger *merger);
krh@248
   163
rhughes@241
   164
/* Utility functions */
rhughes@241
   165
rhughes@241
   166
int razor_create_dir(const char *root, const char *path);
rhughes@241
   167
int razor_write(int fd, const void *data, size_t size);
rhughes@241
   168
rhughes@241
   169
rhughes@241
   170
typedef int (*razor_compare_with_data_func_t)(const void *p1,
rhughes@241
   171
					      const void *p,
rhughes@241
   172
					      void *data);
rhughes@241
   173
uint32_t *
rhughes@241
   174
razor_qsort_with_data(void *base, size_t nelem, size_t size,
rhughes@241
   175
		      razor_compare_with_data_func_t compare, void *data);
rhughes@241
   176
rhughes@241
   177
#endif /* _RAZOR_INTERNAL_H_ */