librazor/razor-internal.h
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Jan 08 17:36:50 2009 +0000 (2009-01-08)
changeset 337 c89695ed29f0
parent 322 66c281524c98
child 351 48b0adfe3059
permissions -rw-r--r--
Replace call to random() with the more portable rand() since we
don't have any need for a "good" random number generator.
     1 /*
     2  * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     3  * Copyright (C) 2008  Red Hat, Inc
     4  *
     5  * This program is free software; you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation; either version 2 of the License, or
     8  * (at your option) any later version.
     9  *
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  * GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License along
    16  * with this program; if not, write to the Free Software Foundation, Inc.,
    17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    18  */
    19 
    20 #ifndef _RAZOR_INTERNAL_H_
    21 #define _RAZOR_INTERNAL_H_
    22 
    23 #include <stdlib.h>
    24 #include <stdint.h>
    25 #include <stdarg.h>
    26 
    27 #include "razor.h"
    28 
    29 /* GCC visibility */
    30 #if defined(__GNUC__) && __GNUC__ >= 4
    31 #define RAZOR_EXPORT __attribute__ ((visibility("default")))
    32 #else
    33 #define RAZOR_EXPORT
    34 #endif
    35 
    36 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
    37 #define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1))
    38 
    39 void *zalloc(size_t size);
    40 
    41 struct array {
    42 	void *data;
    43 	int size, alloc;
    44 };
    45 
    46 void array_init(struct array *array);
    47 void array_release(struct array *array);
    48 void *array_add(struct array *array, int size);
    49 
    50 
    51 struct list_head {
    52 	uint32_t list_ptr : 24;
    53 	uint32_t flags    : 8;
    54 };
    55 
    56 struct list {
    57 	uint32_t data  : 24;
    58 	uint32_t flags : 8;
    59 };
    60 
    61 void list_set_empty(struct list_head *head);
    62 void list_set_ptr(struct list_head *head, uint32_t ptr);
    63 void list_set_array(struct list_head *head, struct array *pool, struct array *items, int force_indirect);
    64 
    65 struct list *list_first(struct list_head *head, struct array *pool);
    66 struct list *list_next(struct list *list);
    67 
    68 void list_remap_pool(struct array *pool, uint32_t *map);
    69 void list_remap_head(struct list_head *list, uint32_t *map);
    70 
    71 
    72 struct hashtable {
    73 	struct array buckets;
    74 	struct array *pool;
    75 };
    76 
    77 void hashtable_init(struct hashtable *table, struct array *pool);
    78 void hashtable_release(struct hashtable *table);
    79 uint32_t hashtable_insert(struct hashtable *table, const char *key);
    80 uint32_t hashtable_lookup(struct hashtable *table, const char *key);
    81 uint32_t hashtable_tokenize(struct hashtable *table, const char *string);
    82 
    83 
    84 struct razor_set_section {
    85 	uint32_t name;
    86 	uint32_t offset;
    87 	uint32_t size;
    88 };
    89 
    90 struct razor_set_header {
    91 	uint32_t magic;
    92 	uint32_t version;
    93 	uint32_t num_sections;
    94 };
    95 
    96 #define RAZOR_MAGIC 	0x525a4442
    97 #define RAZOR_VERSION	1
    98 
    99 #define RAZOR_STRING_POOL		"string_pool"
   100 #define RAZOR_PACKAGES			"packages"
   101 #define RAZOR_PROPERTIES		"properties"
   102 #define RAZOR_PACKAGE_POOL		"package_pool"
   103 #define RAZOR_PROPERTY_POOL		"property_pool"
   104 
   105 #define RAZOR_DETAILS_STRING_POOL	"details_string_pool"
   106 
   107 #define RAZOR_FILES			"files"
   108 #define RAZOR_FILE_POOL			"file_pool"
   109 #define RAZOR_FILE_STRING_POOL		"file_string_pool"
   110 
   111 struct razor_package {
   112 	unsigned int name  : 24;
   113 	unsigned int flags : 8;
   114 	uint32_t version;
   115 	uint32_t arch;
   116 	uint32_t summary;
   117 	uint32_t description;
   118 	uint32_t url;
   119 	uint32_t license;
   120 	struct list_head properties;
   121 	struct list_head files;
   122 };
   123 
   124 
   125 struct razor_property {
   126 	uint32_t name;
   127 	uint32_t flags;
   128 	uint32_t version;
   129 	struct list_head packages;
   130 };
   131 
   132 struct razor_entry {
   133 	uint32_t name  : 24;
   134 	uint32_t flags : 8;
   135 	uint32_t start;
   136 	struct list_head packages;
   137 };
   138 
   139 #define RAZOR_ENTRY_LAST	0x80
   140 
   141 struct razor_set {
   142 	struct array string_pool;
   143  	struct array packages;
   144  	struct array properties;
   145  	struct array files;
   146 	struct array package_pool;
   147  	struct array property_pool;
   148  	struct array file_pool;
   149 	struct array file_string_pool;
   150 	struct array details_string_pool;
   151 
   152 	struct razor_set_header *header;
   153 	size_t header_size;
   154 
   155 	struct razor_set_header *details_header;
   156 	size_t details_header_size;
   157 
   158 	struct razor_set_header *files_header;
   159 	size_t files_header_size;
   160 };
   161 
   162 struct import_entry {
   163 	uint32_t package;
   164 	char *name;
   165 };
   166 
   167 struct import_directory {
   168 	uint32_t name, count;
   169 	struct array files;
   170 	struct array packages;
   171 	struct import_directory *last;
   172 };
   173 
   174 struct razor_importer {
   175 	struct razor_set *set;
   176 	struct hashtable table;
   177 	struct hashtable file_table;
   178 	struct hashtable details_table;
   179 	struct razor_package *package;
   180 	struct array properties;
   181 	struct array files;
   182 	struct array file_requires;
   183 };
   184 
   185 struct razor_package_iterator {
   186 	struct razor_set *set;
   187 	struct razor_package *package, *end;
   188 	struct list *index;
   189 	int free_index;
   190 };
   191 
   192 void
   193 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
   194 					 struct razor_set *set,
   195 					 struct razor_property *property);
   196 
   197 struct razor_property_iterator {
   198 	struct razor_set *set;
   199 	struct razor_property *property, *end;
   200 	struct list *index;
   201 };
   202 
   203 struct razor_entry *
   204 razor_set_find_entry(struct razor_set *set,
   205 		     struct razor_entry *dir, const char *pattern);
   206 
   207 struct razor_merger *
   208 razor_merger_create(struct razor_set *set1, struct razor_set *set2);
   209 void
   210 razor_merger_add_package(struct razor_merger *merger,
   211 			 struct razor_package *package);
   212 struct razor_set *
   213 razor_merger_finish(struct razor_merger *merger);
   214 
   215 /* Utility functions */
   216 
   217 void
   218 razor_package_get_details_varg(struct razor_set *set,
   219 			       struct razor_package *package,
   220 			       va_list args);
   221 
   222 int razor_create_dir(const char *root, const char *path);
   223 int razor_write(int fd, const void *data, size_t size);
   224 
   225 void *razor_file_get_contents(const char *filename, size_t *length);
   226 int razor_file_free_contents(void *addr, size_t length);
   227 
   228 
   229 typedef int (*razor_compare_with_data_func_t)(const void *p1,
   230 					      const void *p,
   231 					      void *data);
   232 uint32_t *
   233 razor_qsort_with_data(void *base, size_t nelem, size_t size,
   234 		      razor_compare_with_data_func_t compare, void *data);
   235 
   236 #endif /* _RAZOR_INTERNAL_H_ */