shell: static functions cleanup

Removed shell_ prefix from static functions in .c files.
Added static functions for setting and getting shell
internal flags.

Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@nordicsemi.no>
diff --git a/subsys/shell/shell.c b/subsys/shell/shell.c
index eb4d54e..d39b577 100644
--- a/subsys/shell/shell.c
+++ b/subsys/shell/shell.c
@@ -28,27 +28,6 @@
 
 #define SHELL_INIT_OPTION_PRINTER	(NULL)
 
-#define EXIT_HISTORY(shell)					\
-		((shell)->ctx->internal.flags.history_exit)
-#define EXIT_HISTORY_REQUEST(shell)				\
-		((shell)->ctx->internal.flags.history_exit = 1)
-#define EXIT_HISTORY_CLEAR(shell)				\
-		((shell)->ctx->internal.flags.history_exit = 0)
-
-static int shell_execute(const struct shell *shell);
-
-/* Function returns true if delete escape code shall be interpreted as
- * backspace.
- */
-static inline bool flag_delete_mode_set(const struct shell *shell)
-{
-	return shell->ctx->internal.flags.mode_delete == 1 ? true : false;
-}
-
-static inline bool flag_processing_is_set(const struct shell *shell)
-{
-	return shell->ctx->internal.flags.processing == 1 ? true : false;
-}
 
 static inline void receive_state_change(const struct shell *shell,
 					enum shell_receive_state state)
@@ -56,29 +35,29 @@
 	shell->ctx->receive_state = state;
 }
 
-static void shell_cmd_buffer_clear(const struct shell *shell)
+static void cmd_buffer_clear(const struct shell *shell)
 {
 	shell->ctx->cmd_buff[0] = '\0'; /* clear command buffer */
 	shell->ctx->cmd_buff_pos = 0;
 	shell->ctx->cmd_buff_len = 0;
 }
 
-static inline void shell_prompt_print(const struct shell *shell)
+static inline void prompt_print(const struct shell *shell)
 {
 	shell_fprintf(shell, SHELL_INFO, "%s", shell->prompt);
 }
 
