shell: commands help unification

1. Changed return value of function: shell_cmd_precheck from bool to
int. Now it returns:
  0       when argument count is correct and help print is not requested
  1       when help was requested and printed
  -EINVAL on wrong arguments count
This change simply shell_cmd_precheck usege in command handlers.

2. Unified all commands in shell_cmd.c file.

3. Fixed a bug where help was not printed on wrong argument count.

Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@nordicsemi.no>
diff --git a/include/shell/shell.h b/include/shell/shell.h
index 306ad1d..4a12711 100644
--- a/include/shell/shell.h
+++ b/include/shell/shell.h
@@ -572,12 +572,14 @@
  * @param[in] opt	  Pointer to the optional option array.
  * @param[in] opt_len	  Option array size.
  *
- * @return True if check passed, false otherwise or help was requested.
+ * @return 0		  if check passed
+ * @return 1		  if help was requested
+ * @return -EINVAL	  if wrong argument count
  */
-bool shell_cmd_precheck(const struct shell *shell,
-			bool arg_cnt_ok,
-			const struct shell_getopt_option *opt,
-			size_t opt_len);
+int shell_cmd_precheck(const struct shell *shell,
+		       bool arg_cnt_ok,
+		       const struct shell_getopt_option *opt,
+		       size_t opt_len);
 
 /**
  * @internal @brief This function shall not be used directly, it is required by
diff --git a/subsys/shell/shell.c b/subsys/shell/shell.c
index 1720419..c413d92 100644
--- a/subsys/shell/shell.c
+++ b/subsys/shell/shell.c
@@ -1700,29 +1700,29 @@
 	return -1;
 }
 
-bool shell_cmd_precheck(const struct shell *shell,
-			bool arg_cnt_ok,
-			const struct shell_getopt_option *opt,
-			size_t opt_len)
+int shell_cmd_precheck(const struct shell *shell,
+		       bool arg_cnt_ok,
+		       const struct shell_getopt_option *opt,
+		       size_t opt_len)
 {
 	if (shell_help_requested(shell)) {
 		shell_help_print(shell, opt, opt_len);
-		return false;
+		return 1; /* help printed */
 	}
 
 	if (!arg_cnt_ok) {
 		shell_fprintf(shell, SHELL_ERROR,
-			      "%s: wrong parameter count\r\n",
+			      "%s: wrong parameter count\n",
 			      shell->ctx->active_cmd.syntax);
 
-		if (IS_ENABLED(SHELL_HELP_ON_WRONG_ARGUMENT_COUNT)) {
+		if (IS_ENABLED(CONFIG_SHELL_HELP_ON_WRONG_ARGUMENT_COUNT)) {
 			shell_help_print(shell, opt, opt_len);
 		}
 
-		return false;
+		return -EINVAL;
 	}
 
-	return true;
+	return 0;
 }
 
 int shell_execute_cmd(const struct shell *shell, const char *cmd)
diff --git a/subsys/shell/shell_cmds.c b/subsys/shell/shell_cmds.c
index 80c6916..ea3befd 100644
--- a/subsys/shell/shell_cmds.c
+++ b/subsys/shell/shell_cmds.c
@@ -9,7 +9,7 @@
 #include "shell_vt100.h"
 
 #define SHELL_HELP_CLEAR		"Clear screen."
-#define SHELL_HELP_BACKSPACE_MODE	"Toggle backspace key mode.\r\n" \
+#define SHELL_HELP_BACKSPACE_MODE	"Toggle backspace key mode.\n" \
 	"Some terminals are not sending separate escape code for"	 \
 	"backspace and delete button. Hence backspace is not working as" \
 	"expected. This command can force shell to interpret delete"	 \
@@ -182,156 +182,195 @@
 
 static int cmd_clear(const struct shell *shell, size_t argc, char **argv)
 {
-	(void)argv;
+	ARG_UNUSED(argv);
 
-	if ((argc == 2) && (shell_help_requested(shell))) {
-		shell_help_print(shell, NULL, 0);
-		return 0;
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret) {
+		return ret;
 	}
+
 	SHELL_VT100_CMD(shell, SHELL_VT100_CURSORHOME);
 	SHELL_VT100_CMD(shell, SHELL_VT100_CLEARSCREEN);
+
 	return 0;
 }
 
 static int cmd_shell(const struct shell *shell, size_t argc, char **argv)
 {
-	(void)argv;
+	int ret = shell_cmd_precheck(shell, (argc == 2), NULL, 0);
 
-	if ((argc == 1) || ((argc == 2) && shell_help_requested(shell))) {
-		shell_help_print(shell, NULL, 0);
-		return 0;
+	if (ret) {
+		return ret;
 	}
 
-	shell_fprintf(shell, SHELL_ERROR, SHELL_MSG_SPECIFY_SUBCOMMAND);
-	return 0;
-}
+	shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
+		      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
 
-static int cmd_bacskpace_mode(const struct shell *shell, size_t argc,
-			       char **argv)
-{
-	(void)shell_cmd_precheck(shell, (argc == 2), NULL, 0);
-	return 0;
+	return -EINVAL;
 }
 
 static int cmd_bacskpace_mode_backspace(const struct shell *shell, size_t argc,
-					 char **argv)
+					char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->ctx->internal.flags.mode_delete = 0;
 	}
 
