1.1 --- a/librazor/merger.c Wed Jan 14 11:47:55 2009 +0000
1.2 +++ b/librazor/merger.c Fri May 01 16:48:47 2009 +0100
1.3 @@ -231,16 +231,15 @@
1.4 uint32_t e;
1.5 int found_file = 0;
1.6
1.7 - e = top->start;
1.8 + e = top - files;
1.9 do {
1.10 - if (files[e].start)
1.11 - fix_file_map(map, files, &files[e]);
1.12 + if (files[e].start &&
1.13 + fix_file_map(map, files, &files[files[e].start]))
1.14 + map[e] = 1;
1.15 if (map[e])
1.16 found_file = 1;
1.17 } while (!(files[e++].flags & RAZOR_ENTRY_LAST));
1.18
1.19 - if (found_file)
1.20 - map[top - files] = 1;
1.21 return found_file;
1.22 }
1.23
1.24 @@ -271,9 +270,9 @@
1.25 array_init(&merge_stack);
1.26
1.27 start = merger->set->files.size / sizeof (struct razor_entry);
1.28 - last = 0;
1.29 - e1 = md->dir1 ? root1 + md->dir1 : NULL;
1.30 - e2 = md->dir2 ? root2 + md->dir2 : NULL;
1.31 + last = 0xFFFFFFFF;
1.32 + e1 = md->dir1 != 0xFFFFFFFF ? root1 + md->dir1 : NULL;
1.33 + e2 = md->dir2 != 0xFFFFFFFF ? root2 + md->dir2 : NULL;
1.34 while (e1 || e2) {
1.35 if (!e2 && !map1[e1 - root1]) {
1.36 if ((e1++)->flags & RAZOR_ENTRY_LAST)
1.37 @@ -311,7 +310,7 @@
1.38 child_md = array_add(&merge_stack, sizeof (struct merge_directory));
1.39 child_md->merged = last;
1.40 child_md->dir1 = e1->start;
1.41 - child_md->dir2 = 0;
1.42 + child_md->dir2 = 0xFFFFFFFF;
1.43 }
1.44 }
1.45 if ((e1++)->flags & RAZOR_ENTRY_LAST)
1.46 @@ -323,7 +322,7 @@
1.47 if (e2->start) {
1.48 child_md = array_add(&merge_stack, sizeof (struct merge_directory));
1.49 child_md->merged = last;
1.50 - child_md->dir1 = 0;
1.51 + child_md->dir1 = 0xFFFFFFFF;
1.52 child_md->dir2 = e2->start;
1.53 }
1.54 }
1.55 @@ -335,8 +334,8 @@
1.56 if (e1->start || e2->start) {
1.57 child_md = array_add(&merge_stack, sizeof (struct merge_directory));
1.58 child_md->merged = last;
1.59 - child_md->dir1 = e1->start;
1.60 - child_md->dir2 = e2->start;
1.61 + child_md->dir1 = e1->start ? e1->start : 0xFFFFFFFF;
1.62 + child_md->dir2 = e2->start ? e2->start : 0xFFFFFFFF;
1.63 }
1.64 if ((e1++)->flags & RAZOR_ENTRY_LAST)
1.65 e1 = NULL;
1.66 @@ -346,11 +345,10 @@
1.67 }
1.68
1.69 mroot = (struct razor_entry *)merger->set->files.data;
1.70 - if (last) {
1.71 + if (last != 0xFFFFFFFF) {
1.72 mroot[last].flags = RAZOR_ENTRY_LAST;
1.73 mroot[md->merged].start = start;
1.74 - } else
1.75 - mroot[md->merged].start = 0;
1.76 + }
1.77
1.78 end_md = merge_stack.data + merge_stack.size;
1.79 for (child_md = merge_stack.data; child_md < end_md; child_md++)
1.80 @@ -374,17 +372,23 @@
1.81 root = (struct razor_entry *) merger->source1.set->files.data;
1.82 if (root->start)
1.83 fix_file_map(map1, root, root);
1.84 - md.dir1 = root->start;
1.85 - } else
1.86 md.dir1 = 0;
1.87 + } else {
1.88 + md.dir1 = 0xFFFFFFFF;
1.89 + }
1.90
1.91 if (merger->source2.set->files.size) {
1.92 root = (struct razor_entry *) merger->source2.set->files.data;
1.93 if (root->start)
1.94 fix_file_map(map2, root, root);
1.95 - md.dir2 = root->start;
1.96 - } else
1.97 md.dir2 = 0;
1.98 + } else {
1.99 + md.dir2 = 0xFFFFFFFF;
1.100 + }
1.101 +
1.102 + /* Remove the unnamed root which razor_set_create() added */
1.103 + array_release(&merger->set->files);
1.104 + array_init(&merger->set->files);
1.105
1.106 merge_one_directory(merger, &md);
1.107 }