-static inline void shell_command_print(const struct shell *shell)
+static inline void cmd_print(const struct shell *shell)
 {
 	shell_fprintf(shell, SHELL_NORMAL, "%s", shell->ctx->cmd_buff);
 }
 
 static void cmd_line_print(const struct shell *shell)
 {
-	shell_prompt_print(shell);
+	prompt_print(shell);
 
-	if (flag_echo_is_set(shell)) {
-		shell_command_print(shell);
+	if (flag_echo_get(shell)) {
+		cmd_print(shell);
 		shell_op_cursor_position_synchronize(shell);
 	}
 }
@@ -91,15 +70,13 @@
  * @param[in] arg_cnt_ok  Flag indicating valid number of arguments.
  *
  * @return 0		  if check passed
- * @return 1		  if help was requested
  * @return -EINVAL	  if wrong argument count
  */
-static int shell_cmd_precheck(const struct shell *shell,
-			      bool arg_cnt_ok)
+static int cmd_precheck(const struct shell *shell,
+			bool arg_cnt_ok)
 {
 	if (!arg_cnt_ok) {
-		shell_fprintf(shell, SHELL_ERROR,
-			      "%s: wrong parameter count\n",
+		shell_fprintf(shell, SHELL_ERROR, "%s: wrong parameter count\n",
 			      shell->ctx->active_cmd.syntax);
 
 		if (IS_ENABLED(CONFIG_SHELL_HELP_ON_WRONG_ARGUMENT_COUNT)) {
@@ -112,64 +89,13 @@
 	return 0;
 }
 
-static void vt100_color_set(const struct shell *shell,
-			    enum shell_vt100_color color)
-{
-
-	if (shell->ctx->vt100_ctx.col.col == color) {
-		return;
-	}
-
-	shell->ctx->vt100_ctx.col.col = color;
-
-	if (color != SHELL_NORMAL) {
-
-		u8_t cmd[] = SHELL_VT100_COLOR(color - 1);
-
-		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
-	} else {
-		static const u8_t cmd[] = SHELL_VT100_MODESOFF;
-
-		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
-	}
-}
-
-static void vt100_bgcolor_set(const struct shell *shell,
-			      enum shell_vt100_color bgcolor)
-{
-	if ((bgcolor == SHELL_NORMAL) ||
-	    (shell->ctx->vt100_ctx.col.bgcol == bgcolor)) {
-		return;
-	}
-
-	/* -1 because default value is first in enum */
-	u8_t cmd[] = SHELL_VT100_BGCOLOR(bgcolor - 1);
-
-	shell->ctx->vt100_ctx.col.bgcol = bgcolor;
-	shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
-
-}
-
-static inline void vt100_colors_store(const struct shell *shell,
-				      struct shell_vt100_colors *color)
-{
-	memcpy(color, &shell->ctx->vt100_ctx.col, sizeof(*color));
-}
-
-static void vt100_colors_restore(const struct shell *shell,
-				 const struct shell_vt100_colors *color)
-{
-	vt100_color_set(shell, color->col);
-	vt100_bgcolor_set(shell, color->bgcol);
-}
-
-static void shell_state_set(const struct shell *shell, enum shell_state state)
+static void state_set(const struct shell *shell, enum shell_state state)
 {
 	shell->ctx->state = state;
 
 	if (state == SHELL_STATE_ACTIVE) {
-		shell_cmd_buffer_clear(shell);
-		shell_prompt_print(shell);
+		cmd_buffer_clear(shell);
+		prompt_print(shell);
 	}
 }
 
@@ -225,7 +151,7 @@
 		return;
 	}
 
-	EXIT_HISTORY_CLEAR(shell);
+	flag_history_exit_set(shell, false);
 	shell_history_mode_exit(shell->history);
 }
 
@@ -249,8 +175,8 @@
 	}
 
 	/* Checking if history process has been stopped */
-	if (EXIT_HISTORY(shell)) {
-		EXIT_HISTORY_CLEAR(shell);
+	if (flag_history_exit_get(shell)) {
+		flag_history_exit_set(shell, false);
 		shell_history_mode_exit(shell->history);
 	}
 
@@ -283,7 +209,7 @@
 
 	shell_op_cursor_home_move(shell);
 	clear_eos(shell);
-	shell_command_print(shell);
+	cmd_print(shell);
 	shell->ctx->cmd_buff_pos = len;
 	shell->ctx->cmd_buff_len = len;
 	shell_op_cond_next_line(shell);
@@ -353,11 +279,11 @@
 }
 
 /* Prepare arguments and return number of space available for completion. */
-static bool shell_tab_prepare(const struct shell *shell,
-			      const struct shell_static_entry **cmd,
-			      char **argv, size_t *argc,
-			      size_t *complete_arg_idx,
-			      struct shell_static_entry *d_entry)
+static bool tab_prepare(const struct shell *shell,
+			const struct shell_static_entry **cmd,
+			char **argv, size_t *argc,
+			size_t *complete_arg_idx,
+			struct shell_static_entry *d_entry)
 {
 	u16_t compl_space = completion_space_get(shell);
 	size_t search_argc;
@@ -474,10 +400,10 @@
 	/* Next character in the buffer is not 'space'. */
 	if (!isspace((int) shell->ctx->cmd_buff[
 					shell->ctx->cmd_buff_pos])) {
-		if (shell->ctx->internal.flags.insert_mode) {
-			shell->ctx->internal.flags.insert_mode = 0;
+		if (flag_insert_mode_get(shell)) {
+			flag_insert_mode_set(shell, false);
 			shell_op_char_insert(shell, ' ');
-			shell->ctx->internal.flags.insert_mode = 1;
+			flag_insert_mode_set(shell, true);
 		} else {
 			shell_op_char_insert(shell, ' ');
 		}
@@ -493,7 +419,7 @@
 	}
 }
 
-static size_t shell_str_common(const char *s1, const char *s2, size_t n)
+static size_t str_common(const char *s1, const char *s2, size_t n)
 {
 	size_t common = 0;
 
@@ -567,8 +493,8 @@
 			break;
 		}
 
-		curr_common = shell_str_common(match->syntax, match2->syntax,
-					       UINT16_MAX);
+		curr_common = str_common(match->syntax, match2->syntax,
+					 UINT16_MAX);
 		if ((arg_len == 0U) || (curr_common >= arg_len)) {
 			--cnt;
 			common = (curr_common < common) ? curr_common : common;
@@ -595,283 +521,6 @@
 	}
 }
 
-static void shell_tab_handle(const struct shell *shell)
-{
-	/* +1 reserved for NULL in function shell_make_argv */
-	char *argv[CONFIG_SHELL_ARGC_MAX + 1];
-	/* d_entry - placeholder for dynamic command */
-	struct shell_static_entry d_entry;
-	const struct shell_static_entry *cmd;
-	size_t first = 0;
-	size_t arg_idx;
-	u16_t longest;
-	size_t argc;
-	size_t cnt;
-
-	bool tab_possible = shell_tab_prepare(shell, &cmd, argv, &argc,
-					      &arg_idx, &d_entry);
-
-	if (tab_possible == false) {
-		return;
-	}
-
-	find_completion_candidates(cmd, argv[arg_idx], &first, &cnt, &longest);
-
-	if (cnt == 1) {
-		/* Autocompletion.*/
-		autocomplete(shell, cmd, argv[arg_idx], first);
-	} else if (cnt > 1) {
-		tab_options_print(shell, cmd, argv[arg_idx], first, cnt,
-				  longest);
-		partial_autocomplete(shell, cmd, argv[arg_idx], first, cnt);
-	}
-}
-
-static void metakeys_handle(const struct shell *shell, char data)
-{
-	/* Optional feature */
-	if (!IS_ENABLED(CONFIG_SHELL_METAKEYS)) {
-		return;
-	}
-
-	switch (data) {
-	case SHELL_VT100_ASCII_CTRL_A: /* CTRL + A */
-		shell_op_cursor_home_move(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_C: /* CTRL + C */
-		shell_op_cursor_end_move(shell);
-		if (!shell_cursor_in_empty_line(shell)) {
-			cursor_next_line_move(shell);
-		}
-		EXIT_HISTORY_REQUEST(shell);
-		shell_state_set(shell, SHELL_STATE_ACTIVE);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_E: /* CTRL + E */
-		shell_op_cursor_end_move(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_L: /* CTRL + L */
-		SHELL_VT100_CMD(shell, SHELL_VT100_CURSORHOME);
-		SHELL_VT100_CMD(shell, SHELL_VT100_CLEARSCREEN);
-		cmd_line_print(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_U: /* CTRL + U */
-		shell_op_cursor_home_move(shell);
-		shell_cmd_buffer_clear(shell);
-		EXIT_HISTORY_REQUEST(shell);
-		clear_eos(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_W: /* CTRL + W */
-		shell_op_word_remove(shell);
-		EXIT_HISTORY_REQUEST(shell);
-		break;
-
-	default:
-		break;
-	}
-}
-
-/* Functions returns true if new line character shall be processed */
-static bool process_nl(const struct shell *shell, u8_t data)
-{
-	if ((data != '\r') && (data != '\n')) {
-		shell->ctx->internal.flags.last_nl = 0;
-		return false;
-	}
-
-	if ((shell->ctx->internal.flags.last_nl == 0) ||
-	    (data == shell->ctx->internal.flags.last_nl)) {
-		shell->ctx->internal.flags.last_nl = data;
-		return true;
-	}
-
-	return false;
-}
-
-#define SHELL_ASCII_MAX_CHAR (127u)
-static inline int ascii_filter(const char data)
-{
-	return (u8_t) data > SHELL_ASCII_MAX_CHAR ? -EINVAL : 0;
-}
-
-static void shell_state_collect(const struct shell *shell)
-{
-	size_t count = 0;
-	char data;
-
-	while (true) {
-		(void)shell->iface->api->read(shell->iface, &data,
-					      sizeof(data), &count);
-		if (count == 0) {
-			return;
-		}
-
-		if (ascii_filter(data) != 0) {
-			continue;
-		}
-
-		switch (shell->ctx->receive_state) {
-		case SHELL_RECEIVE_DEFAULT:
-			if (process_nl(shell, data)) {
-				if (!shell->ctx->cmd_buff_len) {
-					history_mode_exit(shell);
-					cursor_next_line_move(shell);
-				} else {
-					/* Command execution */
-					(void)shell_execute(shell);
-				}
-				/* Function responsible for printing prompt
-				 * on received NL.
-				 */
-				shell_state_set(shell, SHELL_STATE_ACTIVE);
-				return;
-			}
-
-			switch (data) {
-			case SHELL_VT100_ASCII_ESC: /* ESCAPE */
-				receive_state_change(shell, SHELL_RECEIVE_ESC);
-				break;
-
-			case '\0':
-				break;
-
-			case '\t': /* TAB */
-				if (flag_echo_is_set(shell)) {
-					/* If the Tab key is pressed, "history
-					 * mode" must be terminated because
-					 * tab and history handlers are sharing
-					 * the same array: temp_buff.
-					 */
-					EXIT_HISTORY_REQUEST(shell);
-					shell_tab_handle(shell);
-				}
-				break;
-
-			case SHELL_VT100_ASCII_BSPACE: /* BACKSPACE */
-				if (flag_echo_is_set(shell)) {
-					EXIT_HISTORY_REQUEST(shell);
-					shell_op_char_backspace(shell);
-				}
-				break;
-
-			case SHELL_VT100_ASCII_DEL: /* DELETE */
-				if (flag_echo_is_set(shell)) {
-					EXIT_HISTORY_REQUEST(shell);
-					if (flag_delete_mode_set(shell)) {
-						shell_op_char_backspace(shell);
-
-					} else {
-						shell_op_char_delete(shell);
-					}
-				}
-				break;
-
-			default:
-				if (isprint((int) data)) {
-					EXIT_HISTORY_REQUEST(shell);
-					shell_op_char_insert(shell, data);
-				} else {
-					metakeys_handle(shell, data);
-				}
-				break;
-			}
-			break;
-
-		case SHELL_RECEIVE_ESC:
-			if (data == '[') {
-				receive_state_change(shell,
-						SHELL_RECEIVE_ESC_SEQ);
-			} else {
-				receive_state_change(shell,
-						SHELL_RECEIVE_DEFAULT);
-			}
-			break;
-
-		case SHELL_RECEIVE_ESC_SEQ:
-			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
-
-			if (!flag_echo_is_set(shell)) {
-				return;
-			}
-
-			switch (data) {
-			case 'A': /* UP arrow */
-				history_handle(shell, true);
-				break;
-
-			case 'B': /* DOWN arrow */
-				history_handle(shell, false);
-				break;
-
-			case 'C': /* RIGHT arrow */
-				shell_op_right_arrow(shell);
-				break;
-
-			case 'D': /* LEFT arrow */
-				shell_op_left_arrow(shell);
-				break;
-
-			case '4': /* END Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				/* fall through */
-				/* no break */
-			case 'F': /* END Button in VT100 mode */
-				shell_op_cursor_end_move(shell);
-				break;
-
-			case '1': /* HOME Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				/* fall through */
-				/* no break */
-			case 'H': /* HOME Button in VT100 mode */
-				shell_op_cursor_home_move(shell);
-				break;
-
-			case '2': /* INSERT Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				/* fall through */
-				/* no break */
-			case 'L': /* INSERT Button in VT100 mode */
-				shell->ctx->internal.flags.insert_mode ^= 1;
-				break;
-
-			case '3':/* DELETE Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				if (flag_echo_is_set(shell)) {
-					shell_op_char_delete(shell);
-				}
-				break;
-
-			default:
-				break;
-			}
-			break;
-
-		case SHELL_RECEIVE_TILDE_EXP:
-			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
-			break;
-
-		default:
-			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
-			break;
-		}
-	}
-}
-
-static void cmd_trim(const struct shell *shell)
-{
-	shell_buffer_trim(shell->ctx->cmd_buff, &shell->ctx->cmd_buff_len);
-	shell->ctx->cmd_buff_pos = shell->ctx->cmd_buff_len;
-}
-
 static int exec_cmd(const struct shell *shell, size_t argc, char **argv,
 		    struct shell_static_entry help_entry)
 {
@@ -898,15 +547,15 @@
 
 		if (args->optional > 0) {
 			/* Check if argc is within allowed range */
-			ret_val = shell_cmd_precheck(shell,
-						     ((argc >= args->mandatory)
-						      &&
-						     (argc <= args->mandatory +
-						     args->optional)));
+			ret_val = cmd_precheck(shell,
+					       ((argc >= args->mandatory)
+					       &&
+					       (argc <= args->mandatory +
+					       args->optional)));
 		} else {
 			/* Perform exact match if there are no optional args */
-			ret_val = shell_cmd_precheck(shell,
-						     (args->mandatory == argc));
+			ret_val = cmd_precheck(shell,
+					       (args->mandatory == argc));
 		}
 	}
 
@@ -921,7 +570,7 @@
  * invokes the  last recognized command which has a handler and passes the rest
  * of command buffer as arguments.
  */
-static int shell_execute(const struct shell *shell)
+static int execute(const struct shell *shell)
 {
 	struct shell_static_entry d_entry; /* Memory for dynamic commands. */
 	char *argv[CONFIG_SHELL_ARGC_MAX + 1]; /* +1 reserved for NULL */
@@ -942,7 +591,7 @@
 
 	memset(&shell->ctx->active_cmd, 0, sizeof(shell->ctx->active_cmd));
 
-	cmd_trim(shell);
+	shell_cmd_trim(shell);
 
 	history_put(shell, shell->ctx->cmd_buff,
 		    shell->ctx->cmd_buff_len);
@@ -960,15 +609,15 @@
 	}
 
 	if (quote != 0) {
-		shell_fprintf(shell, SHELL_ERROR, "not terminated: %c\r\n",
+		shell_fprintf(shell, SHELL_ERROR, "not terminated: %c\n",
 			      quote);
 		return -ENOEXEC;
 	}
 
 	/*  Searching for a matching root command. */
-	p_cmd = root_cmd_find(argv[0]);
+	p_cmd = shell_root_cmd_find(argv[0]);
 	if (p_cmd == NULL) {
-		shell_fprintf(shell, SHELL_ERROR, "%s%s\r\n", argv[0],
+		shell_fprintf(shell, SHELL_ERROR, "%s%s\n", argv[0],
 			      SHELL_MSG_COMMAND_NOT_FOUND);
 		return -ENOEXEC;
 	}
@@ -987,9 +636,8 @@
 			break;
 		}
 
-		if (IS_ENABLED(CONFIG_SHELL_HELP) &&
-		    (!strcmp(argv[cmd_lvl], "-h") ||
-		     !strcmp(argv[cmd_lvl], "--help"))) {
+		if (!strcmp(argv[cmd_lvl], "-h") ||
+		    !strcmp(argv[cmd_lvl], "--help")) {
 			/* Command called with help option so it makes no sense
 			 * to search deeper commands.
 			 */
@@ -1051,7 +699,7 @@
 							      SHELL_ERROR,
 							"Error: requested"
 							" multiple function"
-							" executions\r\n");
+							" executions\n");
 
 						return -ENOEXEC;
 					}
@@ -1087,10 +735,282 @@
 			&argv[cmd_with_handler_lvl], help_entry);
 }
 
-static void shell_transport_evt_handler(enum shell_transport_evt evt_type,
-				      void *context)
+static void tab_handle(const struct shell *shell)
 {
-	struct shell *shell = (struct shell *)context;
+	/* +1 reserved for NULL in function shell_make_argv */
+	char *argv[CONFIG_SHELL_ARGC_MAX + 1];
+	/* d_entry - placeholder for dynamic command */
+	struct shell_static_entry d_entry;
+	const struct shell_static_entry *cmd;
+	size_t first = 0;
+	size_t arg_idx;
+	u16_t longest;
+	size_t argc;
+	size_t cnt;
+
+	bool tab_possible = tab_prepare(shell, &cmd, argv, &argc,
+					      &arg_idx, &d_entry);
+
+	if (tab_possible == false) {
+		return;
+	}
+
+	find_completion_candidates(cmd, argv[arg_idx], &first, &cnt, &longest);
+
+	if (cnt == 1) {
+		/* Autocompletion.*/
+		autocomplete(shell, cmd, argv[arg_idx], first);
+	} else if (cnt > 1) {
+		tab_options_print(shell, cmd, argv[arg_idx], first, cnt,
+				  longest);
+		partial_autocomplete(shell, cmd, argv[arg_idx], first, cnt);
+	}
+}
+
+static void metakeys_handle(const struct shell *shell, char data)
+{
+	/* Optional feature */
+	if (!IS_ENABLED(CONFIG_SHELL_METAKEYS)) {
+		return;
+	}
+
+	switch (data) {
+	case SHELL_VT100_ASCII_CTRL_A: /* CTRL + A */
+		shell_op_cursor_home_move(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_C: /* CTRL + C */
+		shell_op_cursor_end_move(shell);
+		if (!shell_cursor_in_empty_line(shell)) {
+			cursor_next_line_move(shell);
+		}
+		flag_history_exit_set(shell, true);
+		state_set(shell, SHELL_STATE_ACTIVE);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_E: /* CTRL + E */
+		shell_op_cursor_end_move(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_L: /* CTRL + L */
+		SHELL_VT100_CMD(shell, SHELL_VT100_CURSORHOME);
+		SHELL_VT100_CMD(shell, SHELL_VT100_CLEARSCREEN);
+		cmd_line_print(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_U: /* CTRL + U */
+		shell_op_cursor_home_move(shell);
+		cmd_buffer_clear(shell);
+		flag_history_exit_set(shell, true);
+		clear_eos(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_W: /* CTRL + W */
+		shell_op_word_remove(shell);
+		flag_history_exit_set(shell, true);
+		break;
+
+	default:
+		break;
+	}
+}
+
+/* Functions returns true if new line character shall be processed */
+static bool process_nl(const struct shell *shell, u8_t data)
+{
+	if ((data != '\r') && (data != '\n')) {
+		flag_last_nl_set(shell, 0);
+		return false;
+	}
+
+	if ((flag_last_nl_get(shell) == 0) ||
+	    (data == flag_last_nl_get(shell))) {
+		flag_last_nl_set(shell, data);
+		return true;
+	}
+
+	return false;
+}
+
+#define SHELL_ASCII_MAX_CHAR (127u)
+static inline int ascii_filter(const char data)
+{
+	return (u8_t) data > SHELL_ASCII_MAX_CHAR ? -EINVAL : 0;
+}
+
+static void state_collect(const struct shell *shell)
+{
+	size_t count = 0;
+	char data;
+
+	while (true) {
+		(void)shell->iface->api->read(shell->iface, &data,
+					      sizeof(data), &count);
+		if (count == 0) {
+			return;
+		}
+
+		if (ascii_filter(data) != 0) {
+			continue;
+		}
+
+		switch (shell->ctx->receive_state) {
+		case SHELL_RECEIVE_DEFAULT:
+			if (process_nl(shell, data)) {
+				if (!shell->ctx->cmd_buff_len) {
+					history_mode_exit(shell);
+					cursor_next_line_move(shell);
+				} else {
+					/* Command execution */
+					(void)execute(shell);
+				}
+				/* Function responsible for printing prompt
+				 * on received NL.
+				 */
+				state_set(shell, SHELL_STATE_ACTIVE);
+				return;
+			}
+
+			switch (data) {
+			case SHELL_VT100_ASCII_ESC: /* ESCAPE */
+				receive_state_change(shell, SHELL_RECEIVE_ESC);
+				break;
+
+			case '\0':
+				break;
+
+			case '\t': /* TAB */
+				if (flag_echo_get(shell)) {
+					/* If the Tab key is pressed, "history
+					 * mode" must be terminated because
+					 * tab and history handlers are sharing
+					 * the same array: temp_buff.
+					 */
+					flag_history_exit_set(shell, true);
+					tab_handle(shell);
+				}
+				break;
+
+			case SHELL_VT100_ASCII_BSPACE: /* BACKSPACE */
+				if (flag_echo_get(shell)) {
+					flag_history_exit_set(shell, true);
+					shell_op_char_backspace(shell);
+				}
+				break;
+
+			case SHELL_VT100_ASCII_DEL: /* DELETE */
+				if (flag_echo_get(shell)) {
+					flag_history_exit_set(shell, true);
+					if (flag_mode_delete_get(shell)) {
+						shell_op_char_backspace(shell);
+
+					} else {
+						shell_op_char_delete(shell);
+					}
+				}
+				break;
+
+			default:
+				if (isprint((int) data)) {
+					flag_history_exit_set(shell, true);
+					shell_op_char_insert(shell, data);
+				} else {
+					metakeys_handle(shell, data);
+				}
+				break;
+			}
+			break;
+
+		case SHELL_RECEIVE_ESC:
+			if (data == '[') {
+				receive_state_change(shell,
+						SHELL_RECEIVE_ESC_SEQ);
+			} else {
+				receive_state_change(shell,
+						SHELL_RECEIVE_DEFAULT);
+			}
+			break;
+
+		case SHELL_RECEIVE_ESC_SEQ:
+			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
+
+			if (!flag_echo_get(shell)) {
+				return;
+			}
+
+			switch (data) {
+			case 'A': /* UP arrow */
+				history_handle(shell, true);
+				break;
+
+			case 'B': /* DOWN arrow */
+				history_handle(shell, false);
+				break;
+
+			case 'C': /* RIGHT arrow */
+				shell_op_right_arrow(shell);
+				break;
+
+			case 'D': /* LEFT arrow */
+				shell_op_left_arrow(shell);
+				break;
+
+			case '4': /* END Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				/* fall through */
+				/* no break */
+			case 'F': /* END Button in VT100 mode */
+				shell_op_cursor_end_move(shell);
+				break;
+
+			case '1': /* HOME Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				/* fall through */
+				/* no break */
+			case 'H': /* HOME Button in VT100 mode */
+				shell_op_cursor_home_move(shell);
+				break;
+
+			case '2': /* INSERT Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				/* fall through */
+				/* no break */
+			case 'L': {/* INSERT Button in VT100 mode */
+				bool status = flag_insert_mode_get(shell);
+				flag_insert_mode_set(shell, !status);
+				break;
+			}
+
+			case '3':/* DELETE Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				if (flag_echo_get(shell)) {
+					shell_op_char_delete(shell);
+				}
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case SHELL_RECEIVE_TILDE_EXP:
+			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
+			break;
+
+		default:
+			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
+			break;
+		}
+	}
+}
+
+static void transport_evt_handler(enum shell_transport_evt evt_type, void *ctx)
+{
+	struct shell *shell = (struct shell *)ctx;
 	struct k_poll_signal *signal;
 
 	signal = (evt_type == SHELL_TRANSPORT_EVT_RX_RDY) ?
@@ -1099,17 +1019,6 @@
 	k_poll_signal_raise(signal, 0);
 }
 
-static void cmd_line_erase(const struct shell *shell)
-{
-	shell_multiline_data_calc(&shell->ctx->vt100_ctx.cons,
-				  shell->ctx->cmd_buff_pos,
-				  shell->ctx->cmd_buff_len);
-	shell_op_cursor_horiz_move(shell, -shell->ctx->vt100_ctx.cons.cur_x);
-	shell_op_cursor_vert_move(shell, shell->ctx->vt100_ctx.cons.cur_y - 1);
-
-	clear_eos(shell);
-}
-
 static void shell_log_process(const struct shell *shell)
 {
 	bool processed;
@@ -1117,7 +1026,7 @@
 	int result;
 
 	do {
-		cmd_line_erase(shell);
+		shell_cmd_line_erase(shell);
 		processed = shell_log_backend_process(shell->log_backend);
 		cmd_line_print(shell);
 
@@ -1134,8 +1043,8 @@
 	} while (processed && !signaled);
 }
 
-static int shell_instance_init(const struct shell *shell, const void *p_config,
-			       bool use_colors)
+static int instance_init(const struct shell *shell, const void *p_config,
+			 bool use_colors)
 {
 	__ASSERT_NO_MSG(shell);
 	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
@@ -1143,7 +1052,7 @@
 			(shell->shell_flag == SHELL_FLAG_OLF_CRLF));
 
 	int err = shell->iface->api->init(shell->iface, p_config,
-					  shell_transport_evt_handler,
+					  transport_evt_handler,
 					  (void *) shell);
 
 	if (err != 0) {
@@ -1154,27 +1063,50 @@
 
 	memset(shell->ctx, 0, sizeof(*shell->ctx));
 
-	if (IS_ENABLED(CONFIG_SHELL_BACKSPACE_MODE_DELETE)) {
-		shell->ctx->internal.flags.mode_delete = 1;
-	}
-
 	if (IS_ENABLED(CONFIG_SHELL_STATS)) {
 		shell->stats->log_lost_cnt = 0;
 	}
 
-	shell->ctx->internal.flags.tx_rdy = 1;
-	shell->ctx->internal.flags.echo = CONFIG_SHELL_ECHO_STATUS;
+	flag_tx_rdy_set(shell, true);
+	flag_echo_set(shell, CONFIG_SHELL_ECHO_STATUS);
+	flag_mode_delete_set(shell,
+			     IS_ENABLED(CONFIG_SHELL_BACKSPACE_MODE_DELETE));
 	shell->ctx->state = SHELL_STATE_INITIALIZED;
 	shell->ctx->vt100_ctx.cons.terminal_wid = SHELL_DEFAULT_TERMINAL_WIDTH;
 	shell->ctx->vt100_ctx.cons.terminal_hei = SHELL_DEFAULT_TERMINAL_HEIGHT;
 	shell->ctx->vt100_ctx.cons.name_len = shell_strlen(shell->prompt);
-	shell->ctx->internal.flags.use_colors =
-					IS_ENABLED(CONFIG_SHELL_VT100_COLORS);
+	flag_use_colors_set(shell, IS_ENABLED(CONFIG_SHELL_VT100_COLORS));
 
 	return 0;
 }
 
-static int shell_instance_uninit(const struct shell *shell);
+static int instance_uninit(const struct shell *shell)
+{
+	__ASSERT_NO_MSG(shell);
+	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
+
+	int err;
+
+	if (flag_processing_get(shell)) {
+		return -EBUSY;
+	}
+
+	if (IS_ENABLED(CONFIG_LOG)) {
+		/* todo purge log queue */
+		shell_log_backend_disable(shell->log_backend);
+	}
+
+	err = shell->iface->api->uninit(shell->iface);
+	if (err != 0) {
+		return err;
+	}
+
+	history_purge(shell);
+
+	shell->ctx->state = SHELL_STATE_UNINITIALIZED;
+
+	return 0;
+}
 
 void shell_thread(void *shell_handle, void *arg_log_backend,
 		  void *arg_log_level)
@@ -1217,7 +1149,7 @@
 		if (signaled) {
 			k_poll_signal_reset(
 				&shell->ctx->signals[SHELL_SIGNAL_KILL]);
-			(void)shell_instance_uninit(shell);
+			(void)instance_uninit(shell);
 
 			k_thread_abort(k_current_get());
 		}
@@ -1247,7 +1179,7 @@
 	__ASSERT_NO_MSG(shell);
 	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
 
-	int err = shell_instance_init(shell, transport_config, use_colors);
+	int err = instance_init(shell, transport_config, use_colors);
 
 	if (err != 0) {
 		return err;
@@ -1264,34 +1196,6 @@
 	return 0;
 }
 
-static int shell_instance_uninit(const struct shell *shell)
-{
-	__ASSERT_NO_MSG(shell);
-	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
-
-	int err;
-
-	if (flag_processing_is_set(shell)) {
-		return -EBUSY;
-	}
-
-	if (IS_ENABLED(CONFIG_LOG)) {
-		/* todo purge log queue */
-		shell_log_backend_disable(shell->log_backend);
-	}
-
-	err = shell->iface->api->uninit(shell->iface);
-	if (err != 0) {
-		return err;
-	}
-
-	history_purge(shell);
-
-	shell->ctx->state = SHELL_STATE_UNINITIALIZED;
-
-	return 0;
-}
-
 int shell_uninit(const struct shell *shell)
 {
 	__ASSERT_NO_MSG(shell);
@@ -1302,7 +1206,7 @@
 
 		return 0;
 	} else {
-		return shell_instance_uninit(shell);
+		return instance_uninit(shell);
 	}
 }
 
@@ -1323,12 +1227,12 @@
 	}
 
 	if (IS_ENABLED(CONFIG_SHELL_VT100_COLORS)) {
-		vt100_color_set(shell, SHELL_NORMAL);
+		shell_vt100_color_set(shell, SHELL_NORMAL);
 	}
 
 	shell_raw_fprintf(shell->fprintf_ctx, "\n\n");
 
-	shell_state_set(shell, SHELL_STATE_ACTIVE);
+	state_set(shell, SHELL_STATE_ACTIVE);
 
 	return 0;
 }
@@ -1343,7 +1247,7 @@
 		return -ENOTSUP;
 	}
 
-	shell_state_set(shell, SHELL_STATE_INITIALIZED);
+	state_set(shell, SHELL_STATE_INITIALIZED);
 
 	return 0;
 }
@@ -1368,7 +1272,7 @@
 		break;
 
 	case SHELL_STATE_ACTIVE:
-		shell_state_collect(shell);
+		state_collect(shell);
 		break;
 
 	default:
@@ -1400,12 +1304,12 @@
 	    (color != shell->ctx->vt100_ctx.col.col)) {
 		struct shell_vt100_colors col;
 
-		vt100_colors_store(shell, &col);
-		vt100_color_set(shell, color);
+		shell_vt100_colors_store(shell, &col);
+		shell_vt100_color_set(shell, color);
 
 		shell_fprintf_fmt(shell->fprintf_ctx, p_fmt, args);
 
-		vt100_colors_restore(shell, &col);
+		shell_vt100_colors_restore(shell, &col);
 	} else {
 		shell_fprintf_fmt(shell->fprintf_ctx, p_fmt, args);
 	}
@@ -1463,5 +1367,5 @@
 	shell->ctx->cmd_buff_len = cmd_len;
 	shell->ctx->cmd_buff_pos = cmd_len;
 
-	return shell_execute(shell);
+	return execute(shell);
 }
diff --git a/subsys/shell/shell_cmds.c b/subsys/shell/shell_cmds.c
index 48716be..a6c545c 100644
--- a/subsys/shell/shell_cmds.c
+++ b/subsys/shell/shell_cmds.c
@@ -197,7 +197,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.mode_delete = 0;
+	flag_mode_delete_set(shell, false);
 
 	return 0;
 }
@@ -208,7 +208,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.mode_delete = 1;
+	flag_mode_delete_set(shell, true);
 
 	return 0;
 }
@@ -218,7 +218,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.use_colors = 0;
+	flag_use_colors_set(shell, false);
 
 	return 0;
 }
@@ -228,7 +228,7 @@
 	ARG_UNUSED(argv);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.use_colors = 1;
+	flag_use_colors_set(shell, true);
 
 	return 0;
 }
