diff --git a/src/builtins/exit/exit.c b/src/builtins/exit/exit.c index a2aff19..11b3727 100644 --- a/src/builtins/exit/exit.c +++ b/src/builtins/exit/exit.c @@ -11,98 +11,34 @@ /* ************************************************************************** */ #include "builtins.h" -#include -static uint8_t get_uint8_from_num(const char *arg, uint8_t *status); -static uint8_t has_overflow( - uint64_t n, - char digit, - uint64_t limit - ); -static uint8_t resolve_exit_status( - t_command cmd, - t_minishell *msh, - uint8_t *exit_status - ); - -uint8_t builtin_exit( +u_int8_t builtin_exit( t_command cmd, t_minishell *msh ) { - uint8_t exit_status; - if (isatty(STDIN_FILENO)) ft_eputendl("exit"); - if (!resolve_exit_status(cmd, msh, &exit_status)) - return (msh->exit_status); - msh->exit = true; - msh->exit_status = exit_status; - return (exit_status); -} - -static uint8_t resolve_exit_status( - t_command cmd, - t_minishell *msh, - uint8_t *exit_status -){ if (cmd.argc == 1) - *exit_status = msh->exit_status; - else if (!get_uint8_from_num(cmd.argv[1], exit_status)) { - ft_eprintf("minishell: exit: %s: numeric argument required\n", - cmd.argv[1]); - msh->exit = true; - msh->exit_status = 2; - return (0); + msh->exit = 1; + return (msh->exit_status); + } + else if (!ft_strisnum(cmd.argv[1])) + { + ft_eputstr("exit: "); + ft_eputendl(cmd.argv[1]); + ft_eputendl(": numeric argument required"); + return (2); } else if (cmd.argc > 2) { - ft_eputendl("minishell: exit: too many arguments"); - msh->exit_status = EXIT_FAILURE; - return (0); + ft_eputendl("exit: too many arguments"); + return (2); } - return (1); -} - -static uint8_t get_uint8_from_num( - const char *arg, - uint8_t *status -){ - uint64_t n; - uint64_t limit; - int sign; - - if (arg == NULL || *arg == '\0') - return (0); - n = 0; - sign = 1; - if (*arg == '+' || *arg == '-') - if (*arg++ == '-') - sign = -1; - if (*arg == '\0') - return (0); - limit = LONG_MAX; - if (sign == -1) - limit = (uint64_t)LONG_MAX + 1; - while (*arg != '\0') + else { - if (!ft_isdigit(*arg) || has_overflow(n, *arg, limit)) - return (0); - n = (n * 10) + (*arg++ - '0'); + msh->exit = 1; + return ((u_int8_t)ft_atol(cmd.argv[1])); } - *status = (uint8_t)(n * sign); - return (1); -} - -static uint8_t has_overflow( - uint64_t n, - char digit, - uint64_t limit -){ - if (n > (limit / 10)) - return (1); - if (n == (limit / 10) && (uint64_t)(digit - '0') > (limit % 10)) - return (1); - return (0); }