diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-14 12:53:04 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-14 12:53:04 +0200 |
commit | 04bb6b6a5af24f9a458132a5d002c54f901ae323 (patch) | |
tree | a2ad371f5f64e1220315eaa8265942a6ebbd05bc /libbb/lineedit.c | |
parent | a68bd4b2aee3368d92cbb0fc86ae3f65ab9170b4 (diff) | |
download | busybox-w32-04bb6b6a5af24f9a458132a5d002c54f901ae323.tar.gz busybox-w32-04bb6b6a5af24f9a458132a5d002c54f901ae323.tar.bz2 busybox-w32-04bb6b6a5af24f9a458132a5d002c54f901ae323.zip |
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) | |||
1601 | } | 1601 | } |
1602 | /* Note: read_key sets errno to 0 on success: */ | 1602 | /* Note: read_key sets errno to 0 on success: */ |
1603 | ic = read_key(STDIN_FILENO, read_key_buffer); | 1603 | ic = read_key(STDIN_FILENO, read_key_buffer); |
1604 | |||
1604 | if (ENABLE_FEATURE_EDITING_ASK_TERMINAL | 1605 | if (ENABLE_FEATURE_EDITING_ASK_TERMINAL |
1605 | && (int32_t)ic == KEYCODE_CURSOR_POS | 1606 | && (int32_t)ic == KEYCODE_CURSOR_POS |
1606 | ) { | 1607 | ) { |
@@ -1761,10 +1762,10 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li | |||
1761 | VI_CMDMODE_BIT = 0x40000000, | 1762 | VI_CMDMODE_BIT = 0x40000000, |
1762 | /* 0x80000000 bit flags KEYCODE_xxx */ | 1763 | /* 0x80000000 bit flags KEYCODE_xxx */ |
1763 | }; | 1764 | }; |
1764 | int32_t ic; | 1765 | int32_t ic, ic_raw; |
1765 | 1766 | ||
1766 | fflush(NULL); | 1767 | fflush(NULL); |
1767 | ic = lineedit_read_key(read_key_buffer); | 1768 | ic = ic_raw = lineedit_read_key(read_key_buffer); |
1768 | 1769 | ||
1769 | #if ENABLE_FEATURE_EDITING_VI | 1770 | #if ENABLE_FEATURE_EDITING_VI |
1770 | newdelflag = 1; | 1771 | newdelflag = 1; |
@@ -1796,27 +1797,6 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li | |||
1796 | /* Control-b -- Move back one character */ | 1797 | /* Control-b -- Move back one character */ |
1797 | input_backward(1); | 1798 | input_backward(1); |
1798 | break; | 1799 | break; |
1799 | case CTRL('C'): | ||
1800 | vi_case(CTRL('C')|VI_CMDMODE_BIT:) | ||
1801 | /* Control-c -- stop gathering input */ | ||
1802 | goto_new_line(); | ||
1803 | command_len = 0; | ||
1804 | break_out = -1; /* "do not append '\n'" */ | ||
1805 | break; | ||
1806 | case CTRL('D'): | ||
1807 | /* Control-d -- Delete one character, or exit | ||
1808 | * if the len=0 and no chars to delete */ | ||
1809 | if (command_len == 0) { | ||
1810 | errno = 0; | ||
1811 | #if ENABLE_FEATURE_EDITING_VI | ||
1812 | prepare_to_die: | ||
1813 | #endif | ||
1814 | /* to control stopped jobs */ | ||
1815 | break_out = command_len = -1; | ||
1816 | break; | ||
1817 | } | ||
1818 | input_delete(0); | ||
1819 | break; | ||
1820 | case CTRL('E'): | 1800 | case CTRL('E'): |
1821 | vi_case('$'|VI_CMDMODE_BIT:) | 1801 | vi_case('$'|VI_CMDMODE_BIT:) |
1822 | /* Control-e -- End of line */ | 1802 | /* Control-e -- End of line */ |
@@ -1939,21 +1919,17 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li | |||
1939 | /* fall through */ | 1919 | /* fall through */ |
1940 | case 'd'|VI_CMDMODE_BIT: { | 1920 | case 'd'|VI_CMDMODE_BIT: { |
1941 | int nc, sc; | 1921 | int nc, sc; |
1942 | int prev_ic; | ||
1943 | |||
1944 | sc = cursor; | ||
1945 | prev_ic = ic; | ||
1946 | 1922 | ||
1947 | ic = lineedit_read_key(read_key_buffer); | 1923 | ic = lineedit_read_key(read_key_buffer); |
1948 | if (errno) /* error */ | 1924 | if (errno) /* error */ |
1949 | goto prepare_to_die; | 1925 | goto prepare_to_die; |
1950 | 1926 | if (ic == ic_raw) { /* "cc", "dd" */ | |
1951 | if ((ic | VI_CMDMODE_BIT) == prev_ic) { | ||
1952 | /* "cc", "dd" */ | ||
1953 | input_backward(cursor); | 1927 | input_backward(cursor); |
1954 | goto clear_to_eol; | 1928 | goto clear_to_eol; |
1955 | break; | 1929 | break; |
1956 | } | 1930 | } |
1931 | |||
1932 | sc = cursor; | ||
1957 | switch (ic) { | 1933 | switch (ic) { |
1958 | case 'w': | 1934 | case 'w': |
1959 | case 'W': | 1935 | case 'W': |
@@ -2007,6 +1983,7 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li | |||
2007 | put(); | 1983 | put(); |
2008 | break; | 1984 | break; |
2009 | case 'r'|VI_CMDMODE_BIT: | 1985 | case 'r'|VI_CMDMODE_BIT: |
1986 | //FIXME: unicode case? | ||
2010 | ic = lineedit_read_key(read_key_buffer); | 1987 | ic = lineedit_read_key(read_key_buffer); |
2011 | if (errno) /* error */ | 1988 | if (errno) /* error */ |
2012 | goto prepare_to_die; | 1989 | goto prepare_to_die; |
@@ -2062,6 +2039,31 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li | |||
2062 | break; | 2039 | break; |
2063 | 2040 | ||
2064 | default: | 2041 | default: |
2042 | if (initial_settings.c_cc[VINTR] != 0 | ||
2043 | && ic_raw == initial_settings.c_cc[VINTR] | ||
2044 | ) { | ||
2045 | /* Ctrl-C (usually) - stop gathering input */ | ||
2046 | goto_new_line(); | ||
2047 | command_len = 0; | ||
2048 | break_out = -1; /* "do not append '\n'" */ | ||
2049 | break; | ||
2050 | } | ||
2051 | if (initial_settings.c_cc[VEOF] != 0 | ||
2052 | && ic_raw == initial_settings.c_cc[VEOF] | ||
2053 | ) { | ||
2054 | /* Ctrl-D (usually) - delete one character, | ||
2055 | * or exit if len=0 and no chars to delete */ | ||
2056 | if (command_len == 0) { | ||
2057 | errno = 0; | ||
2058 | #if ENABLE_FEATURE_EDITING_VI | ||
2059 | prepare_to_die: | ||
2060 | #endif | ||
2061 | break_out = command_len = -1; | ||
2062 | break; | ||
2063 | } | ||
2064 | input_delete(0); | ||
2065 | break; | ||
2066 | } | ||
2065 | // /* Control-V -- force insert of next char */ | 2067 | // /* Control-V -- force insert of next char */ |
2066 | // if (c == CTRL('V')) { | 2068 | // if (c == CTRL('V')) { |
2067 | // if (safe_read(STDIN_FILENO, &c, 1) < 1) | 2069 | // 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 | |||
2076 | || (ENABLE_FEATURE_ASSUME_UNICODE && ic >= VI_CMDMODE_BIT) | 2078 | || (ENABLE_FEATURE_ASSUME_UNICODE && ic >= VI_CMDMODE_BIT) |
2077 | ) { | 2079 | ) { |
2078 | /* If VI_CMDMODE_BIT is set, ic is >= 256 | 2080 | /* If VI_CMDMODE_BIT is set, ic is >= 256 |
2079 | * and command mode ignores unexpected chars. | 2081 | * and vi mode ignores unexpected chars. |
2080 | * Otherwise, we are here if ic is a | 2082 | * Otherwise, we are here if ic is a |
2081 | * control char or an unhandled ESC sequence, | 2083 | * control char or an unhandled ESC sequence, |
2082 | * which is also ignored. | 2084 | * which is also ignored. |
@@ -2108,14 +2110,13 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li | |||
2108 | input_backward(cursor - sc); | 2110 | input_backward(cursor - sc); |
2109 | } | 2111 | } |
2110 | break; | 2112 | break; |
2111 | } /* switch (input_key) */ | 2113 | } /* switch (ic) */ |
2112 | 2114 | ||
2113 | if (break_out) | 2115 | if (break_out) |
2114 | break; | 2116 | break; |
2115 | 2117 | ||
2116 | #if ENABLE_FEATURE_TAB_COMPLETION | 2118 | #if ENABLE_FEATURE_TAB_COMPLETION |
2117 | ic &= ~VI_CMDMODE_BIT; | 2119 | if (ic_raw != '\t') |
2118 | if (ic != '\t') | ||
2119 | lastWasTab = FALSE; | 2120 | lastWasTab = FALSE; |
2120 | #endif | 2121 | #endif |
2121 | } /* while (1) */ | 2122 | } /* while (1) */ |