#include #include #include #include #include int cmd_exec(struct cmd *cmds, struct console *con, size_t argc, const char **argv) { struct cmd *cmd; if (argc < 1) return -1; for (cmd = cmds; cmd->cmd; ++cmd) { if (strcmp(cmd->cmd, argv[0]) == 0) { return cmd->exec(con, argc - 1, argv + 1); } } return -1; } int cmd_parse(struct cmd *cmds, struct console *con, const char *line) { char **argv; size_t argc; int ret; if (!(argv = parse_args(line, &argc))) return -1; ret = cmd_exec(cmds, con, argc, (const char **)argv); free(argv); return ret; } int shell_init(struct shell *shell, struct cmd *cmds, struct console *con, const char *prompt, unsigned flags) { if (!shell || !con) return -1; memset(shell->line, '\0', sizeof shell->line); shell->cmds = cmds; shell->con = con; shell->prompt = prompt; shell->flags = flags; fprintf(shell->con->fp, "%s ", prompt ? prompt : "#"); return 0; } int shell_parse(struct shell *shell) { int ret; if (!shell) return -1; if ((ret = console_getline(shell->con, shell->line, sizeof shell->line)) < 0) return ret; ret = cmd_parse(shell->cmds, shell->con, shell->line); if (shell->flags & SHELL_SHOW_EXIT_CODE) fprintf(shell->con->fp, "\004%d\n\004", ret); fprintf(shell->con->fp, "%s ", shell->prompt ? shell->prompt : "#"); *shell->line = '\0'; return 0; }