diff --git a/test/string.c b/test/string.c index f379d05..6c30031 100644 --- a/test/string.c +++ b/test/string.c @@ -38,6 +38,7 @@ int main(void) { TEST(utflen("$€𐍈") == 3); TEST(utfpos(NULL, 0) == 0); + TEST(utfpos("ab", -1) == 0); TEST(utfpos("äbc", 0) == 0); TEST(utfpos("äbc", 1) == 2); TEST(utfpos("äbc", 2) == 3); diff --git a/tim.h b/tim.h index 357b917..d8a12c7 100644 --- a/tim.h +++ b/tim.h @@ -455,11 +455,8 @@ static int utflen(const char* s) { // index of utf8 code point at pos static int utfpos(const char* s, int pos) { - if (pos < 0) { - return 0; - } int i = 0; - for (int n = 0; s && s[i]; i++) { + for (int n = 0; pos >= 0 && s && s[i]; i++) { n += (s[i] & 192) != 128; if (n == pos + 1) { return i; @@ -580,17 +577,10 @@ static void reset_terminal(void) { static bool parse_input(struct event* restrict e, int n) { char* s = e->str; - if (s[0] == 127 && n == 1) { - // xterm backspace - e->type = KEY_EVENT; - e->key = BACKSPACE_KEY; - return true; - } - - if (s[0] != 27 || n == 1) { + if (n == 1 || s[0] != 27) { // regular key press e->type = KEY_EVENT; - e->key = utfchr(s); + e->key = s[0] == 127 ? BACKSPACE_KEY : utfchr(s); return true; } @@ -624,7 +614,7 @@ static bool parse_input(struct event* restrict e, int n) { {"[6~", PAGEDOWN_KEY}, }; - if (s[0] == 27 && (n == 3 || n == 4)) { + if ((n == 3 || n == 4) && s[0] == 27) { // key sequence for (int i = 0; i < ARRAY_SIZE(key_table); i++) { if (!memcmp(s + 1, key_table[i].s, n - 1)) { @@ -1314,9 +1304,9 @@ static void render(void) { if (new_line || wide_flank || skip) { put_str(S("\33[")); put_int((i / tim.w) + 1); - put_str(S(";")); + put_chr(';'); put_int((i % tim.w) + 1); - put_str(S("H")); + put_chr('H'); } wide = c.wide || wide_spill; skip = false;