tled: extract led_readchar() - neatvi - [fork] simple vi-type editor with UTF-8 support
(HTM) git clone git://src.adamsgaard.dk/neatvi
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit 5baa996edd56e5540772d0b8829946dd91944ac3
(DIR) parent c54948868fdd6994a66acff21cb980fef4356465
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
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(-)
---
(DIR) diff --git a/led.c b/led.c
t@@ -178,25 +178,34 @@ static void led_printparts(char *ai, char *pref, char *main, char *post, char *k
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, int ai_max, int *key, ch
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, int ai_max, int *key, ch
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, int ai_max, int *key, ch
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;