@@ -238,7 +238,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.echo = 0;
+	flag_echo_set(shell, false);
 
 	return 0;
 }
@@ -248,7 +248,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.echo = 1;
+	flag_echo_set(shell, true);
 
 	return 0;
 }
@@ -262,7 +262,7 @@
 	}
 
 	shell_print(shell, "Echo status: %s",
-		    flag_echo_is_set(shell) ? "on" : "off");
+		    flag_echo_get(shell) ? "on" : "off");
 
 	return 0;
 }
diff --git a/subsys/shell/shell_ops.c b/subsys/shell/shell_ops.c
index 8eae498..7633479 100644
--- a/subsys/shell/shell_ops.c
+++ b/subsys/shell/shell_ops.c
@@ -204,7 +204,7 @@
 	shell->ctx->cmd_buff_len += len;
 	shell->ctx->cmd_buff[shell->ctx->cmd_buff_len] = '\0';
 
-	if (!flag_echo_is_set(shell)) {
+	if (!flag_echo_get(shell)) {
 		shell->ctx->cmd_buff_pos += len;
 		return;
 	}
@@ -263,6 +263,17 @@
 	data_insert(shell, compl, compl_len);
 }
 
+void shell_cmd_line_erase(const struct shell *shell)
+{
+	shell_multiline_data_calc(&shell->ctx->vt100_ctx.cons,
+				  shell->ctx->cmd_buff_pos,
+				  shell->ctx->cmd_buff_len);
+	shell_op_cursor_horiz_move(shell, -shell->ctx->vt100_ctx.cons.cur_x);
+	shell_op_cursor_vert_move(shell, shell->ctx->vt100_ctx.cons.cur_y - 1);
+
+	clear_eos(shell);
+}
+
 static void shell_pend_on_txdone(const struct shell *shell)
 {
 	if (IS_ENABLED(CONFIG_MULTITHREADING)) {
@@ -270,9 +281,9 @@
 		k_poll_signal_reset(&shell->ctx->signals[SHELL_SIGNAL_TXDONE]);
 	} else {
 		/* Blocking wait in case of bare metal. */
-		while (!shell->ctx->internal.flags.tx_rdy) {
+		while (!flag_tx_rdy_get(shell)) {
 		}
-		shell->ctx->internal.flags.tx_rdy = 0;
+		flag_tx_rdy_set(shell, false);
 	}
 }
 
@@ -306,3 +317,48 @@
 {
 	shell_write((const struct shell *) user_ctx, data, data_len);
 }
+
+static void vt100_bgcolor_set(const struct shell *shell,
+			      enum shell_vt100_color bgcolor)
+{
+	if ((bgcolor == SHELL_NORMAL) ||
+	    (shell->ctx->vt100_ctx.col.bgcol == bgcolor)) {
+		return;
+	}
+
+	/* -1 because default value is first in enum */
+	u8_t cmd[] = SHELL_VT100_BGCOLOR(bgcolor - 1);
+
+	shell->ctx->vt100_ctx.col.bgcol = bgcolor;
+	shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
+
+}
+
+void shell_vt100_color_set(const struct shell *shell,
+			   enum shell_vt100_color color)
+{
+
+	if (shell->ctx->vt100_ctx.col.col == color) {
+		return;
+	}
+
+	shell->ctx->vt100_ctx.col.col = color;
+
+	if (color != SHELL_NORMAL) {
+
+		u8_t cmd[] = SHELL_VT100_COLOR(color - 1);
+
+		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
+	} else {
+		static const u8_t cmd[] = SHELL_VT100_MODESOFF;
+
+		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
+	}
+}
+
+void shell_vt100_colors_restore(const struct shell *shell,
+				       const struct shell_vt100_colors *color)
+{
+	shell_vt100_color_set(shell, color->col);
+	vt100_bgcolor_set(shell, color->bgcol);
+}
diff --git a/subsys/shell/shell_ops.h b/subsys/shell/shell_ops.h
index 70e63b2..b65f786 100644
--- a/subsys/shell/shell_ops.h
+++ b/subsys/shell/shell_ops.h
@@ -6,6 +6,7 @@
 #ifndef SHELL_OPS_H__
 #define SHELL_OPS_H__
 
+#include <stdbool.h>
 #include <shell/shell.h>
 #include "shell_vt100.h"
 #include "shell_utils.h"
@@ -68,11 +69,81 @@
 	shell_raw_fprintf(shell->fprintf_ctx, "%c", ch);
 }
 
