{"thread":{"id":"5393","subject":"[PATCH 5/5] Convert unpack_entry_gently and friends to use offsets.","startedAt":"2006-08-26T08:12:27Z","lastAt":"2006-08-26T08:12:27Z","messageCount":1,"participants":["Shawn Pearce"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"25929","messageId":"20060826081227.GG22343@spearce.org","threadId":"5393","inReplyTo":null,"subject":"[PATCH 5/5] Convert unpack_entry_gently and friends to use offsets.","fromName":"Shawn Pearce","fromEmail":"spearce@spearce.org","sentAt":"2006-08-26T08:12:27Z","receivedAt":"2006-08-26T08:12:27Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Change unpack_entry_gently and its helper functions to use offsets\nrather than addresses and left counts to supply pack position\ninformation.  In most cases this makes the code easier to follow,\nand it reduces the number of local variables in a few functions.\nIt also better prepares this code for mapping partial segments of\npacks and altering what regions of a pack are mapped while unpacking\nan entry.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n sha1_file.c |   33 +++++++++++++++------------------\n 1 files changed, 15 insertions(+), 18 deletions(-)\n\ndiff --git a/sha1_file.c b/sha1_file.c\nindex e6d47c1..558ec4a 100644\n--- a/sha1_file.c\n+++ b/sha1_file.c\n@@ -1041,9 +1041,9 @@ static int packed_object_info(struct pac\n \treturn 0;\n }\n \n-static void *unpack_compressed_entry(unsigned char *data,\n-\t\t\t\t    unsigned long size,\n-\t\t\t\t    unsigned long left)\n+static void *unpack_compressed_entry(struct packed_git *p,\n+\t\t\t\t    unsigned long offset,\n+\t\t\t\t    unsigned long size)\n {\n \tint st;\n \tz_stream stream;\n@@ -1052,8 +1052,8 @@ static void *unpack_compressed_entry(uns\n \tbuffer = xmalloc(size + 1);\n \tbuffer[size] = 0;\n \tmemset(&stream, 0, sizeof(stream));\n-\tstream.next_in = data;\n-\tstream.avail_in = left;\n+\tstream.next_in = (unsigned char*)p->pack_base + offset;\n+\tstream.avail_in = p->pack_size - offset;\n \tstream.next_out = buffer;\n \tstream.avail_out = size;\n \n@@ -1068,21 +1068,22 @@ static void *unpack_compressed_entry(uns\n \treturn buffer;\n }\n \n-static void *unpack_delta_entry(unsigned char *base_sha1,\n+static void *unpack_delta_entry(struct packed_git *p,\n+\t\t\t\tunsigned long offset,\n \t\t\t\tunsigned long delta_size,\n-\t\t\t\tunsigned long left,\n \t\t\t\tchar *type,\n-\t\t\t\tunsigned long *sizep,\n-\t\t\t\tstruct packed_git *p)\n+\t\t\t\tunsigned long *sizep)\n {\n \tstruct pack_entry base_ent;\n \tvoid *delta_data, *result, *base;\n \tunsigned long result_size, base_size;\n+\tunsigned char* base_sha1;\n \n-\tif (left < 20)\n+\tif ((offset + 20) >= p->pack_size)\n \t\tdie(\"truncated pack file\");\n \n \t/* The base entry _must_ be in the same pack */\n+\tbase_sha1 = (unsigned char*)p->pack_base + offset;\n \tif (!find_pack_entry_one(base_sha1, &base_ent, p))\n \t\tdie(\"failed to find delta-pack base object %s\",\n \t\t    sha1_to_hex(base_sha1));\n@@ -1091,8 +1092,7 @@ static void *unpack_delta_entry(unsigned\n \t\tdie(\"failed to read delta-pack base object %s\",\n \t\t    sha1_to_hex(base_sha1));\n \n-\tdelta_data = unpack_compressed_entry(base_sha1 + 20,\n-\t\t\t     delta_size, left - 20);\n+\tdelta_data = unpack_compressed_entry(p, offset + 20, delta_size);\n \tresult = patch_delta(base, base_size,\n \t\t\t     delta_data, delta_size,\n \t\t\t     &result_size);\n@@ -1124,23 +1124,20 @@ void *unpack_entry_gently(struct pack_en\n \t\t\t  char *type, unsigned long *sizep)\n {\n \tstruct packed_git *p = entry->p;\n-\tunsigned long offset, size, left;\n-\tunsigned char *pack;\n+\tunsigned long offset, size;\n \tenum object_type kind;\n \n \toffset = unpack_object_header(p, entry->offset, &kind, &size);\n-\tpack = (unsigned char *) p->pack_base + offset;\n-\tleft = p->pack_size - offset;\n \tswitch (kind) {\n \tcase OBJ_DELTA:\n-\t\treturn unpack_delta_entry(pack, size, left, type, sizep, p);\n+\t\treturn unpack_delta_entry(p, offset, size, type, sizep);\n \tcase OBJ_COMMIT:\n \tcase OBJ_TREE:\n \tcase OBJ_BLOB:\n \tcase OBJ_TAG:\n \t\tstrcpy(type, type_names[kind]);\n \t\t*sizep = size;\n-\t\treturn unpack_compressed_entry(pack, size, left);\n+\t\treturn unpack_compressed_entry(p, offset, size);\n \tdefault:\n \t\treturn NULL;\n \t}\n-- \n1.4.2.g6580\n"}]}