Also use fast find for pending mode

This commit is contained in:
Kovid Goyal
2023-11-10 08:30:15 +05:30
parent 8dca5a6b9a
commit 8b4209cb97

View File

@@ -396,8 +396,7 @@ consume_esc(PS *self) {
static bool static bool
find_st_terminator(PS *self, size_t *end_pos) { find_st_terminator(PS *self, size_t *end_pos) {
const size_t sz = self->read.sz - self->read.pos; const size_t sz = self->read.sz - self->read.pos;
uint8_t *haystack = self->buf + self->read.pos; uint8_t *q = find_either_of_two_chars(self->buf + self->read.pos, sz, BEL, ESC_ST);
uint8_t *q = find_either_of_two_chars(haystack, sz, BEL, ESC_ST);
if (q == NULL) { if (q == NULL) {
self->read.pos += sz; self->read.pos += sz;
return false; return false;
@@ -1447,22 +1446,21 @@ consume_input(PS *self) {
static bool static bool
find_pending_stop_csi(PS *self) { find_pending_stop_csi(PS *self) {
// TODO: Make this faster with SIMD const size_t sz = self->read.sz - self->read.pos;
for(; self->read.pos < self->read.sz; self->read.pos++) { uint8_t *q = find_either_of_two_chars(self->buf + self->read.pos, sz, ESC, 'l');
uint8_t ch = self->buf[self->read.pos]; if (q == NULL) {
switch(ch) { self->read.pos += sz;
case 'l': return false;
if ( }
self->read.pos >= self->read.consumed + pmslen && switch(*q) {
memcmp(self->buf + self->read.pos - pmslen + 1, pending_mode_sentinel, pmslen) == 0 case 'l':
) return true; self->pending_mode.state = PENDING_NORMAL;
self->pending_mode.state = PENDING_NORMAL; self->read.pos = q - self->buf + 1;
return false; return self->read.pos > self->read.consumed + pmslen && memcmp(self->buf + self->read.pos - pmslen, pending_mode_sentinel, pmslen) == 0;
case ESC: case ESC:
self->pending_mode.state = PENDING_ESC; self->pending_mode.state = PENDING_ESC;
self->read.pos++; self->read.pos = q - self->buf + 1;
return false; break;
}
} }
return false; return false;
} }