diff options
author | John MacFarlane <fiddlosopher@gmail.com> | 2014-11-28 12:38:37 -0800 |
---|---|---|
committer | John MacFarlane <fiddlosopher@gmail.com> | 2014-11-28 12:39:01 -0800 |
commit | 9e9b74fe465d95f1d827de1825a18c39810c0816 (patch) | |
tree | 4f89f8ad9d07bcd9c39604499dfd6736de6744b8 | |
parent | d94d592d2b76c2f0c4bc27ab74ff145ee1e390f5 (diff) |
Clarified logic in remove_delimiter.
Motivated by warnings from clang static analyzer.
-rw-r--r-- | src/inlines.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/inlines.c b/src/inlines.c index 49dc781..5c28436 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -294,13 +294,19 @@ static void print_delimiters(subject *subj) static void remove_delimiter(subject *subj, delimiter_stack *stack) { - if (stack->previous != NULL) { - stack->previous->next = stack->next; - } + if (stack == NULL) return; if (stack->next == NULL) { - // top of stack + // top of stack: + assert(stack == subj->delimiters); + if (stack->previous != NULL) { + stack->previous->next = NULL; + } subj->delimiters = stack->previous; - } else { + } else if (stack->previous == NULL) { + // bottom of stack, with something above it + stack->next->previous = NULL; + } else { // neither top nor bottom: + stack->previous->next = stack->next; stack->next->previous = stack->previous; } free(stack); |