-static inline bool flag_echo_is_set(const struct shell *shell)
+static inline bool flag_insert_mode_get(const struct shell *shell)
+{
+	return ((shell->ctx->internal.flags.insert_mode == 1) ? true : false);
+}
+
+static inline void flag_insert_mode_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.insert_mode = val ? 1 : 0;
+}
+
+static inline bool flag_use_colors_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.use_colors == 1 ? true : false;
+}
+
+static inline void flag_use_colors_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.use_colors = val ? 1 : 0;
+}
+
+static inline bool flag_echo_get(const struct shell *shell)
 {
 	return shell->ctx->internal.flags.echo == 1 ? true : false;
 }
 
+static inline void flag_echo_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.echo = val ? 1 : 0;
+}
+
+static inline bool flag_processing_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.processing == 1 ? true : false;
+}
+
+static inline bool flag_tx_rdy_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.tx_rdy == 1 ? true : false;
+}
+
+static inline void flag_tx_rdy_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.tx_rdy = val ? 1 : 0;
+}
+
+static inline bool flag_mode_delete_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.mode_delete == 1 ? true : false;
+}
+
+static inline void flag_mode_delete_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.mode_delete = val ? 1 : 0;
+}
+
+static inline bool flag_history_exit_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.history_exit == 1 ? true : false;
+}
+
+static inline void flag_history_exit_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.history_exit = val ? 1 : 0;
+}
+
+static inline u8_t flag_last_nl_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.last_nl;
+}
+
+static inline void flag_last_nl_set(const struct shell *shell, u8_t val)
+{
+	shell->ctx->internal.flags.last_nl = val;
+}
+
 void shell_op_cursor_vert_move(const struct shell *shell, s32_t delta);
 void shell_op_cursor_horiz_move(const struct shell *shell, s32_t delta);
 
