From: Niels Möller Date: Sun, 28 Dec 2025 18:39:24 +0000 (+0100) Subject: Rewrite sexp_iterator_exit_list to not recurse to sexp_iterator_next. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21272bd84d7a04e34882db44d0ad157cf01a00c2;p=thirdparty%2Fnettle.git Rewrite sexp_iterator_exit_list to not recurse to sexp_iterator_next. --- diff --git a/sexp.c b/sexp.c index 3ef4b6bc..fe09a1a4 100644 --- a/sexp.c +++ b/sexp.c @@ -214,30 +214,29 @@ sexp_iterator_exit_list(struct sexp_iterator *iterator) if (!iterator->level) return 0; - while(iterator->type != SEXP_END) - if (!sexp_iterator_next(iterator)) - return 0; - - iterator->level--; - - return sexp_iterator_parse(iterator); -} - -#if 0 -/* What's a reasonable interface for this? */ -int -sexp_iterator_exit_lists(struct sexp_iterator *iterator, - unsigned level) -{ - assert(iterator->level >= level); - - while (iterator->level > level) - if (!sexp_iterator_exit_list(iterator)) - return 0; - - return 1; + unsigned start_level = iterator->level; + for (;;) + switch (iterator->type) + { + case SEXP_END: + iterator->level--; + if (!sexp_iterator_parse (iterator)) + return 0; + if (iterator->level < start_level) + return 1; + break; + case SEXP_ATOM: + if (!sexp_iterator_parse (iterator)) + return 0; + break; + case SEXP_LIST: + if (!sexp_iterator_enter_list (iterator)) + return 0; + break; + default: + abort (); + } } -#endif const uint8_t * sexp_iterator_subexpr(struct sexp_iterator *iterator, diff --git a/sexp.h b/sexp.h index f6b3df64..587cd48d 100644 --- a/sexp.h +++ b/sexp.h @@ -105,14 +105,6 @@ sexp_iterator_enter_list(struct sexp_iterator *iterator); int sexp_iterator_exit_list(struct sexp_iterator *iterator); -#if 0 -/* Skips out of as many lists as necessary to get back to the given - * level. */ -int -sexp_iterator_exit_lists(struct sexp_iterator *iterator, - unsigned level); -#endif - /* Gets start and length of the current subexpression. Implies * sexp_iterator_next. */ const uint8_t * diff --git a/testsuite/sexp-test.c b/testsuite/sexp-test.c index c1d421fc..84b228cd 100644 --- a/testsuite/sexp-test.c +++ b/testsuite/sexp-test.c @@ -73,7 +73,7 @@ test_main(void) static const char * const keys[2] = { "n", "e" }; struct sexp_iterator v[2]; - ASSERT(sexp_iterator_first(&i, LDATA("((1:n2:xx3:foo)0:(1:y)(1:e))"))); + ASSERT(sexp_iterator_first(&i, LDATA("((1:n2:xx3:foo)((((((1:z))))))0:(1:y)(1:e))"))); ASSERT(sexp_iterator_enter_list(&i) && sexp_iterator_assoc(&i, 2, keys, v));