diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/other/hexedit.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/toys/other/hexedit.c b/toys/other/hexedit.c index 9e9ca11e..404095e6 100644 --- a/toys/other/hexedit.c +++ b/toys/other/hexedit.c @@ -4,7 +4,7 @@ * * No standard -USE_HEXEDIT(NEWTOY(hexedit, "<1>1r", TOYFLAG_USR|TOYFLAG_BIN)) +USE_HEXEDIT(NEWTOY(hexedit, "<1>1r", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LOCALE)) config HEXEDIT bool "hexedit" @@ -46,6 +46,7 @@ static void fix_terminal(void) esc("?25h"); esc("0m"); jump(0, 999); + esc("K"); } static void sigttyreset(int i) @@ -73,6 +74,40 @@ static void draw_char(char broiled) } else printf("%c", broiled); } +static void draw_tail(void) +{ + int i = 0, width = 0, w, len; + char *start = *toys.optargs, *end; + + jump(0, TT.height); + esc("K"); + + // First time, make sure we fit in 71 chars (advancing start as necessary). + // Second time, print from start to end, escaping nonprintable chars. + for (i=0; i<2; i++) { + for (end = start; *end;) { + wchar_t wc; + + len = mbrtowc(&wc, end, 99, 0); + if (len<0 || wc<32 || (w = wcwidth(wc))<0) { + len = w = 1; + if (i) draw_char(*end); + } else if (i) fwrite(end, len, 1, stdout); + end += len; + + if (!i) { + width += w; + while (width > 71) { + len = mbrtowc(&wc, start, 99, 0); + if (len<0 || wc<32 || (w = wcwidth(wc))<0) len = w = 1; + width -= w; + start += len; + } + } + } + } +} + static void draw_line(long long yy) { int x, xx = 16; @@ -99,6 +134,7 @@ static void draw_page(void) if (y) printf("\r\n"); draw_line(y); } + draw_tail(); } // side: 0 = editing left, 1 = editing right, 2 = clear, 3 = read only @@ -171,7 +207,7 @@ void hexedit_main(void) // Display cursor highlight(x, y, ro ? 3 : side); - fflush(0); + xprintf(""); // Wait for next key key = scan_key(toybuf, keys, 1); @@ -204,8 +240,7 @@ void hexedit_main(void) if (TT.base) { TT.base--; esc("1T"); - jump(0, TT.height); - esc("K"); + draw_tail(); jump(0, 0); draw_line(0); } @@ -218,6 +253,7 @@ down: esc("1S"); jump(0, TT.height-1); draw_line(TT.height-1); + draw_tail(); } if (++y>=TT.height) y--; } else if (key==KEY_RIGHT) { |