@@ -121,6 +192,8 @@
 
 bool shell_cursor_in_empty_line(const struct shell *shell);
 
+void shell_cmd_line_erase(const struct shell *shell);
+
 /* Function sends data stream to the shell instance. Each time before the
  * shell_write function is called, it must be ensured that IO buffer of fprintf
  * is flushed to avoid synchronization issues.
@@ -143,6 +216,19 @@
 void shell_print_stream(const void *user_ctx, const char *data,
 			size_t data_len);
 
+/** @internal @brief Function for setting font color */
+void shell_vt100_color_set(const struct shell *shell,
+			   enum shell_vt100_color color);
+
+static inline void shell_vt100_colors_store(const struct shell *shell,
+					    struct shell_vt100_colors *color)
+{
+	memcpy(color, &shell->ctx->vt100_ctx.col, sizeof(*color));
+}
+
+void shell_vt100_colors_restore(const struct shell *shell,
+				const struct shell_vt100_colors *color);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/subsys/shell/shell_utils.c b/subsys/shell/shell_utils.c
index f3ee1a3..f75e939 100644
--- a/subsys/shell/shell_utils.c
+++ b/subsys/shell/shell_utils.c
@@ -225,7 +225,7 @@
 }
 
 /* Function returning pointer to root command matching requested syntax. */
