diff options
Diffstat (limited to 'src/b_sqb.c')
-rw-r--r-- | src/b_sqb.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/b_sqb.c b/src/b_sqb.c new file mode 100644 index 0000000..a5a0fd5 --- /dev/null +++ b/src/b_sqb.c @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* b_sqb.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <stdint.h> +#include <unistd.h> + +#include "b_sqb_err.h" +#include "b_sqb_file.h" +#include "b_sqb_nbr.h" +#include "b_sqb_str.h" +#include "d_define.h" +#include "s_struct.h" +#include "u_utils.h" + +static uint8_t + b_get_sqb_id(char *argv[], + t_msh *msh) +{ + uint8_t i; + + i = 0; + while (i < FT_ID_SQB_COUNT) + { + if (i < FT_ID_SQB_NT && + ft_strncmp(argv[0], + msh->sqb_ref[i], + ft_strlen(msh->sqb_ref[i]) + 1) == 0) + return (i); + if (i >= FT_ID_SQB_NT && + ft_strncmp(argv[1], + msh->sqb_ref[i], + ft_strlen(msh->sqb_ref[i]) + 1) == 0) + return (i); + i++; + } + return (i); +} + +static uint8_t + b_eval_sqb(char *argv[], + t_msh *msh) +{ + uint8_t id; + uint8_t ret; + + id = b_get_sqb_id(argv, msh); + if (id == FT_ID_SQB_COUNT) + { + ft_dprintf(STDERR_FILENO, "[: %s: unexpected operator\n", argv[0]); + return (2); + } + if (b_sqb_err_check(id, argv) != 0) + return (2); + ret = 0; + if (id < FT_ID_SQB_NT && id != FT_ID_SQB_Z && id != FT_ID_SQB_N) + ret = b_sqb_file_tests(id, argv); + else if (id == FT_ID_SQB_NT || id == FT_ID_SQB_OT) + ret = b_sqb_double_file_tests(id, argv); + else if (id == FT_ID_SQB_N || id == FT_ID_SQB_Z || + id == FT_ID_SQB_EQUA || id == FT_ID_SQB_DIFF) + ret = b_sqb_str(id, argv); + else if (id >= FT_ID_SQB_EQ) + ret = b_sqb_nbr(id, argv); + return (ret); +} + +uint8_t + b_sqb(char *args[], + t_msh *msh) +{ + const uint64_t argc = u_builtins_get_argc((const char**)args); + + if (ft_strncmp(args[argc - 1], "]", 2) != 0) + { + ft_dprintf(STDERR_FILENO, "[: missing ]\n"); + return (2); + } + if (argc == 1) + return (1); + else if (argc == 2) + return (0); + return (b_eval_sqb(args, msh)); +} |