summaryrefslogtreecommitdiffstats
path: root/src/b_alias.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/b_alias.c')
-rw-r--r--src/b_alias.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/b_alias.c b/src/b_alias.c
new file mode 100644
index 0000000..5ddc46f
--- /dev/null
+++ b/src/b_alias.c
@@ -0,0 +1,136 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* b_alias.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 <stdlib.h>
+#include <unistd.h>
+#include <limits.h>
+
+#include "b_alias_print.h"
+#include "d_define.h"
+#include "s_struct.h"
+#include "u_alias.h"
+#include "u_utils.h"
+
+static uint8_t
+ b_print_arg_next(char *ptr, const char arg[], t_bool invalid, t_msh *msh)
+{
+ char val[ARG_MAX];
+
+ if (*ptr == C_NUL)
+ {
+ if (u_get_alias_value(val, arg, ARG_MAX, msh) != 0)
+ {
+ ft_printf("alias %s='%s'", arg, val);
+ return (0);
+ }
+ else
+ {
+ ft_dprintf(STDERR_FILENO, "minishell: alias: %s: not found\n", arg);
+ return (1);
+ }
+ }
+ else if (*ptr == C_EQUALS && invalid == TRUE)
+ {
+ ft_strlcpy(val, arg, ptr - arg);
+ ft_dprintf(STDERR_FILENO,
+ "minishell: alias: `%s': invalid alias name\n",
+ val);
+ return (1);
+ }
+ return (0);
+}
+
+static uint8_t
+ b_print_arg(const char arg[], t_msh *msh)
+{
+ char *ptr;
+ t_bool invalid;
+
+ ptr = (char*)arg;
+ invalid = FALSE;
+ while (*ptr != C_NUL && *ptr != C_EQUALS)
+ {
+ if (ft_iswhitespace(*ptr) == TRUE)
+ invalid = TRUE;
+ ptr++;
+ }
+ return (b_print_arg_next(ptr, arg, invalid, msh));
+}
+
+static void
+ b_register_arg(const char arg[], t_msh *msh)
+{
+ char *ptr;
+ char name[255];
+ char value[ARG_MAX];
+
+ ptr = (char*)arg;
+ while (*ptr != C_NUL && *ptr != C_EQUALS)
+ {
+ ptr++;
+ }
+ if (*ptr == C_EQUALS)
+ {
+ ft_strlcpy(name, arg, (ptr - arg < 255) ? ((ptr - arg) + 1) : (255));
+ ptr += 1;
+ ft_strlcpy(value, ptr, ARG_MAX);
+ u_set_alias_value(name, value, msh);
+ }
+}
+
+uint8_t
+ b_alias(char *args[], t_msh *msh)
+{
+ const uint64_t argc = u_builtins_get_argc((const char**)args);
+ int32_t i;
+ uint8_t ret;
+
+ ret = 0;
+ if (argc == 0)
+ {
+ if (msh->alias == NULL)
+ return (0);
+ b_print_alias_list(msh);
+ }
+ else if (argc > 0)
+ {
+ i = 0;
+ while (args[i] != NULL)
+ {
+ if (b_print_arg(args[i], msh) != 0)
+ {
+ ret = 1;
+ }
+ i++;
+ }
+ }
+ return (ret);
+}
+
+void
+ b_alias_mute(char *args[], t_msh *msh)
+{
+ const uint64_t argc = u_builtins_get_argc((const char**)args);
+ int32_t i;
+
+ if (argc > 0)
+ {
+ i = 0;
+ while (args[i] != NULL)
+ {
+ b_register_arg(args[i], msh);
+ i++;
+ }
+ }
+}