diff --git a/src/builtins/builtin_history.c b/src/builtins/builtin_history.c index c13719e..671638a 100644 --- a/src/builtins/builtin_history.c +++ b/src/builtins/builtin_history.c @@ -77,7 +77,7 @@ char *his_last_command(char *line, char *his_last_same_command(char *line, his_variable_t *his_variable, his_command_t *his_command) { - char *new_line = &line[1]; + char *new_line = &line[his_variable->coord_variable + 1]; char *new_str = NULL; for (int i = his_command->sz - 1; i >= 0; i--) { @@ -101,7 +101,7 @@ char *his_last_same_command(char *line, char *his_id_command(char *line, his_variable_t *his_variable, his_command_t *his_command) { - int id = ((int)line[1] - 48) - 1; + int id = atoi(&line[his_variable->coord_variable + 1]); char *new_line; char *new_str = NULL; diff --git a/src/history.h b/src/history.h index b239d1c..2c423d7 100644 --- a/src/history.h +++ b/src/history.h @@ -35,6 +35,8 @@ typedef struct parsing_history_s { char *(*funct)(char *, his_variable_t *, his_command_t *); } parsing_history_t; +extern const parsing_history_t tab_fnct[]; + int parse_history(char **pointer_line, size_t *buffer_len, size_t *buffer_sz, his_command_t **cmd_history); char *his_last_command(char *line, diff --git a/src/shell.c b/src/shell.c index b88556b..304d663 100644 --- a/src/shell.c +++ b/src/shell.c @@ -34,6 +34,8 @@ void debug_env_entries(env_t *env) static void check_basic_error(char const *buffer) { + if (buffer == NULL) + return; if (*buffer == '|') WRITE_CONST(STDERR_FILENO, "Invalid null command.\n"); if (*buffer == '>' || *buffer == '<') diff --git a/src/update_command.c b/src/update_command.c index 988e48e..dd2d83d 100644 --- a/src/update_command.c +++ b/src/update_command.c @@ -8,9 +8,21 @@ #include "builtins_handler.h" #include "u_str.h" -his_command_t *save_command(char *cmd, his_command_t *cmd_history) +static int check_cmd(char *cmd) { if (!cmd) + return 84; + for (int i = 0; cmd[i] != 0; i++) + if (cmd[i] == CHAR_HIST && + (cmd[i + 1] != ' ' && cmd[i + 1] != '\t' + && cmd[i + 1] != '\0')) + return 84; + return 0; +} + +his_command_t *save_command(char *cmd, his_command_t *cmd_history) +{ + if (check_cmd(cmd) == 84) return cmd_history; if (cmd_history->sz < 100) { cmd_history[cmd_history->sz] = set_cmd(cmd, @@ -27,8 +39,9 @@ size_t update_command(char **buffer, buffer_len = u_strlen(*buffer); (*buffer)[buffer_len - 1] = '\0'; - parse_history(buffer, &buffer_len, - buffer_sz, &builtin_handler->history_command); + if (parse_history(buffer, &buffer_len, + buffer_sz, &builtin_handler->history_command) == 84) + return -1; builtin_handler->history_command = save_command(*buffer, builtin_handler->history_command); return buffer_len;