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,
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 *
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));