[PATCH 3/4] Use uint32_t for index-pack counters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a bit more complex than the fixes needed for unpack-objects. A
few very old methods were refactored to eliminate the need for negative
value returns or usage.

Signed-off-by: Dan McGee <dpmcgee@xxxxxxxxx>
---
 builtin/index-pack.c |   89 ++++++++++++++++++++++++-------------------------
 1 files changed, 44 insertions(+), 45 deletions(-)

diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 5a67c81..38e61db 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -45,16 +45,16 @@ struct base_data {
 
 struct delta_entry {
 	union delta_base base;
-	int obj_no;
+	uint32_t obj_no;
 };
 
 static struct object_entry *objects;
 static struct delta_entry *deltas;
 static struct base_data *base_cache;
 static size_t base_cache_used;
-static int nr_objects;
-static int nr_deltas;
-static int nr_resolved_deltas;
+static uint32_t nr_objects;
+static uint32_t nr_deltas;
+static uint32_t nr_resolved_deltas;
 
 static int from_stdin;
 static int strict;
@@ -389,42 +389,40 @@ static void *get_data_from_pack(struct object_entry *obj)
 	return data;
 }
 
-static int find_delta(const union delta_base *base)
-{
-	int first = 0, last = nr_deltas;
-
-        while (first < last) {
-                int next = (first + last) / 2;
-                struct delta_entry *delta = &deltas[next];
-                int cmp;
-
-                cmp = memcmp(base, &delta->base, UNION_BASE_SZ);
-                if (!cmp)
-                        return next;
-                if (cmp < 0) {
-                        last = next;
-                        continue;
-                }
-                first = next+1;
-        }
-        return -first-1;
-}
-
 static void find_delta_children(const union delta_base *base,
-				int *first_index, int *last_index)
+				uint32_t *first_index, uint32_t *last_index)
 {
-	int first = find_delta(base);
-	int last = first;
-	int end = nr_deltas - 1;
+	uint32_t first = 0, last = nr_deltas, next;
 
-	if (first < 0) {
-		*first_index = 0;
-		*last_index = -1;
+	while (first < last) {
+		int cmp;
+		struct delta_entry *delta;
+
+		next = (first + last) / 2;
+		delta = &deltas[next];
+
+		cmp = memcmp(base, &delta->base, UNION_BASE_SZ);
+		if (!cmp)
+			break;
+		if (cmp < 0) {
+			last = next;
+			continue;
+		}
+		first = next + 1;
+	}
+
+	if (first >= last) {
+		/* return non-sensical first/last to show we found nothing */
+		*first_index = 1;
+		*last_index = 0;
 		return;
 	}
+
+	last = first = next;
+
 	while (first > 0 && !memcmp(&deltas[first - 1].base, base, UNION_BASE_SZ))
 		--first;
-	while (last < end && !memcmp(&deltas[last + 1].base, base, UNION_BASE_SZ))
+	while (last < (nr_deltas - 1) && !memcmp(&deltas[last + 1].base, base, UNION_BASE_SZ))
 		++last;
 	*first_index = first;
 	*last_index = last;
@@ -531,7 +529,7 @@ static void resolve_delta(struct object_entry *delta_obj,
 static void find_unresolved_deltas(struct base_data *base,
 				   struct base_data *prev_base)
 {
-	int i, ref_first, ref_last, ofs_first, ofs_last;
+	uint32_t i, ref_first, ref_last, ofs_first, ofs_last;
 
 	/*
 	 * This is a recursive function. Those brackets should help reducing
@@ -548,7 +546,7 @@ static void find_unresolved_deltas(struct base_data *base,
 		find_delta_children(&base_spec, &ofs_first, &ofs_last);
 	}
 
-	if (ref_last == -1 && ofs_last == -1) {
+	if (ref_last < ref_first && ofs_last < ofs_first) {
 		free(base->data);
 		return;
 	}
@@ -560,7 +558,7 @@ static void find_unresolved_deltas(struct base_data *base,
 		if (child->real_type == OBJ_REF_DELTA) {
 			struct base_data result;
 			resolve_delta(child, base, &result);
-			if (i == ref_last && ofs_last == -1)
+			if (i == ref_last && ofs_last < ofs_first)
 				free_base_data(base);
 			find_unresolved_deltas(&result, base);
 		}
@@ -590,7 +588,7 @@ static int compare_delta_entry(const void *a, const void *b)
 /* Parse all objects and return the pack content SHA1 hash */
 static void parse_pack_objects(unsigned char *sha1)
 {
-	int i;
+	uint32_t i;
 	struct delta_entry *delta = deltas;
 	struct stat st;
 
@@ -615,7 +613,7 @@ static void parse_pack_objects(unsigned char *sha1)
 		} else
 			sha1_object(data, obj->size, obj->type, obj->idx.sha1);
 		free(data);
-		display_progress(progress, i+1);
+		display_progress(progress, i + 1);
 	}
 	objects[i].idx.offset = consumed_bytes;
 	stop_progress(&progress);
@@ -726,10 +724,10 @@ static int delta_pos_compare(const void *_a, const void *_b)
 	return a->obj_no - b->obj_no;
 }
 
-static void fix_unresolved_deltas(struct sha1file *f, int nr_unresolved)
+static void fix_unresolved_deltas(struct sha1file *f, uint32_t nr_unresolved)
 {
 	struct delta_entry **sorted_by_pos;
-	int i, n = 0;
+	uint32_t i, n = 0;
 
 	/*
 	 * Since many unresolved deltas may well be themselves base objects
@@ -979,16 +977,17 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 			struct sha1file *f;
 			unsigned char read_sha1[20], tail_sha1[20];
 			char msg[48];
-			int nr_unresolved = nr_deltas - nr_resolved_deltas;
-			int nr_objects_initial = nr_objects;
-			if (nr_unresolved <= 0)
+			uint32_t nr_unresolved, nr_objects_initial;
+			if (nr_resolved_deltas > nr_deltas)
 				die("confusion beyond insanity");
+			nr_unresolved = nr_deltas - nr_resolved_deltas;
+			nr_objects_initial = nr_objects;
 			objects = xrealloc(objects,
 					   (nr_objects + nr_unresolved + 1)
 					   * sizeof(*objects));
 			f = sha1fd(output_fd, curr_pack);
 			fix_unresolved_deltas(f, nr_unresolved);
-			sprintf(msg, "completed with %d local objects",
+			sprintf(msg, "completed with %u local objects",
 				nr_objects - nr_objects_initial);
 			stop_progress_msg(&progress, msg);
 			sha1close(f, tail_sha1, 0);
@@ -1001,7 +1000,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 				    "(disk corruption?)", curr_pack);
 		}
 		if (nr_deltas != nr_resolved_deltas)
-			die("pack has %d unresolved deltas",
+			die("pack has %u unresolved deltas",
 			    nr_deltas - nr_resolved_deltas);
 	}
 	free(deltas);
-- 
1.7.4.2

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]