aboutsummaryrefslogtreecommitdiff
path: root/toys/other/hexedit.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2015-05-13 01:34:01 -0500
committerRob Landley <rob@landley.net>2015-05-13 01:34:01 -0500
commit5ea14bd1c246f7571d466d18385db22f59ac3262 (patch)
tree2e530256af6bc880ec79d2c8a107c1675c921627 /toys/other/hexedit.c
parent913a7796bb47e0b65c4f28920c39a87c6b6211dd (diff)
downloadtoybox-5ea14bd1c246f7571d466d18385db22f59ac3262.tar.gz
Print name of file at the bottom of the screen.
And yes, I tested $PWD/私はガラスを食べられま す。それは私を傷つけません。 as a name and made it work. If you throw newlines or ascii escapes in the name it'll use the fancy printing logic for chars, otherwise it does the full utf8 fontmetrics deal.
Diffstat (limited to 'toys/other/hexedit.c')
-rw-r--r--toys/other/hexedit.c44
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) {