Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
packv4-parse.c | 63 ++++++++++++++++++++++++++++++++--------------------------
packv4-parse.h | 8 ++++++++
2 files changed, 43 insertions(+), 28 deletions(-)
diff --git a/packv4-parse.c b/packv4-parse.c
index 63bba03..82661ba 100644
--- a/packv4-parse.c
+++ b/packv4-parse.c
@@ -30,11 +30,38 @@ const unsigned char *get_sha1ref(struct packed_git *p,
return sha1;
}
-struct packv4_dict {
- const unsigned char *data;
- unsigned int nb_entries;
- unsigned int offsets[FLEX_ARRAY];
-};
+struct packv4_dict *pv4_create_dict(const unsigned char *data, int dict_size)
+{
+ struct packv4_dict *dict;
+ int i;
+
+ /* count number of entries */
+ int nb_entries = 0;
+ const unsigned char *cp = data;
+ while (cp < data + dict_size - 3) {
+ cp += 2; /* prefix bytes */
+ cp += strlen((const char *)cp); /* entry string */
+ cp += 1; /* terminating NUL */
+ nb_entries++;
+ }
+ if (cp - data != dict_size) {
+ error("dict size mismatch");
+ return NULL;
+ }
+
+ dict = xmalloc(sizeof(*dict) + nb_entries * sizeof(dict->offsets[0]));
+ dict->data = data;
+ dict->nb_entries = nb_entries;
+
+ cp = data;
+ for (i = 0; i < nb_entries; i++) {
+ dict->offsets[i] = cp - data;
+ cp += 2;
+ cp += strlen((const char *)cp) + 1;
+ }
+
+ return dict;
+}
static struct packv4_dict *load_dict(struct packed_git *p, off_t *offset)
{
@@ -45,7 +72,7 @@ static struct packv4_dict *load_dict(struct packed_git *p,
off_t *offset)
const unsigned char *cp;
git_zstream stream;
struct packv4_dict *dict;
- int nb_entries, i, st;
+ int st;
/* get uncompressed dictionary data size */
src = use_pack(p, &w_curs, curpos, &avail);
@@ -77,32 +104,12 @@ static struct packv4_dict *load_dict(struct packed_git *p,
off_t *offset)
return NULL;
}
- /* count number of entries */
- nb_entries = 0;
- cp = data;
- while (cp < data + dict_size - 3) {
- cp += 2; /* prefix bytes */
- cp += strlen((const char *)cp); /* entry string */
- cp += 1; /* terminating NUL */
- nb_entries++;
- }
- if (cp - data != dict_size) {
- error("dict size mismatch");
+ dict = pv4_create_dict(data, dict_size);
+ if (!dict) {
free(data);
return NULL;
}
- dict = xmalloc(sizeof(*dict) + nb_entries * sizeof(dict->offsets[0]));
- dict->data = data;
- dict->nb_entries = nb_entries;
-
- cp = data;
- for (i = 0; i < nb_entries; i++) {
- dict->offsets[i] = cp - data;
- cp += 2;
- cp += strlen((const char *)cp) + 1;
- }
-
*offset = curpos;
return dict;
}
diff --git a/packv4-parse.h b/packv4-parse.h
index 5f9d809..0b2405a 100644
--- a/packv4-parse.h
+++ b/packv4-parse.h
@@ -1,6 +1,14 @@
#ifndef PACKV4_PARSE_H
#define PACKV4_PARSE_H
+struct packv4_dict {
+ const unsigned char *data;
+ unsigned int nb_entries;
+ unsigned int offsets[FLEX_ARRAY];
+};
+
+struct packv4_dict *pv4_create_dict(const unsigned char *data, int dict_size);
+
void *pv4_get_commit(struct packed_git *p, struct pack_window **w_curs,
off_t offset, unsigned long size);
void *pv4_get_tree(struct packed_git *p, struct pack_window **w_curs,
--
1.8.2.83.gc99314b
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html