aboutsummaryrefslogtreecommitdiff
path: root/libbb/lineedit.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-10-14 12:53:04 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-10-14 12:53:04 +0200
commit04bb6b6a5af24f9a458132a5d002c54f901ae323 (patch)
treea2ad371f5f64e1220315eaa8265942a6ebbd05bc /libbb/lineedit.c
parenta68bd4b2aee3368d92cbb0fc86ae3f65ab9170b4 (diff)
downloadbusybox-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.c69
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) */