diff options
author | nicm <nicm> | 2019-09-24 20:44:58 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-09-24 20:44:58 +0000 |
commit | e3359f8349cf972052604c089b5bab71f5e33095 (patch) | |
tree | 1604049179d85325334658c5447d0e1875a806ee /input.c | |
parent | e8adcae0f24c6089cae9c60e7b087a00a582f9f9 (diff) | |
download | rtmux-e3359f8349cf972052604c089b5bab71f5e33095.tar.gz rtmux-e3359f8349cf972052604c089b5bab71f5e33095.tar.bz2 rtmux-e3359f8349cf972052604c089b5bab71f5e33095.zip |
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.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -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 |