From: Kristian Høgsberg Date: Tue, 4 Sep 2007 03:31:32 +0000 (-0400) Subject: Cleanup and renaming: hashtable and razor_context combined into razor_set. X-Git-Tag: 0.1~356 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=0806ca72c1ca99dc085570a302bb0baecb62a38a;p=razor.git Cleanup and renaming: hashtable and razor_context combined into razor_set. It's no longer just a hashtable, it's really a set of packages. --- diff --git a/razor.c b/razor.c index 26ea0a5..988b9fb 100644 --- a/razor.c +++ b/razor.c @@ -40,154 +40,154 @@ write_to_file(const char *filename, void *p, size_t size) return err; } -struct hashtable_header { +static void * +zalloc(size_t size) +{ + void *p; + + p = malloc(size); + memset(p, 0, size); + + return p; +} + +struct razor_set_header { unsigned int magic; unsigned int version; struct { unsigned int type, offset; } sections[0]; }; -#define HASHTABLE_MAGIC 0x7a7a7a7a -#define HASHTABLE_VERSION 1 -#define HASHTABLE_BUCKETS 1 -#define HASHTABLE_STRINGS 2 -#define HASHTABLE_PACKAGES 3 +#define RAZOR_MAGIC 0x7a7a7a7a +#define RAZOR_VERSION 1 +#define RAZOR_BUCKETS 1 +#define RAZOR_STRINGS 2 +#define RAZOR_PACKAGES 3 -struct package { +struct razor_package { unsigned long name; unsigned long version; }; -struct hashtable { +struct razor_set { unsigned long *buckets; int bucket_count, bucket_alloc; char *string_pool; int pool_size, pool_alloc; - struct hashtable_header *header; + struct razor_set_header *header; - struct package *packages; + struct razor_package *packages; int package_count, package_alloc; }; -static void * -zalloc(size_t size) +struct razor_set * +razor_set_create(void) { - void *p; + struct razor_set *set; - p = malloc(size); - memset(p, 0, size); + set = zalloc(sizeof *set); + set->buckets = zalloc(4096 * sizeof *set->buckets); + set->bucket_count = 0; + set->bucket_alloc = 4096; - return p; -} - -struct hashtable * -hashtable_create(void) -{ - struct hashtable *ht; + set->string_pool = zalloc(4096); + set->pool_size = 1; + set->pool_alloc = 4096; - ht = zalloc(sizeof *ht); - ht->buckets = zalloc(4096 * sizeof *ht->buckets); - ht->bucket_count = 0; - ht->bucket_alloc = 4096; + set->packages = zalloc(4096 * sizeof *set->packages); + set->package_count = 0; + set->package_alloc = 4096; - ht->string_pool = zalloc(4096); - ht->pool_size = 1; - ht->pool_alloc = 4096; - - ht->packages = zalloc(4096 * sizeof *ht->packages); - ht->package_count = 0; - ht->package_alloc = 4096; - - return ht; + return set; } -struct hashtable * -hashtable_create_from_file(const char *filename) +struct razor_set * +razor_set_open(const char *filename) { - struct hashtable *ht; + struct razor_set *set; struct stat stat; unsigned int size, offset; int fd, i; - ht = zalloc(sizeof *ht); + set = zalloc(sizeof *set); fd = open(filename, O_RDONLY); if (fstat(fd, &stat) < 0) return NULL; - ht->header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (ht->header == MAP_FAILED) { - free(ht); + set->header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (set->header == MAP_FAILED) { + free(set); return NULL; } - for (i = 0; i < ht->header->sections[i].type; i++) { - offset = ht->header->sections[i].offset; - size = ht->header->sections[i + 1].offset - offset; + for (i = 0; i < set->header->sections[i].type; i++) { + offset = set->header->sections[i].offset; + size = set->header->sections[i + 1].offset - offset; - switch (ht->header->sections[i].type) { - case HASHTABLE_BUCKETS: - ht->buckets = (void *) ht->header + offset; - ht->bucket_count = size / sizeof *ht->buckets; - ht->bucket_alloc = ht->bucket_count; + switch (set->header->sections[i].type) { + case RAZOR_BUCKETS: + set->buckets = (void *) set->header + offset; + set->bucket_count = size / sizeof *set->buckets; + set->bucket_alloc = set->bucket_count; break; - case HASHTABLE_STRINGS: - ht->string_pool = (void *) ht->header + offset; - ht->pool_size = size; - ht->pool_alloc = size; + case RAZOR_STRINGS: + set->string_pool = (void *) set->header + offset; + set->pool_size = size; + set->pool_alloc = size; break; - case HASHTABLE_PACKAGES: - ht->packages = (void *) ht->header + offset; - ht->package_count = size / sizeof *ht->packages; - ht->package_alloc = size / sizeof *ht->packages; + case RAZOR_PACKAGES: + set->packages = (void *) set->header + offset; + set->package_count = size / sizeof *set->packages; + set->package_alloc = size / sizeof *set->packages; break; } } close(fd); - return ht; + return set; } void -hashtable_destroy(struct hashtable *ht) +razor_set_destroy(struct razor_set *set) { unsigned int size; int i; - if (ht->header) { - for (i = 0; ht->header->sections[i].type; i++) + if (set->header) { + for (i = 0; set->header->sections[i].type; i++) ; - size = ht->header->sections[i].type; - munmap(ht->header, size); + size = set->header->sections[i].type; + munmap(set->header, size); } else { - free(ht->buckets); - free(ht->string_pool); + free(set->buckets); + free(set->string_pool); } - free(ht); + free(set); } static int -hashtable_write(struct hashtable *ht, const char *filename) +razor_set_write(struct razor_set *set, const char *filename) { char data[4096]; - struct hashtable_header *header = (struct hashtable_header *) data; + struct razor_set_header *header = (struct razor_set_header *) data; int fd, pool_size, package_size; /* Align these to pages sizes */ - pool_size = (ht->pool_size + 4095) & ~4095; + pool_size = (set->pool_size + 4095) & ~4095; package_size = - (ht->package_alloc * sizeof *ht->packages + 4095) & ~4095; + (set->package_alloc * sizeof *set->packages + 4095) & ~4095; memset(data, 0, sizeof data); - header->magic = HASHTABLE_MAGIC; - header->version = HASHTABLE_VERSION; + header->magic = RAZOR_MAGIC; + header->version = RAZOR_VERSION; - header->sections[0].type = HASHTABLE_BUCKETS; + header->sections[0].type = RAZOR_BUCKETS; header->sections[0].offset = sizeof data; - header->sections[1].type = HASHTABLE_STRINGS; + header->sections[1].type = RAZOR_STRINGS; header->sections[1].offset = header->sections[0].offset + - ht->bucket_alloc * sizeof *ht->buckets; + set->bucket_alloc * sizeof *set->buckets; - header->sections[2].type = HASHTABLE_PACKAGES; + header->sections[2].type = RAZOR_PACKAGES; header->sections[2].offset = header->sections[1].offset + pool_size; header->sections[3].type = 0; @@ -198,9 +198,9 @@ hashtable_write(struct hashtable *ht, const char *filename) return -1; write_to_fd(fd, data, sizeof data); - write_to_fd(fd, ht->buckets, ht->bucket_alloc * sizeof *ht->buckets); - write_to_fd(fd, ht->string_pool, pool_size); - write_to_fd(fd, ht->packages, package_size); + write_to_fd(fd, set->buckets, set->bucket_alloc * sizeof *set->buckets); + write_to_fd(fd, set->string_pool, pool_size); + write_to_fd(fd, set->packages, package_size); return 0; } @@ -218,23 +218,23 @@ hash_string(const char *key) } unsigned long -hashtable_lookup(struct hashtable *ht, const char *key) +razor_set_lookup(struct razor_set *set, const char *key) { unsigned int start; unsigned int mask; unsigned long value; int i; - mask = ht->bucket_alloc - 1; + mask = set->bucket_alloc - 1; start = hash_string(key) & mask; i = start; do { - value = ht->buckets[i]; + value = set->buckets[i]; if (value == 0) return 0; - if (strcmp(key, &ht->string_pool[value]) == 0) + if (strcmp(key, &set->string_pool[value]) == 0) return value; i = (i + 1) & mask; @@ -244,45 +244,45 @@ hashtable_lookup(struct hashtable *ht, const char *key) } static unsigned long -add_to_string_pool(struct hashtable *ht, const char *key) +add_to_string_pool(struct razor_set *set, const char *key) { int len, alloc; char *pool; unsigned long value; len = strlen(key) + 1; - alloc = ht->pool_alloc; - while (alloc < ht->pool_size + len) + alloc = set->pool_alloc; + while (alloc < set->pool_size + len) alloc *= 2; - if (ht->pool_alloc < alloc) { - pool = realloc(ht->string_pool, alloc); + if (set->pool_alloc < alloc) { + pool = realloc(set->string_pool, alloc); if (pool == NULL) return 0; - ht->string_pool = pool; - ht->pool_alloc = alloc; + set->string_pool = pool; + set->pool_alloc = alloc; } - memcpy(ht->string_pool + ht->pool_size, key, len); - value = ht->pool_size; - ht->pool_size += len; + memcpy(set->string_pool + set->pool_size, key, len); + value = set->pool_size; + set->pool_size += len; return value; } static void -do_insert(struct hashtable *ht, unsigned long value) +do_insert(struct razor_set *set, unsigned long value) { unsigned int mask; const char *key; int i, start; - key = &ht->string_pool[value]; - mask = ht->bucket_alloc - 1; + key = &set->string_pool[value]; + mask = set->bucket_alloc - 1; start = hash_string(key) & mask; i = start; do { - if (ht->buckets[i] == 0) { - ht->buckets[i] = value; + if (set->buckets[i] == 0) { + set->buckets[i] = value; break; } i = (i + 1) & mask; @@ -290,130 +290,98 @@ do_insert(struct hashtable *ht, unsigned long value) } unsigned long -hashtable_insert(struct hashtable *ht, const char *key) +razor_set_insert(struct razor_set *set, const char *key) { unsigned long value, *buckets, *old_buckets; int i, alloc, old_alloc; - alloc = ht->bucket_alloc; - while (alloc < 4 * ht->bucket_count) + alloc = set->bucket_alloc; + while (alloc < 4 * set->bucket_count) alloc *= 2; - if (alloc != ht->bucket_alloc) { - buckets = zalloc(alloc * sizeof *ht->buckets); + if (alloc != set->bucket_alloc) { + buckets = zalloc(alloc * sizeof *set->buckets); if (buckets == NULL) return 0; - old_buckets = ht->buckets; - ht->buckets = buckets; - old_alloc = ht->bucket_alloc; - ht->bucket_alloc = alloc; + old_buckets = set->buckets; + set->buckets = buckets; + old_alloc = set->bucket_alloc; + set->bucket_alloc = alloc; for (i = 0; i < old_alloc; i++) { value = old_buckets[i]; if (value != 0) - do_insert(ht, value); + do_insert(set, value); } free(old_buckets); } - value = add_to_string_pool(ht, key); - do_insert (ht, value); - ht->bucket_count++; + value = add_to_string_pool(set, key); + do_insert (set, value); + set->bucket_count++; return value; } static unsigned long -hashtable_add_package(struct hashtable *ht, +razor_set_add_package(struct razor_set *set, unsigned long name, unsigned long version) { - struct package *packages; + struct razor_package *packages; int alloc; - alloc = ht->package_alloc; - while (alloc < ht->package_count + 1) + /* FIXME: make 0 an illegal pkgs number. */ + alloc = set->package_alloc; + while (alloc < set->package_count + 1) alloc *= 2; - if (ht->package_alloc < alloc) { - packages = realloc(ht->packages, alloc * sizeof ht->packages); + if (set->package_alloc < alloc) { + packages = realloc(set->packages, alloc * sizeof set->packages); if (packages == NULL) return 0; - ht->packages = packages; - ht->package_alloc = alloc; + set->packages = packages; + set->package_alloc = alloc; } - ht->packages[ht->package_count].name = name; - ht->packages[ht->package_count].version = version; - ht->package_count++; - - return 0; -} - + set->packages[set->package_count].name = name; + set->packages[set->package_count].version = version; -struct razor_context { - struct hashtable *global_ht; -}; - -struct razor_context * -razor_context_create (void) -{ - struct razor_context *ctx; - - ctx = malloc(sizeof *ctx); - ctx->global_ht = hashtable_create(); - - return ctx; -} - -struct razor_context * -razor_context_create_from_file (const char *filename) -{ - struct razor_context *ctx; - - ctx = malloc(sizeof *ctx); - ctx->global_ht = hashtable_create_from_file(filename); - - return ctx; + return set->package_count++; } unsigned long -razor_context_tokenize(struct razor_context *ctx, const char *string) +razor_set_tokenize(struct razor_set *set, const char *string) { unsigned long token; - token = hashtable_lookup(ctx->global_ht, string); + token = razor_set_lookup(set, string); if (token != 0) return token; - return hashtable_insert(ctx->global_ht, string); + return razor_set_insert(set, string); } -static struct hashtable *qsort_ht; +static struct razor_set *qsort_set; static int compare_packages(const void *p1, const void *p2) { - const struct package *pkg1 = p1, *pkg2 = p2; + const struct razor_package *pkg1 = p1, *pkg2 = p2; - return strcmp(&qsort_ht->string_pool[pkg1->name], - &qsort_ht->string_pool[pkg2->name]); + return strcmp(&qsort_set->string_pool[pkg1->name], + &qsort_set->string_pool[pkg2->name]); } static void -razor_context_sort(struct razor_context *ctx) +razor_set_sort(struct razor_set *set) { - struct hashtable *ht = ctx->global_ht; - - qsort_ht = ht; - qsort(ht->packages, ht->package_count, sizeof *ht->packages, + qsort_set = set; + qsort(set->packages, set->package_count, sizeof *set->packages, compare_packages); } -struct razor_set { - struct razor_context *ctx; -}; - struct parsing_context { - struct razor_context *ctx; + struct razor_set *set; + int pkg_id; }; static void @@ -424,9 +392,9 @@ parse_package(struct parsing_context *ctx, const char **atts) for (i = 0; atts[i]; i += 2) { if (strcmp(atts[i], "name") == 0) - name = razor_context_tokenize(ctx->ctx, atts[i + 1]); + name = razor_set_tokenize(ctx->set, atts[i + 1]); else if (strcmp(atts[i], "version") == 0) - version = razor_context_tokenize(ctx->ctx, atts[i + 1]); + version = razor_set_tokenize(ctx->set, atts[i + 1]); } if (name == 0 || version == 0) { @@ -435,7 +403,9 @@ parse_package(struct parsing_context *ctx, const char **atts) return; } - hashtable_add_package(ctx->ctx->global_ht, name, version); + ctx->pkg_id = razor_set_add_package(ctx->set, name, version); + + return; } static void @@ -448,12 +418,16 @@ start_element(void *data, const char *name, const char **atts) parse_package(ctx, atts); for (i = 0; atts[i]; i += 2) - razor_context_tokenize(ctx->ctx, atts[i + 1]); + razor_set_tokenize(ctx->set, atts[i + 1]); } static void end_element (void *data, const char *name) { + struct parsing_context *ctx = data; + + if (strcmp(name, "package") == 0) + ctx->pkg_id = 0; } static char * @@ -476,11 +450,11 @@ sha1_to_hex(const unsigned char *sha1) } static int -razor_context_read_file(struct razor_context *ctx, const char *filename) +razor_set_import(struct razor_set *set, const char *filename) { SHA_CTX sha1; XML_Parser parser; - struct parsing_context pctx; + struct parsing_context ctx; int fd; void *p; struct stat stat; @@ -495,8 +469,8 @@ razor_context_read_file(struct razor_context *ctx, const char *filename) return -1; parser = XML_ParserCreate(NULL); - pctx.ctx = ctx; - XML_SetUserData(parser, &pctx); + ctx.set = set; + XML_SetUserData(parser, &ctx); XML_SetElementHandler(parser, start_element, end_element); if (XML_Parse(parser, p, stat.st_size, 1) == XML_STATUS_ERROR) { fprintf(stderr, @@ -523,58 +497,42 @@ razor_context_read_file(struct razor_context *ctx, const char *filename) return 0; } -int -razor_context_write(struct razor_context *ctx, const char *filename) -{ - return hashtable_write(ctx->global_ht, filename); -} - void -razor_context_list_packages(struct razor_context *ctx) +razor_set_list(struct razor_set *set) { int i; - struct hashtable *ht = ctx->global_ht; - struct package *p; + struct razor_package *p; - p = ht->packages; - for (i = 0; i < ht->package_count && p->name; i++, p++) { + p = set->packages; + for (i = 0; i < set->package_count && p->name; i++, p++) { printf("%s %s\n", - &ht->string_pool[p->name], - &ht->string_pool[p->version]); + &set->string_pool[p->name], + &set->string_pool[p->version]); } } void -razor_context_info(struct razor_context *ctx) +razor_set_info(struct razor_set *set) { - struct hashtable *ht = ctx->global_ht; unsigned int offset, size; int i; - for (i = 0; i < ht->header->sections[i].type; i++) { - offset = ht->header->sections[i].offset; - size = ht->header->sections[i + 1].offset - offset; + for (i = 0; i < set->header->sections[i].type; i++) { + offset = set->header->sections[i].offset; + size = set->header->sections[i + 1].offset - offset; - switch (ht->header->sections[i].type) { - case HASHTABLE_BUCKETS: + switch (set->header->sections[i].type) { + case RAZOR_BUCKETS: printf("bucket section:\t\t%dkb\n", size / 1024); break; - case HASHTABLE_STRINGS: + case RAZOR_STRINGS: printf("string pool:\t\t%dkb\n", size / 1024); break; - case HASHTABLE_PACKAGES: + case RAZOR_PACKAGES: printf("package section:\t%dkb\n", size / 1024); break; } } - -} - -void -razor_context_destroy(struct razor_context *ctx) -{ - hashtable_destroy(ctx->global_ht); - free(ctx); } static int @@ -590,7 +548,7 @@ int main(int argc, char *argv[]) { int i; - struct razor_context *ctx; + struct razor_set *set; struct stat statbuf; if (argc < 2) { @@ -601,41 +559,41 @@ main(int argc, char *argv[]) exit(-1); } - ctx = razor_context_create(); + set = razor_set_create(); for (i = 2; i < argc; i++) { - if (razor_context_read_file(ctx, argv[i]) < 0) { + if (razor_set_import(set, argv[i]) < 0) { fprintf(stderr, "failed to import %s\n", argv[i]); exit(-1); } } - razor_context_sort(ctx); + razor_set_sort(set); printf("number of buckets: %d\n", - ctx->global_ht->bucket_count); + set->bucket_count); printf("bucket allocation: %d\n", - ctx->global_ht->bucket_alloc); - printf("pool size: %d\n", ctx->global_ht->pool_size); - printf("pool allocation: %d\n", ctx->global_ht->pool_alloc); + set->bucket_alloc); + printf("pool size: %d\n", set->pool_size); + printf("pool allocation: %d\n", set->pool_alloc); - razor_context_write(ctx, repo_filename); + razor_set_write(set, repo_filename); - razor_context_destroy(ctx); + razor_set_destroy(set); } else if (strcmp(argv[1], "lookup") == 0) { - ctx = razor_context_create_from_file(repo_filename); + set = razor_set_open(repo_filename); printf("%s is %lu\n", argv[2], - hashtable_lookup(ctx->global_ht, argv[2])); - razor_context_destroy(ctx); + razor_set_lookup(set, argv[2])); + razor_set_destroy(set); } else if (strcmp(argv[1], "list") == 0) { - ctx = razor_context_create_from_file(repo_filename); - razor_context_list_packages(ctx); - razor_context_destroy(ctx); + set = razor_set_open(repo_filename); + razor_set_list(set); + razor_set_destroy(set); } else if (strcmp(argv[1], "info") == 0) { - ctx = razor_context_create_from_file(repo_filename); - razor_context_info(ctx); - razor_context_destroy(ctx); + set = razor_set_open(repo_filename); + razor_set_info(set); + razor_set_destroy(set); } else { usage(); }