if (EMPTY(iterator)) return 0;
c = NEXT(iterator);
+ if (EMPTY(iterator)) return 0;
if (c >= '1' && c <= '9')
do
{
length = length * 10 + (c - '0');
+ if (length > (iterator->length - iterator->pos))
+ return 0;
if (EMPTY(iterator)) return 0;
c = NEXT(iterator);
}
- while (c < '0' || c > '9');
-
- else if (c != '0')
- return 0;
+ while (c >= '0' && c <= '9');
- if (EMPTY(iterator) || NEXT(iterator) != ':')
+ else if (c == '0')
+ /* There can be only one */
+ c = NEXT(iterator);
+ else
return 0;
- if (length > (iterator->length - iterator->pos))
+ if (c != ':')
return 0;
*size = length;
switch (iterator->buffer[iterator->pos])
{
case '(': /* A list */
- if (iterator->type == SEXP_START)
- iterator->type = SEXP_LIST;
- else
+ if (iterator->type == SEXP_LIST)
+ /* Skip this list */
return sexp_iterator_enter_list(iterator)
- && sexp_iterator_exit_list(iterator);
+ && sexp_iterator_exit_list(iterator)
+ && sexp_iterator_next(iterator);
+ else
+ {
+ iterator->type = SEXP_LIST;
+ return 1;
+ }
+ case ')':
+ iterator->pos++;
+ iterator->type = SEXP_END;
+ return 1;
+
case '[': /* Atom with display type */
iterator->pos++;
if (!sexp_iterator_simple(iterator,
break;
default:
+ /* Must be either a decimal digit or a syntax error.
+ * Errors are detected by sexp_iterator_simple. */
iterator->display_length = 0;
iterator->display = NULL;
abort();
iterator->level++;
+ iterator->type = SEXP_START;
return 1;
}
if (!iterator->level)
return 0;
- while (sexp_iterator_next(iterator))
- if (iterator->type == SEXP_END)
- {
- if (NEXT(iterator) != ')')
- return 0;
- iterator->level--;
- return 1;
- }
- return 0;
+ for (;;)
+ {
+ if (!sexp_iterator_next(iterator))
+ return 0;
+
+ if (iterator->type == SEXP_END)
+ {
+ iterator->type = SEXP_START;
+ iterator->level--;
+ return 1;
+ }
+ }
}
int
{
case SEXP_LIST:
- if (sexp_iterator_enter_list(iterator)
- && sexp_iterator_next(iterator))
+ if (! (sexp_iterator_enter_list(iterator)
+ && sexp_iterator_next(iterator)))
return 0;
if (iterator->type == SEXP_ATOM
&& !memcmp(keys[i].name, iterator->atom,
keys[i].length))
{
- /* Match found. NOTE: We allow multiple matches. */
- if (!sexp_iterator_next(iterator))
- return 0;
-
/* Record this position. */
values[i] = *iterator;