Files
mmoat/srcs/builtins/exit.c
Loic Deridder 1efc094d19 exec pt1
2025-01-27 15:46:18 +01:00

124 lines
2.6 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* exit.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lderidde <lderidde@student.s19.be> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/24 14:32:13 by lderidde #+# #+# */
/* Updated: 2025/01/27 11:19:17 by lderidde ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../includes/builtins.h"
int ft_isnumeric(char *str)
{
int i;
i = 0;
if (!str)
return (1);
while (str[i])
{
if (ft_isdigit(str[i]))
i++;
else
return (0);
}
return (1);
}
void bash_exit(int code)
{
ft_putendl_fd("exit", 2);
exit(code);
}
void bash_exit_errornum(char *arg)
{
ft_putendl_fd("exit", 2);
ft_put_s_fd("minishell: exit: ", 2);
write(2, arg, ft_strlen(arg));
ft_putendl_fd(": numeric argument required", 2);
exit(2);
}
static char *get_arg(char *str)
{
int i;
i = 4;
if (!str[i])
return (NULL);
while (str[i] && str[i] == ' ')
i++;
return (&str[i]);
}
int is_sep(char c)
{
if ((c >= 9 && c <= 13) || c == ' ' || c == '\0')
return (1);
else
return (0);
}
int count_arg(char *str)
{
int count;
int i;
count = 0;
i = 0;
while (str[i] && str[i + 1])
{
if (!is_sep(str[i]) && is_sep(str[i + 1]))
count++;
i++;
}
return (count);
}
void bash_exiterrorcount(void)
{
ft_putendl_fd("exit", 2);
ft_putendl_fd("minishell: exit: too many arguments", 2);
/*
* SET EXIT CODE WITHOUT EXITING MINISHELL
*/
}
void builtin_exit(char *str, bool depth)
{
char *arg;
arg = get_arg(str);
long res = ft_atol(arg);
(void)res;
if (errno == ERANGE)
ft_printf("error numeric aarg\n");
if (depth == true)
{
if (count_arg(str) >= 2)
{
ft_putendl_fd("minishell: exit: too many arguments", 2);
exit (1);
}
if (!ft_isnumeric(arg))
{
ft_put_s_fd("minishell: exit: ", 2);
write(2, arg, ft_strlen(arg));
ft_putendl_fd(": numeric argument required", 2);
exit(2);
}
exit(ft_atol(arg) % 256);
}
if (count_arg(str) >= 2)
bash_exiterrorcount();
else if (ft_isnumeric(arg))
bash_exit(ft_atol(arg) % 256);
else
bash_exit_errornum(arg);
}