We take in a "struct object_info" which contains pointers to storage for items the caller cares about. But then rather than pass the whole object to the low-level loose/packed helper functions, we pass the individual pointers. Let's pass the whole struct instead, which will make adding more items later easier. Signed-off-by: Jeff King <peff@xxxxxxxx> --- This one is an optional cleanup. The diff is quite noisy due to all of the s/foo/oi->foo/, so it is arguable whether the result is nicer or not. It would make later additions to object_info nicer, but I do not plan to add any more. It _would_ have been a nice cleanup to do at the beginning of the series (and further diffs would not have to add extra parameters to the function calls), but that would make the incremental "learn to do type optionally" patches quite awkward. So I am on the fence over this one, and do not mind too much if it gets dropped. sha1_file.c | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index 52f7a1e..563f521 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1783,8 +1783,7 @@ static int packed_object_info(struct packed_git *p, off_t obj_offset, } static int packed_object_info(struct packed_git *p, off_t obj_offset, - enum object_type *typep, unsigned long *sizep, - unsigned long *disk_sizep) + struct object_info *oi) { struct pack_window *w_curs = NULL; unsigned long size; @@ -1797,7 +1796,7 @@ static int packed_object_info(struct packed_git *p, off_t obj_offset, */ type = unpack_object_header(p, &w_curs, &curpos, &size); - if (sizep) { + if (oi->sizep) { if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) { off_t tmp_pos = curpos; off_t base_offset = get_delta_base(p, &w_curs, &tmp_pos, @@ -1806,24 +1805,24 @@ static int packed_object_info(struct packed_git *p, off_t obj_offset, type = OBJ_BAD; goto out; } - *sizep = get_size_from_delta(p, &w_curs, tmp_pos); - if (*sizep == 0) { + *oi->sizep = get_size_from_delta(p, &w_curs, tmp_pos); + if (*oi->sizep == 0) { type = OBJ_BAD; goto out; } } else { - *sizep = size; + *oi->sizep = size; } } - if (disk_sizep) { + if (oi->disk_sizep) { struct revindex_entry *revidx = find_pack_revindex(p, obj_offset); - *disk_sizep = revidx[1].offset - obj_offset; + *oi->disk_sizep = revidx[1].offset - obj_offset; } - if (typep) { - *typep = packed_to_object_type(p, obj_offset, type, &w_curs, curpos); - if (*typep < 0) { + if (oi->typep) { + *oi->typep = packed_to_object_type(p, obj_offset, type, &w_curs, curpos); + if (*oi->typep < 0) { type = OBJ_BAD; goto out; } @@ -2404,9 +2403,7 @@ static int sha1_loose_object_info(const unsigned char *sha1, } static int sha1_loose_object_info(const unsigned char *sha1, - enum object_type *typep, - unsigned long *sizep, - unsigned long *disk_sizep) + struct object_info *oi) { int status; unsigned long mapsize, size; @@ -2418,12 +2415,12 @@ static int sha1_loose_object_info(const unsigned char *sha1, * If we don't care about type or size, then we don't * need to look inside the object at all. */ - if (!typep && !sizep) { - if (disk_sizep) { + if (!oi->typep && !oi->sizep) { + if (oi->disk_sizep) { struct stat st; if (stat_sha1_file(sha1, &st) < 0) return -1; - *disk_sizep = st.st_size; + *oi->disk_sizep = st.st_size; } return 0; } @@ -2431,19 +2428,19 @@ static int sha1_loose_object_info(const unsigned char *sha1, map = map_sha1_file(sha1, &mapsize); if (!map) return -1; - if (disk_sizep) - *disk_sizep = mapsize; + if (oi->disk_sizep) + *oi->disk_sizep = mapsize; if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0) status = error("unable to unpack %s header", sha1_to_hex(sha1)); else if ((status = parse_sha1_header(hdr, &size)) < 0) status = error("unable to parse %s header", sha1_to_hex(sha1)); - else if (sizep) - *sizep = size; + else if (oi->sizep) + *oi->sizep = size; git_inflate_end(&stream); munmap(map, mapsize); - if (typep) - *typep = status; + if (oi->typep) + *oi->typep = status; return 0; } @@ -2468,8 +2465,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) if (!find_pack_entry(sha1, &e)) { /* Most likely it's a loose object. */ - if (!sha1_loose_object_info(sha1, oi->typep, - oi->sizep, oi->disk_sizep)) { + if (!sha1_loose_object_info(sha1, oi)) { oi->whence = OI_LOOSE; return 0; } @@ -2480,8 +2476,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) return -1; } - rtype = packed_object_info(e.p, e.offset, oi->typep, oi->sizep, - oi->disk_sizep); + rtype = packed_object_info(e.p, e.offset, oi); if (rtype < 0) { mark_bad_packed_object(e.p, sha1); return sha1_object_info_extended(sha1, oi); -- 1.8.3.rc3.24.gec82cb9 -- 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