fix some bugs - lchat - A line oriented chat front end for ii. | |
git clone git://git.suckless.org/lchat | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit bb7df7358d69a9cdc41ab99469fcc75b36fd12f6 | |
parent 3c88c1a6fece6f3e92dc4876fbc9609394d22f47 | |
Author: Jan Klemkow <[email protected]> | |
Date: Sat, 9 Jul 2016 22:47:39 +0200 | |
fix some bugs | |
Diffstat: | |
M sl_test.c | 27 ++++++++++++++++++--------- | |
M slackline.c | 11 +++++++++-- | |
2 files changed, 27 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/sl_test.c b/sl_test.c | |
@@ -15,11 +15,13 @@ strokes(struct slackline *sl, const char *str) | |
static void | |
print_state(struct slackline *sl) | |
{ | |
- printf("rcur: %zu bcur: %zu rlen: %zu blen: %zu buf: \"%s\" ", | |
- sl->rcur, sl->bcur, sl->rlen, sl->blen, sl->buf); | |
+ size_t l = sl->last - sl->buf; | |
+ | |
+ printf("rcur: %zu bcur: %zu rlen: %zu blen: %zu l: %zu buf: \"%s\" ", | |
+ sl->rcur, sl->bcur, sl->rlen, sl->blen, l, sl->buf); | |
for (size_t i = 0; i < strlen(sl->buf); i++) | |
- printf("%2x", sl->buf[i]); | |
+ printf("%X", sl->buf[i] & 0xff); | |
putchar('\n'); | |
} | |
@@ -65,22 +67,29 @@ check_ascii(struct slackline *sl) | |
static void | |
check_utf8(struct slackline *sl) | |
{ | |
- /* ae | oe | ue */ | |
- strokes(sl, "\xC3\xA4\xC3\xBC\xC3\xB6"); | |
+ /* ae | oe | ue | ss */ | |
+ strokes(sl, "\xC3\xA4\xC3\xBC\xC3\xB6\xC3\x9F"); | |
+ assert(sl->blen == 8); | |
+ assert(sl->rlen == 4); | |
+ assert(sl->bcur == 8); | |
+ assert(sl->rcur == 4); | |
+ assert(sl->last - sl->buf == sl->blen); | |
+ | |
+ strokes(sl, "\x08"); /* backspace */ | |
assert(sl->blen == 6); | |
assert(sl->rlen == 3); | |
assert(sl->bcur == 6); | |
assert(sl->rcur == 3); | |
assert(sl->last - sl->buf == sl->blen); | |
- strokes(sl, "\x08"); /* backspace */ | |
- assert(sl->blen == 4); | |
- assert(sl->rlen == 2); | |
+ strokes(sl, "\x1b[D"); /* left arrow key */ | |
+ assert(sl->blen == 6); | |
+ assert(sl->rlen == 3); | |
assert(sl->bcur == 4); | |
assert(sl->rcur == 2); | |
assert(sl->last - sl->buf == sl->blen); | |
- strokes(sl, "\x1b[D"); /* left arrow key */ | |
+ strokes(sl, "\x08"); /* backspace */ | |
assert(sl->blen == 4); | |
assert(sl->rlen == 2); | |
assert(sl->bcur == 2); | |
diff --git a/slackline.c b/slackline.c | |
@@ -126,18 +126,22 @@ sl_keystroke(struct slackline *sl, int key) | |
if (sl->rcur < sl->rlen) | |
sl->rcur++; | |
sl->bcur = sl_postobyte(sl, sl->rcur); | |
+ sl->ptr = sl->buf + sl->bcur; | |
break; | |
case 'D': /* left */ | |
if (sl->rcur > 0) | |
sl->rcur--; | |
sl->bcur = sl_postobyte(sl, sl->rcur); | |
+ sl->ptr = sl->buf + sl->bcur; | |
break; | |
case 'H': /* Home */ | |
sl->bcur = sl->rcur = 0; | |
+ sl->ptr = sl->buf; | |
break; | |
case 'F': /* End */ | |
sl->rcur = sl->rlen; | |
sl->bcur = sl_postobyte(sl, sl->rcur); | |
+ sl->ptr = sl->buf + sl->bcur; | |
break; | |
} | |
sl->esc = ESC_NONE; | |
@@ -161,11 +165,14 @@ sl_keystroke(struct slackline *sl, int key) | |
sl->rcur--; | |
sl->rlen--; | |
- sl->last -= sl->ptr - ncur; | |
- sl->ptr = ncur; | |
sl->bcur = sl_postobyte(sl, sl->rcur); | |
sl->blen = sl_postobyte(sl, sl->rlen); | |
+ | |
+ sl->last -= sl->ptr - ncur; | |
*sl->last = '\0'; | |
+ | |
+ sl->ptr = ncur; | |
+ | |
return 0; | |
} | |