diff options
-rw-r--r-- | sexp.c | 15 | ||||
-rw-r--r-- | sexp.h | 10 |
2 files changed, 24 insertions, 1 deletions
@@ -99,6 +99,8 @@ sexp_iterator_simple(struct sexp_iterator *iterator, static int sexp_iterator_parse(struct sexp_iterator *iterator) { + iterator->start = iterator->pos; + if (EMPTY(iterator)) { if (iterator->level) @@ -208,6 +210,19 @@ sexp_iterator_exit_list(struct sexp_iterator *iterator) return sexp_iterator_parse(iterator); } +const uint8_t * +sexp_iterator_subexpr(struct sexp_iterator *iterator, + unsigned *length) +{ + unsigned start = iterator->start; + if (!sexp_iterator_next(iterator)) + return 0; + + *length = iterator->start - start; + return iterator->buffer + start; +} + + int sexp_iterator_check_type(struct sexp_iterator *iterator, const uint8_t *type) @@ -36,7 +36,9 @@ struct sexp_iterator { unsigned length; const uint8_t *buffer; - + + /* Points at the start of the current sub expression. */ + unsigned start; /* If type is SEXP_LIST, pos points at the start of the current * element. Otherwise, it points at the end. */ unsigned pos; @@ -75,6 +77,12 @@ sexp_iterator_enter_list(struct sexp_iterator *iterator); int sexp_iterator_exit_list(struct sexp_iterator *iterator); +/* Gets start and length of the current subexpression. Implies + * sexp_iterator_next. */ +const uint8_t * +sexp_iterator_subexpr(struct sexp_iterator *iterator, + unsigned *length); + /* Checks the type of the current expression, which should be a list * |