Cmdedit update from Vladimir N. Oleynik (vodz)
diff --git a/shell/cmdedit.c b/shell/cmdedit.c
index 1682508..a78642b 100644
--- a/shell/cmdedit.c
+++ b/shell/cmdedit.c
@@ -55,6 +55,13 @@
 
 #else
 
+/* pretect redefined for test */
+#undef CONFIG_FEATURE_COMMAND_EDITING
+#undef CONFIG_FEATURE_COMMAND_TAB_COMPLETION
+#undef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
+#undef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
+#undef CONFIG_FEATURE_CLEAN_UP
+
 #define CONFIG_FEATURE_COMMAND_EDITING
 #define CONFIG_FEATURE_COMMAND_TAB_COMPLETION
 #define CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
@@ -1187,8 +1194,7 @@
 		int i;
 
 		for ( i = 0; i < n_history; i++ ) {
-			fputs ( history [i], fp );
-			fputc ( '\n', fp );
+			fprintf(fp, "%s\n", history [i]);
 		}
 		fclose ( fp );
 	}
@@ -1238,7 +1244,6 @@
 	new_settings.c_lflag &= ~ICANON;        /* unbuffered input */
 	/* Turn off echoing and CTRL-C, so we can trap it */
 	new_settings.c_lflag &= ~(ECHO | ECHONL | ISIG);
-#ifndef linux
 	/* Hmm, in linux c_cc[] not parsed if set ~ICANON */
 	new_settings.c_cc[VMIN] = 1;
 	new_settings.c_cc[VTIME] = 0;
@@ -1247,7 +1252,6 @@
 #               define _POSIX_VDISABLE '\0'
 #       endif
 	new_settings.c_cc[VINTR] = _POSIX_VDISABLE;
-#endif
 	command[0] = 0;
 
 	setTermSettings(0, (void *) &new_settings);
@@ -1286,12 +1290,8 @@
 			goto_new_line();
 			command[0] = 0;
 			len = 0;
-#if !defined(CONFIG_ASH)
 			lastWasTab = FALSE;
 			put_prompt();
-#else
-			break_out = 2;
-#endif
 			break;
 		case 4:
 			/* Control-d -- Delete one character, or exit
@@ -1336,7 +1336,7 @@
 			printf("\033[J");
 			break;
 		case 12:
-				/* Control-l -- clear screen */
+			/* Control-l -- clear screen */
 			printf("\033[H");
 			redraw(0, len-cursor);
 			break;
@@ -1363,6 +1363,13 @@
 				redraw(cmdedit_y, len -= cursor);
 			}
 			break;
+		case 23:
+			/* Control-W -- Remove the last word */
+			while (cursor > 0 && isspace(command[cursor-1]))
+				input_backspace();
+			while (cursor > 0 &&!isspace(command[cursor-1]))
+				input_backspace();
+			break;
 		case ESC:{
 			/* escape sequence follows */
 			if (safe_read(0, &c, 1) < 1)
@@ -1511,7 +1518,7 @@
 	}
 #endif
 #endif  /* MAX_HISTORY >= 1 */
-	if(break_out == 1) {
+	if (break_out > 0) {
 		command[len++] = '\n';          /* set '\n' */
 		command[len] = 0;
 	}
@@ -1522,11 +1529,7 @@
 	free(cmdedit_prompt);
 #endif
 	cmdedit_reset_term();
-#if !defined(CONFIG_ASH)
 	return len;
-#else
-	return break_out < 0 ? break_out : len;
-#endif
 }
 
 
@@ -1537,7 +1540,6 @@
 #ifdef TEST
 
 const char *bb_applet_name = "debug stuff usage";
-const char *memory_exhausted = "Memory exhausted";
 
 #ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT
 #include <locale.h>
@@ -1560,15 +1562,15 @@
 #endif
 	while(1) {
 		int l;
-		cmdedit_read_input(prompt, buff);
-		l = strlen(buff);
-		if(l==0)
-			break;
-		if(l > 0 && buff[l-1] == '\n')
+		l = cmdedit_read_input(prompt, buff);
+		if(l > 0 && buff[l-1] == '\n') {
 			buff[l-1] = 0;
-		printf("*** cmdedit_read_input() returned line =%s=\n", buff);
+			printf("*** cmdedit_read_input() returned line =%s=\n", buff);
+		} else {
+			break;
+		}
 	}
-	printf("*** cmdedit_read_input() detect ^C\n");
+	printf("*** cmdedit_read_input() detect ^D\n");
 	return 0;
 }