untracked-cache: simplify parsing by dropping "next"
When we parse an on-disk untracked cache, we have two pointers, "data" and "next". As we parse, we point "next" to the end of an element, and then later update "data" to match. But we actually don't need two pointers. Each parsing step can just update "data" directly from other variables we hold (and we don't have to worry about bailing in an intermediate state, since any parsing failure causes us to immediately discard "data" and return). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Apr 18, 2019 at 17:17 UTC
b511d6d569ce8baee888700ebd12f82d991a5250
1 file changed
+7
-13
dir.c
+7
-13
@@ -2732,50 +2732,44 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
2732
struct read_data *rd)
2733
{
2734
struct untracked_cache_dir ud, *untracked;
2735
- const unsigned char *next, *data = rd->data, *end = rd->end;
2735
+ const unsigned char *data = rd->data, *end = rd->end;
2736
const unsigned char *eos;
2737
unsigned int value;
2738
int i, len;
2739
2740
memset(&ud, 0, sizeof(ud));
2741
2742
- next = data;
2743
- value = decode_varint(&next);
2744
- if (next > end)
2742
+ value = decode_varint(&data);
2743
+ if (data > end)
2744
return -1;
2745
ud.recurse = 1;
2746
ud.untracked_alloc = value;
2747
ud.untracked_nr = value;
2748
if (ud.untracked_nr)
2749
ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
2751
- data = next;
2750
2753
- next = data;
2754
- ud.dirs_alloc = ud.dirs_nr = decode_varint(&next);
2755
- if (next > end)
2751
+ ud.dirs_alloc = ud.dirs_nr = decode_varint(&data);
2752
+ if (data > end)
2753
return -1;
2754
ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
2758
- data = next;
2755
2756
eos = memchr(data, '\0', end - data);
2757
if (!eos || eos == end)
2758
return -1;
2759
len = eos - data;
2764
- next = eos + 1;
2760
2761
*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), len, 1));
2762
memcpy(untracked, &ud, sizeof(ud));
2763
memcpy(untracked->name, data, len + 1);
2769
- data = next;
2764
+ data = eos + 1;
2765
2766
for (i = 0; i < untracked->untracked_nr; i++) {
2767
eos = memchr(data, '\0', end - data);
2768
if (!eos || eos == end)
2769
return -1;
2770
len = eos - data;
2776
- next = eos + 1;
2771
untracked->untracked[i] = xmemdupz(data, len);
2778
- data = next;
2772
+ data = eos + 1;
2773
}
2774
2775
rd->ucd[rd->index++] = untracked;