diff -r c9c90315ea24 -r d7eea3164151 librazor/merger.c --- a/librazor/merger.c Wed Apr 22 15:09:17 2009 +0100 +++ b/librazor/merger.c Thu Jul 02 11:31:45 2009 +0100 @@ -1,6 +1,7 @@ /* * Copyright (C) 2008 Kristian Høgsberg * Copyright (C) 2008 Red Hat, Inc + * Copyright (C) 2009 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +19,7 @@ */ #include +#include #include "razor-internal.h" #include "razor.h" @@ -30,6 +32,7 @@ }; struct razor_merger { + int committed; struct razor_set *set; struct hashtable table; struct hashtable file_table; @@ -79,6 +82,8 @@ struct source *source; uint32_t flags; + assert(merger->committed == 0); + set1 = merger->source1.set; if (set1->packages.data <= (void *) package && (void *) package < set1->packages.data + set1->packages.size) { @@ -111,6 +116,15 @@ source->file_map[r->data] = 1; r = list_next(r); } + + p->preun.program = hashtable_tokenize(&merger->table, + &pool[package->preun.program]); + p->preun.body = hashtable_tokenize(&merger->table, + &pool[package->preun.body]); + p->postun.program = hashtable_tokenize(&merger->table, + &pool[package->postun.program]); + p->postun.body = hashtable_tokenize(&merger->table, + &pool[package->postun.body]); } static uint32_t @@ -481,9 +495,8 @@ } struct razor_set * -razor_merger_finish(struct razor_merger *merger) +razor_merger_commit(struct razor_merger *merger) { - struct razor_set *result; struct razor_package *p, *pend; /* As we built the package list, we filled out a bitvector of @@ -523,10 +536,49 @@ rebuild_property_package_lists(merger->set); rebuild_file_package_lists(merger->set); - result = merger->set; + merger->committed = 1; + + return merger->set; +} + +void +razor_merger_package_add_script(struct razor_merger *merger, + struct razor_package *package, + enum razor_property_flags script, + const char *program, const char *body) +{ + uint32_t p, b; + char *pool; + struct razor_set *set = merger->set; + assert ((void *)package >= set->packages.data && \ + (void *)package < set->packages.data + set->packages.size); + + p = hashtable_tokenize(&merger->table, program); + b = hashtable_tokenize(&merger->table, body); + + pool = merger->set->string_pool.data; + + switch (script) { + case RAZOR_PROPERTY_PREUN: + assert(pool[package->preun.program] == '\0'); + assert(pool[package->preun.body] == '\0'); + package->preun.program = p; + package->preun.body = b; + break; + case RAZOR_PROPERTY_POSTUN: + assert(pool[package->postun.program] == '\0'); + assert(pool[package->postun.body] == '\0'); + package->postun.program = p; + package->postun.body = b; + break; + default: + break; + } +} + +void razor_merger_destroy(struct razor_merger *merger) +{ hashtable_release(&merger->table); hashtable_release(&merger->file_table); free(merger); - - return result; }