The name dictionary is loaded if not already done.  We know it is
located right after the SHA1 table (20 bytes per object) which is
itself right after the 12-byte header.

Then the index is parsed from the input buffer and a pointer to the
corresponding entry is returned.

Signed-off-by: Nicolas Pitre <n...@fluxnic.net>
---
 cache.h        |  3 +++
 packv4-parse.c | 24 ++++++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/cache.h b/cache.h
index 59d9ba7..6ce327e 100644
--- a/cache.h
+++ b/cache.h
@@ -1015,6 +1015,8 @@ struct pack_window {
        unsigned int inuse_cnt;
 };
 
+struct packv4_dict;
+
 extern struct packed_git {
        struct packed_git *next;
        struct pack_window *windows;
@@ -1027,6 +1029,7 @@ extern struct packed_git {
        unsigned char *bad_object_sha1;
        int version;
        int index_version;
+       struct packv4_dict *name_dict;
        time_t mtime;
        int pack_fd;
        unsigned pack_local:1,
diff --git a/packv4-parse.c b/packv4-parse.c
index 26894bc..074e107 100644
--- a/packv4-parse.c
+++ b/packv4-parse.c
@@ -105,3 +105,27 @@ static struct packv4_dict *load_dict(struct packed_git *p, 
off_t *offset)
        *offset = curpos;
        return dict;
 }
+
+static void load_name_dict(struct packed_git *p)
+{
+       off_t offset = 12 + p->num_objects * 20;
+       struct packv4_dict *names = load_dict(p, &offset);
+       if (!names)
+               die("bad pack name dictionary in %s", p->pack_name);
+       p->name_dict = names;
+}
+
+const unsigned char *get_nameref(struct packed_git *p, const unsigned char 
**srcp)
+{
+       unsigned int index;
+
+       if (!p->name_dict)
+               load_name_dict(p);
+
+       index = decode_varint(srcp);
+       if (index >= p->name_dict->nb_entries) {
+               error("%s: index overflow", __func__);
+               return NULL;
+       }
+       return p->name_dict->data + p->name_dict->offsets[index];
+}
-- 
1.8.4.38.g317e65b

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

Reply via email to