diff options
author | Denys Vlasenko | 2010-04-16 20:55:52 -0700 |
---|---|---|
committer | Denys Vlasenko | 2010-04-16 20:55:52 -0700 |
commit | 2bb651ae10e36999949812d3ac4f7789ed665037 (patch) | |
tree | 01474cd07b98a67d419078a114b65aeb1c44c3a5 | |
parent | 6f69f2dbc6dec739a576d6403551784453db59f3 (diff) | |
download | busybox-2bb651ae10e36999949812d3ac4f7789ed665037.zip busybox-2bb651ae10e36999949812d3ac4f7789ed665037.tar.gz |
vi: code shrink; save/restore errno in signal handlers
function old new delta
query_screen_dimensions - 54 +54
suspend_sig 50 64 +14
cont_sig 65 66 +1
catch_sig 42 32 -10
winch_sig 88 60 -28
edit_file 719 671 -48
refresh 848 767 -81
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/4 up/down: 69/-167) Total: -98 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/vi.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/editors/vi.c b/editors/vi.c index 633d42a..94d36ae 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -502,6 +502,19 @@ static int init_text_buffer(char *fn) return rc; } +#if ENABLE_FEATURE_VI_WIN_RESIZE +static void query_screen_dimensions(void) +{ + get_terminal_width_height(STDIN_FILENO, &columns, &rows); + if (rows > MAX_SCR_ROWS) + rows = MAX_SCR_ROWS; + if (columns > MAX_SCR_COLS) + columns = MAX_SCR_COLS; +} +#else +# define query_screen_dimensions() ((void)0) +#endif + static void edit_file(char *fn) { #if ENABLE_FEATURE_VI_YANKMARK @@ -518,11 +531,7 @@ static void edit_file(char *fn) rows = 24; columns = 80; size = 0; - if (ENABLE_FEATURE_VI_WIN_RESIZE) { - get_terminal_width_height(0, &columns, &rows); - if (rows > MAX_SCR_ROWS) rows = MAX_SCR_ROWS; - if (columns > MAX_SCR_COLS) columns = MAX_SCR_COLS; - } + query_screen_dimensions(); new_screen(rows, columns); // get memory for virtual screen init_text_buffer(fn); @@ -537,7 +546,7 @@ static void edit_file(char *fn) ccol = 0; #if ENABLE_FEATURE_VI_USE_SIGNALS - catch_sig(0); + signal(SIGINT, catch_sig); signal(SIGWINCH, winch_sig); signal(SIGTSTP, suspend_sig); sig = sigsetjmp(restart, 1); @@ -563,7 +572,7 @@ static void edit_file(char *fn) char *p, *q; int n = 0; - while ((p = initial_cmds[n])) { + while ((p = initial_cmds[n]) != NULL) { do { q = p; p = strchr(q, '\n'); @@ -2143,50 +2152,51 @@ static void cookmode(void) tcsetattr_stdin_TCSANOW(&term_orig); } -//----- Come here when we get a window resize signal --------- #if ENABLE_FEATURE_VI_USE_SIGNALS +//----- Come here when we get a window resize signal --------- static void winch_sig(int sig UNUSED_PARAM) { + int save_errno = errno; // FIXME: do it in main loop!!! signal(SIGWINCH, winch_sig); - if (ENABLE_FEATURE_VI_WIN_RESIZE) { - get_terminal_width_height(0, &columns, &rows); - if (rows > MAX_SCR_ROWS) rows = MAX_SCR_ROWS; - if (columns > MAX_SCR_COLS) columns = MAX_SCR_COLS; - } + query_screen_dimensions(); new_screen(rows, columns); // get memory for virtual screen redraw(TRUE); // re-draw the screen + errno = save_errno; } //----- Come here when we get a continue signal ------------------- static void cont_sig(int sig UNUSED_PARAM) { + int save_errno = errno; rawmode(); // terminal to "raw" last_status_cksum = 0; // force status update redraw(TRUE); // re-draw the screen signal(SIGTSTP, suspend_sig); signal(SIGCONT, SIG_DFL); - kill(my_pid, SIGCONT); // huh? why? we are already "continued"... + //kill(my_pid, SIGCONT); // huh? why? we are already "continued"... + errno = save_errno; } //----- Come here when we get a Suspend signal ------------------- static void suspend_sig(int sig UNUSED_PARAM) { + int save_errno = errno; go_bottom_and_clear_to_eol(); cookmode(); // terminal to "cooked" signal(SIGCONT, cont_sig); signal(SIGTSTP, SIG_DFL); kill(my_pid, SIGTSTP); + errno = save_errno; } //----- Come here when we get a signal --------------------------- static void catch_sig(int sig) { signal(SIGINT, catch_sig); - if (sig) - siglongjmp(restart, sig); + siglongjmp(restart, sig); } #endif /* FEATURE_VI_USE_SIGNALS */ @@ -2781,9 +2791,7 @@ static void refresh(int full_screen) if (ENABLE_FEATURE_VI_WIN_RESIZE) { unsigned c = columns, r = rows; - get_terminal_width_height(0, &columns, &rows); - if (rows > MAX_SCR_ROWS) rows = MAX_SCR_ROWS; - if (columns > MAX_SCR_COLS) columns = MAX_SCR_COLS; + query_screen_dimensions(); full_screen |= (c - columns) | (r - rows); } sync_cursor(dot, &crow, &ccol); // where cursor will be (on "dot") |