summaryrefslogtreecommitdiffstats
path: root/input.c
diff options
context:
space:
mode:
authornicm <nicm>2019-09-24 20:44:58 +0000
committernicm <nicm>2019-09-24 20:44:58 +0000
commite3359f8349cf972052604c089b5bab71f5e33095 (patch)
tree1604049179d85325334658c5447d0e1875a806ee /input.c
parente8adcae0f24c6089cae9c60e7b087a00a582f9f9 (diff)
Some minor performance improvements - most notably, don't search the
input state table if the next character matches the same state as before.
Diffstat (limited to 'input.c')
-rw-r--r--input.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/input.c b/input.c
index f37f8fd8..2ff7a65d 100644
--- a/input.c
+++ b/input.c
@@ -888,7 +888,8 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len)
{
struct input_ctx *ictx = wp->ictx;
struct screen_write_ctx *sctx = &ictx->ctx;
- const struct input_transition *itr;
+ const struct input_state *state = NULL;
+ const struct input_transition *itr = NULL;
size_t off = 0;
if (len == 0)
@@ -916,16 +917,22 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len)
ictx->ch = buf[off++];
/* Find the transition. */
- itr = ictx->state->transitions;
- while (itr->first != -1 && itr->last != -1) {
- if (ictx->ch >= itr->first && ictx->ch <= itr->last)
- break;
- itr++;
- }
- if (itr->first == -1 || itr->last == -1) {
- /* No transition? Eh? */
- fatalx("no transition from state");
+ if (ictx->state != state ||
+ itr == NULL ||
+ ictx->ch < itr->first ||
+ ictx->ch > itr->last) {
+ itr = ictx->state->transitions;
+ while (itr->first != -1 && itr->last != -1) {
+ if (ictx->ch >= itr->first && ictx->ch <= itr->last)
+ break;
+ itr++;
+ }
+ if (itr->first == -1 || itr->last == -1) {
+ /* No transition? Eh? */
+ fatalx("no transition from state");
+ }
}
+ state = ictx->state;
/*
* Any state except print stops the current collection. This is