From cea914e18e32a4c35421b94dc8cc133e5b65d57f Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Fri, 30 Oct 2015 09:43:28 +1100 Subject: [PATCH] Add q_last_type() queue function Analogous to q_cur_type(), asserts that queue indices are within a valid range. --- src/nfa/nfa_api_queue.h | 8 ++++++++ src/rose/catchup.c | 2 +- src/rose/match.c | 4 ++-- src/rose/stream.c | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/nfa/nfa_api_queue.h b/src/nfa/nfa_api_queue.h index d8079292..75c15cce 100644 --- a/src/nfa/nfa_api_queue.h +++ b/src/nfa/nfa_api_queue.h @@ -196,6 +196,14 @@ static really_inline s64a q_cur_loc(const struct mq *q) { return q->items[q->cur].location; } +/** \brief Returns the type of the last event in the queue. */ +static really_inline u32 q_last_type(const struct mq *q) { + assert(q->cur < q->end); + assert(q->end > 0); + assert(q->end <= MAX_MQE_LEN); + return q->items[q->end - 1].type; +} + /** \brief Returns the location (relative to the beginning of the current data * buffer) of the last event in the queue. */ static really_inline s64a q_last_loc(const struct mq *q) { diff --git a/src/rose/catchup.c b/src/rose/catchup.c index b9fcd784..77b12b49 100644 --- a/src/rose/catchup.c +++ b/src/rose/catchup.c @@ -379,7 +379,7 @@ void ensureEnd(struct mq *q, UNUSED u32 qi, s64a final_loc) { DEBUG_PRINTF("ensure MQE_END %lld for queue %u\n", final_loc, qi); if (final_loc >= q_last_loc(q)) { /* TODO: ensure situation does not arise */ - assert(q->items[q->end - 1].type != MQE_END); + assert(q_last_type(q) != MQE_END); pushQueueNoMerge(q, MQE_END, final_loc); } } diff --git a/src/rose/match.c b/src/rose/match.c index 32224c24..be9bc35e 100644 --- a/src/rose/match.c +++ b/src/rose/match.c @@ -758,7 +758,7 @@ found_miracle: q_skip_forward_to(q, miracle_loc); - if (q->items[q->end - 1].type == MQE_START) { + if (q_last_type(q) == MQE_START) { DEBUG_PRINTF("miracle caused infix to die\n"); return 0; } @@ -853,7 +853,7 @@ char roseTestLeftfix(const struct RoseEngine *t, const struct RoseRole *tr, } } - if (q_cur_loc(q) < loc || q->items[q->end - 1].type != MQE_START) { + if (q_cur_loc(q) < loc || q_last_type(q) != MQE_START) { if (left->infix) { if (infixTooOld(q, loc)) { DEBUG_PRINTF("infix %u died of old age\n", ri); diff --git a/src/rose/stream.c b/src/rose/stream.c index aab79a29..b100eeae 100644 --- a/src/rose/stream.c +++ b/src/rose/stream.c @@ -167,7 +167,7 @@ found_miracle: DEBUG_PRINTF("skip q forward, %lld to %lld\n", begin_loc, miracle_loc); q_skip_forward_to(q, miracle_loc); - if (q->items[q->end - 1].type == MQE_START) { + if (q_last_type(q) == MQE_START) { DEBUG_PRINTF("miracle caused infix to die\n"); return MIRACLE_DEAD; }