librazor/merger.c
changeset 360 c798d6db076b
parent 348 3ad2e14e4cb7
child 369 f8c27fe9fe63
     1.1 --- a/librazor/merger.c	Wed Jan 14 11:47:55 2009 +0000
     1.2 +++ b/librazor/merger.c	Wed Apr 22 16:27:11 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  }