-	shell->ctx->internal.flags.mode_delete = 0;
-	return 0;
+	return ret;
 }
 
 static int cmd_bacskpace_mode_delete(const struct shell *shell, size_t argc,
 				      char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->ctx->internal.flags.mode_delete = 1;
 	}
 
-	shell->ctx->internal.flags.mode_delete = 1;
-	return 0;
+	return ret;
+}
+
+static int cmd_bacskpace_mode(const struct shell *shell, size_t argc,
+			      char **argv)
+{
+	int ret = shell_cmd_precheck(shell, (argc == 2), NULL, 0);
+
+	if (ret) {
+		return ret;
+	}
+
+	shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
+		      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
+
+	return -EINVAL;
 }
 
 static int cmd_colors_off(const struct shell *shell, size_t argc, char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->ctx->internal.flags.use_colors = 0;
 	}
 
-	shell->ctx->internal.flags.use_colors = 0;
-	return 0;
+	return ret;
 }
 
 static int cmd_colors_on(const struct shell *shell, size_t argc, char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->ctx->internal.flags.use_colors = 1;
 	}
-	shell->ctx->internal.flags.use_colors = 1;
-	return 0;
+
+	return ret;
 }
 
 static int cmd_colors(const struct shell *shell, size_t argc, char **argv)
 {
-	if (argc == 1) {
-		shell_help_print(shell, NULL, 0);
-		return 0;
+	int ret = shell_cmd_precheck(shell, (argc == 2), NULL, 0);
+
+	if (ret) {
+		return ret;
 	}
 
-	if (!shell_cmd_precheck(shell, (argc == 2), NULL, 0)) {
-		return 0;
-	}
-
-	shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\r\n", argv[0],
+	shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
 		      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
-	return -ENOEXEC;
-}
 
-static int cmd_echo(const struct shell *shell, size_t argc, char **argv)
-{
-	if (!shell_cmd_precheck(shell, (argc <= 2), NULL, 0)) {
-		return 0;
-	}
-
-	if (argc == 2) {
-		shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\r\n", argv[0],
-			      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
-		return -ENOEXEC;
-	}
-
-	shell_fprintf(shell, SHELL_NORMAL, "Echo status: %s\r\n",
-		      flag_echo_is_set(shell) ? "on" : "off");
-	return 0;
+	return -EINVAL;
 }
 
 static int cmd_echo_off(const struct shell *shell, size_t argc, char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->ctx->internal.flags.echo = 0;
 	}
 
-	shell->ctx->internal.flags.echo = 0;
-	return 0;
+	return ret;
 }
 
 static int cmd_echo_on(const struct shell *shell, size_t argc, char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->ctx->internal.flags.echo = 1;
 	}
 
-	shell->ctx->internal.flags.echo = 1;
+	return ret;
+}
+
+static int cmd_echo(const struct shell *shell, size_t argc, char **argv)
+{
+	int ret = shell_cmd_precheck(shell, (argc <= 2), NULL, 0);
+
+	if (ret) {
+		return ret;
+	}
+
+	if (argc == 2) {
+		shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
+			      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
+		return -EINVAL;
+	}
+
+	shell_fprintf(shell, SHELL_NORMAL, "Echo status: %s\n",
+		      flag_echo_is_set(shell) ? "on" : "off");
+
 	return 0;
 }
 
 static int cmd_help(const struct shell *shell, size_t argc, char **argv)
 {
-	shell_fprintf(shell, SHELL_NORMAL, "Please press the <Tab> button to "
-					   "see all available commands.\r\n"
-					   "You can also use the <Tab> button "
-					   "to prompt or auto-complete all "
-					   "commands or its subcommands.\r\n"
-					   "You can try to call commands "
-					   "with <-h> or <--help> parameter to "
-					   "get know what they are doing.\r\n");
+	ARG_UNUSED(argc);
+	ARG_UNUSED(argv);
+
+	shell_fprintf(shell, SHELL_NORMAL,
+		"Please press the <Tab> button to see all available commands.\n"
+		"You can also use the <Tab> button to prompt or auto-complete"
+		"all commands or its subcommands.\n"
+		"You can try to call commands with <-h> or <--help> parameter"
+		" for more information.\n");
+
 	return 0;
 }
 
 static int cmd_history(const struct shell *shell, size_t argc, char **argv)
 {
+	ARG_UNUSED(argv);
+
 	size_t i = 0;
 	size_t len;
+	int ret;
 
 	if (!IS_ENABLED(CONFIG_SHELL_HISTORY)) {
-		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\r\n");
+		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\n");
 		return -ENOEXEC;
 	}
 
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret) {
+		return ret;
 	}
 
 	while (1) {
@@ -339,7 +378,7 @@
 				  shell->ctx->temp_buff, &len);
 
 		if (len) {
-			shell_fprintf(shell, SHELL_NORMAL, "[%3d] %s\r\n",
+			shell_fprintf(shell, SHELL_NORMAL, "[%3d] %s\n",
 				      i++, shell->ctx->temp_buff);
 
 		} else {
@@ -348,70 +387,82 @@
 	}
 
 	shell->ctx->temp_buff[0] = '\0';
-	return 0;
-}
 