-const struct shell_cmd_entry *root_cmd_find(const char *syntax)
+const struct shell_cmd_entry *shell_root_cmd_find(const char *syntax)
 {
 	const size_t cmd_count = shell_root_cmd_count();
 	const struct shell_cmd_entry *cmd;
@@ -335,7 +335,10 @@
 	}
 }
 
-void shell_buffer_trim(char *buff, u16_t *buff_len)
+/** @brief Remove white chars from beginning and end of command buffer.
+ *
+ */
+static void buffer_trim(char *buff, u16_t *buff_len)
 {
 	u16_t i = 0U;
 
@@ -369,3 +372,9 @@
 		*buff_len = *buff_len - i;
 	}
 }
+
+void shell_cmd_trim(const struct shell *shell)
+{
+	buffer_trim(shell->ctx->cmd_buff, &shell->ctx->cmd_buff_len);
+	shell->ctx->cmd_buff_pos = shell->ctx->cmd_buff_len;
+}
diff --git a/subsys/shell/shell_utils.h b/subsys/shell/shell_utils.h
index 3848368..db7a4e5 100644
--- a/subsys/shell/shell_utils.h
+++ b/subsys/shell/shell_utils.h
@@ -64,20 +64,17 @@
 int shell_command_add(char *buff, u16_t *buff_len,
 		      const char *new_cmd, const char *pattern);
 
-const struct shell_cmd_entry *root_cmd_find(const char *syntax);
+const struct shell_cmd_entry *shell_root_cmd_find(const char *syntax);
 
 void shell_spaces_trim(char *str);
 
-/** @brief Remove white chars from beginning and end of command buffer.
- *
- */
-void shell_buffer_trim(char *buff, u16_t *buff_len);
-
 static inline void transport_buffer_flush(const struct shell *shell)
 {
 	shell_fprintf_buffer_flush(shell->fprintf_ctx);
 }
 
+void shell_cmd_trim(const struct shell *shell);
+
 #ifdef __cplusplus
 }
 #endif