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>
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 9b112bc..5f5beb1 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1601,6 +1601,7 @@
 		}
 		/* 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 @@
 			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 @@
 			/* 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 @@
 			/* 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 @@
 			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 @@
 			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 @@
 			 || (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 @@
 				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) */