tled: extract led_readchar() - neatvi - [fork] simple vi-type editor with UTF-8… | |
git clone git://src.adamsgaard.dk/neatvi | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 5baa996edd56e5540772d0b8829946dd91944ac3 | |
parent c54948868fdd6994a66acff21cb980fef4356465 | |
Author: Ali Gholami Rudi <[email protected]> | |
Date: Wed, 17 Jun 2015 20:03:34 +0430 | |
led: extract led_readchar() | |
Diffstat: | |
M led.c | 52 ++++++++++++++---------------… | |
1 file changed, 24 insertions(+), 28 deletions(-) | |
--- | |
diff --git a/led.c b/led.c | |
t@@ -178,25 +178,34 @@ static void led_printparts(char *ai, char *pref, char *m… | |
term_commit(); | |
} | |
-static char *led_digraph(void) | |
+/* continue reading the character starting with c */ | |
+static char *led_readchar(int c, char *kmap) | |
{ | |
+ static char buf[8]; | |
int c1, c2; | |
int i; | |
- c1 = term_read(-1); | |
- if (TK_INT(c1)) | |
- return NULL; | |
- c2 = term_read(-1); | |
- if (TK_INT(c2)) | |
+ if (c == TK_CTL('v')) { /* literal character */ | |
+ buf[0] = term_read(-1); | |
+ buf[1] = '\0'; | |
+ return buf; | |
+ } | |
+ if (c == TK_CTL('k')) { /* digraph */ | |
+ c1 = term_read(-1); | |
+ if (TK_INT(c1)) | |
+ return NULL; | |
+ c2 = term_read(-1); | |
+ if (TK_INT(c2)) | |
+ return NULL; | |
+ for (i = 0; i < LEN(digraphs); i++) | |
+ if (digraphs[i][0][0] == c1 && digraphs[i][0][1] == c2) | |
+ return digraphs[i][1]; | |
return NULL; | |
- for (i = 0; i < LEN(digraphs); i++) | |
- if (digraphs[i][0][0] == c1 && digraphs[i][0][1] == c2) | |
- return digraphs[i][1]; | |
- return NULL; | |
+ } | |
+ return kmap_map(kmap, c); | |
} | |
char *led_read(char **kmap) | |
{ | |
- static char buf[8]; | |
int c = term_read(-1); | |
while (!TK_INT(c)) { | |
switch (c) { | |
t@@ -206,14 +215,8 @@ char *led_read(char **kmap) | |
case TK_CTL('e'): | |
*kmap = kmap_en[0]; | |
break; | |
- case TK_CTL('v'): | |
- buf[0] = term_read(-1); | |
- buf[1] = '\0'; | |
- return buf; | |
- case TK_CTL('k'): | |
- return led_digraph(); | |
default: | |
- return kmap_map(*kmap, c); | |
+ return led_readchar(c, *kmap); | |
} | |
c = term_read(-1); | |
} | |
t@@ -225,7 +228,7 @@ static char *led_line(char *pref, char *post, char *ai, in… | |
struct sbuf *sb; | |
int ai_len = strlen(ai); | |
int c, lnmode; | |
- char *dig; | |
+ char *cs; | |
sb = sbuf_make(); | |
if (!pref) | |
pref = ""; | |
t@@ -249,14 +252,6 @@ static char *led_line(char *pref, char *post, char *ai, i… | |
case TK_CTL('u'): | |
sbuf_cut(sb, 0); | |
break; | |
- case TK_CTL('k'): | |
- dig = led_digraph(); | |
- if (dig) | |
- sbuf_str(sb, dig); | |
- break; | |
- case TK_CTL('v'): | |
- sbuf_chr(sb, term_read(-1)); | |
- break; | |
case TK_CTL('w'): | |
if (sbuf_len(sb)) | |
sbuf_cut(sb, led_lastword(sbuf_buf(sb))); | |
t@@ -277,7 +272,8 @@ static char *led_line(char *pref, char *post, char *ai, in… | |
default: | |
if (c == '\n' || TK_INT(c)) | |
break; | |
- sbuf_str(sb, kmap_map(*kmap, c)); | |
+ if ((cs = led_readchar(c, *kmap))) | |
+ sbuf_str(sb, cs); | |
} | |
if (c == '\n' || TK_INT(c)) | |
break; |