diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-14 14:53:04 +0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-14 14:53:04 +0400 |
commit | 04bb6b6a5af24f9a458132a5d002c54f901ae323 (patch) | |
tree | a2ad371f5f64e1220315eaa8265942a6ebbd05bc /libbb/lineedit.c | |
parent | a68bd4b2aee3368d92cbb0fc86ae3f65ab9170b4 (diff) |
lineedit: do not hardcode ctrl-C and ctrl-D, use termios fields.
Unexpected code shrink is probably a gcc glitch:
function old new delta
read_line_input 4771 4629 -142
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/lineedit.c')
-rw-r--r-- | libbb/lineedit.c | 69 |
1 files changed, 35 insertions, 34 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 9b112bccf..5f5beb17c 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -1601,6 +1601,7 @@ static int lineedit_read_key(char *read_key_buffer) } /* Note: read_key sets errno to 0 on success: */ ic = read_key(STDIN_FILENO, read_key_buffer); + if (ENABLE_FEATURE_EDITING_ASK_TERMINAL && (int32_t)ic == KEYCODE_CURSOR_POS ) { @@ -1761,10 +1762,10 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li VI_CMDMODE_BIT = 0x40000000, /* 0x80000000 bit flags KEYCODE_xxx */ }; - int32_t ic; + int32_t ic, ic_raw; fflush(NULL); - ic = lineedit_read_key(read_key_buffer); + ic = ic_raw = lineedit_read_key(read_key_buffer); #if ENABLE_FEATURE_EDITING_VI newdelflag = 1; @@ -1796,27 +1797,6 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li /* Control-b -- Move back one character */ input_backward(1); break; - case CTRL('C'): - vi_case(CTRL('C')|VI_CMDMODE_BIT:) - /* Control-c -- stop gathering input */ - goto_new_line(); - command_len = 0; - break_out = -1; /* "do not append '\n'" */ - break; - case CTRL('D'): - /* Control-d -- Delete one character, or exit - * if the len=0 and no chars to delete */ - if (command_len == 0) { - errno = 0; -#if ENABLE_FEATURE_EDITING_VI - prepare_to_die: -#endif - /* to control stopped jobs */ - break_out = command_len = -1; - break; - } - input_delete(0); - break; case CTRL('E'): vi_case('$'|VI_CMDMODE_BIT:) /* Control-e -- End of line */ @@ -1939,21 +1919,17 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li /* fall through */ case 'd'|VI_CMDMODE_BIT: { int nc, sc; - int prev_ic; - - sc = cursor; - prev_ic = ic; ic = lineedit_read_key(read_key_buffer); if (errno) /* error */ goto prepare_to_die; - - if ((ic | VI_CMDMODE_BIT) == prev_ic) { - /* "cc", "dd" */ + if (ic == ic_raw) { /* "cc", "dd" */ input_backward(cursor); goto clear_to_eol; break; } + + sc = cursor; switch (ic) { case 'w': case 'W': @@ -2007,6 +1983,7 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li put(); break; case 'r'|VI_CMDMODE_BIT: +//FIXME: unicode case? ic = lineedit_read_key(read_key_buffer); if (errno) /* error */ goto prepare_to_die; @@ -2062,6 +2039,31 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li break; default: + if (initial_settings.c_cc[VINTR] != 0 + && ic_raw == initial_settings.c_cc[VINTR] + ) { + /* Ctrl-C (usually) - stop gathering input */ + goto_new_line(); + command_len = 0; + break_out = -1; /* "do not append '\n'" */ + break; + } + if (initial_settings.c_cc[VEOF] != 0 + && ic_raw == initial_settings.c_cc[VEOF] + ) { + /* Ctrl-D (usually) - delete one character, + * or exit if len=0 and no chars to delete */ + if (command_len == 0) { + errno = 0; +#if ENABLE_FEATURE_EDITING_VI + prepare_to_die: +#endif + break_out = command_len = -1; + break; + } + input_delete(0); + break; + } // /* Control-V -- force insert of next char */ // if (c == CTRL('V')) { // if (safe_read(STDIN_FILENO, &c, 1) < 1) @@ -2076,7 +2078,7 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li || (ENABLE_FEATURE_ASSUME_UNICODE && ic >= VI_CMDMODE_BIT) ) { /* If VI_CMDMODE_BIT is set, ic is >= 256 - * and command mode ignores unexpected chars. + * and vi mode ignores unexpected chars. * Otherwise, we are here if ic is a * control char or an unhandled ESC sequence, * which is also ignored. @@ -2108,14 +2110,13 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li input_backward(cursor - sc); } break; - } /* switch (input_key) */ + } /* switch (ic) */ if (break_out) break; #if ENABLE_FEATURE_TAB_COMPLETION - ic &= ~VI_CMDMODE_BIT; - if (ic != '\t') + if (ic_raw != '\t') lastWasTab = FALSE; #endif } /* while (1) */ |