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;