summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2010-04-16 20:55:52 -0700
committerDenys Vlasenko2010-04-16 20:55:52 -0700
commit2bb651ae10e36999949812d3ac4f7789ed665037 (patch)
tree01474cd07b98a67d419078a114b65aeb1c44c3a5
parent6f69f2dbc6dec739a576d6403551784453db59f3 (diff)
downloadbusybox-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.c46
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")