-static int cmd_shell_stats(const struct shell *shell, size_t argc, char **argv)
-{
-	if (argc == 1) {
-		shell_help_print(shell, NULL, 0);
-		return 0;
-	}
-
-	if (argc == 2) {
-		shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\r\n", argv[0],
-			      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
-		return -ENOEXEC;
-	}
-
-	(void)shell_cmd_precheck(shell, (argc <= 2), NULL, 0);
 	return 0;
 }
 
 static int cmd_shell_stats_show(const struct shell *shell, size_t argc,
 				char **argv)
 {
+	ARG_UNUSED(argv);
+
 	if (!IS_ENABLED(CONFIG_SHELL_STATS)) {
-		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\r\n");
+		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\n");
 		return -ENOEXEC;
 	}
 
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell_fprintf(shell, SHELL_NORMAL, "Lost logs: %u\n",
+			      shell->stats->log_lost_cnt);
 	}
 
-	shell_fprintf(shell, SHELL_NORMAL, "Lost logs: %u\r\n",
-		      shell->stats->log_lost_cnt);
-	return 0;
+	return ret;
 }
 
 static int cmd_shell_stats_reset(const struct shell *shell,
 				 size_t argc, char **argv)
 {
+	ARG_UNUSED(argv);
+
 	if (!IS_ENABLED(CONFIG_SHELL_STATS)) {
-		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\r\n");
+		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\n");
 		return -ENOEXEC;
 	}
 
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		shell->stats->log_lost_cnt = 0;
 	}
 
-	shell->stats->log_lost_cnt = 0;
-	return 0;
+	return ret;
+}
+
+static int cmd_shell_stats(const struct shell *shell, size_t argc, char **argv)
+{
+	ARG_UNUSED(argc);
+
+	if (shell_help_requested(shell)) {
+		shell_help_print(shell, NULL, 0);
+		return 1;
+	} else if (argc == 1) {
+		shell_help_print(shell, NULL, 0);
+	} else {
+		shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
+			      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
+	}
+
+	return -EINVAL;
 }
 
 static int cmd_resize_default(const struct shell *shell,
 			      size_t argc, char **argv)
 {
-	if (!shell_cmd_precheck(shell, (argc == 1), NULL, 0)) {
-		return 0;
+	ARG_UNUSED(argv);
+
+	int ret = shell_cmd_precheck(shell, (argc == 1), NULL, 0);
+
+	if (ret == 0) {
+		SHELL_VT100_CMD(shell, SHELL_VT100_SETCOL_80);
+		shell->ctx->vt100_ctx.cons.terminal_wid =
+						   SHELL_DEFAULT_TERMINAL_WIDTH;
+		shell->ctx->vt100_ctx.cons.terminal_hei =
+						  SHELL_DEFAULT_TERMINAL_HEIGHT;
 	}
 
-	SHELL_VT100_CMD(shell, SHELL_VT100_SETCOL_80);
-	shell->ctx->vt100_ctx.cons.terminal_wid = SHELL_DEFAULT_TERMINAL_WIDTH;
-	shell->ctx->vt100_ctx.cons.terminal_hei = SHELL_DEFAULT_TERMINAL_HEIGHT;
-	return 0;
+	return ret;
 }
 
 static int cmd_resize(const struct shell *shell, size_t argc, char **argv)
@@ -419,18 +470,19 @@
 	int err;
 
 	if (!IS_ENABLED(CONFIG_SHELL_CMDS_RESIZE)) {
-		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\r\n");
+		shell_fprintf(shell, SHELL_ERROR, "Command not supported.\n");
 		return -ENOEXEC;
 	}
 
-	if (!shell_cmd_precheck(shell, (argc <= 2), NULL, 0)) {
-		return 0;
+	err = shell_cmd_precheck(shell, (argc <= 2), NULL, 0);
+	if (err) {
+		return err;
 	}
 
 	if (argc != 1) {
-		shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\r\n", argv[0],
+		shell_fprintf(shell, SHELL_ERROR, "%s:%s%s\n", argv[0],
 			      SHELL_MSG_UNKNOWN_PARAMETER, argv[1]);
-		return -ENOEXEC;
+		return -EINVAL;
 	}
 
 	err = terminal_size_get(shell);
@@ -441,8 +493,10 @@
 				SHELL_DEFAULT_TERMINAL_HEIGHT;
 		shell_fprintf(shell, SHELL_WARNING,
 			      "No response from the terminal, assumed 80x24 "
-			      "screen size\r\n");
+			      "screen size\n");
+		return -ENOEXEC;
 	}
+
 	return 0;
 }