diff --git a/Makefile b/Makefile index d0d5ef8..42777f6 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,7 @@ PARSER_SRC = allocate_cmds.c parser.c parser_utils.c setup_cmds.c \ expand_env.c BUILTIN_SRC = cd.c exit.c pwd.c echo.c env.c unset.c export.c \ env_utils.c env_utils_2.c env_utils_3.c builtin_utils.c \ - export_exec.c export_print_sorted_env.c export_error.c + export_exec.c export_print_sorted_env.c export_error.c split_key_value.c # 3.Add more directories as they are added. $(eval $(call add_module,root)) diff --git a/inc/builtin_utils.h b/inc/builtin_utils.h index 6236b0e..ef6dcf5 100644 --- a/inc/builtin_utils.h +++ b/inc/builtin_utils.h @@ -28,5 +28,6 @@ char *ft_strndup(const char *s1, size_t n); int export_exec(int argc, char **argv, t_minish *minish); int print_sorted_env(t_env *head); void export_err_invalid(char *sh, char *arg); +int split_key_value(char *str, char **key_out, char **val_out); #endif diff --git a/inc/env_utils_2.h b/inc/env_utils_2.h index 27d7505..6ced67b 100644 --- a/inc/env_utils_2.h +++ b/inc/env_utils_2.h @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/17 11:40:36 by dayano #+# #+# */ -/* Updated: 2025/04/21 12:14:53 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 15:20:13 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,5 @@ void free_env_list(t_env *head); void cleanup_minish(t_minish *minish); void handle_error_and_exit(const char *func_name, t_minish *minish); -int split_key_value(char *str, char **key_out, char **val_out); #endif diff --git a/src/builtin/env_utils_2.c b/src/builtin/env_utils_2.c index c02ffa6..d93b34b 100644 --- a/src/builtin/env_utils_2.c +++ b/src/builtin/env_utils_2.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/17 11:17:22 by dayano #+# #+# */ -/* Updated: 2025/04/28 16:32:00 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 14:27:15 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,51 +40,3 @@ void handle_error_and_exit(const char *func_name, t_minish *minish) perror(func_name); exit(EXIT_FAILURE); } - -static void _set_len_and_pos(char *str, size_t *key_len, size_t *val_start) -{ - const char *sep; - - sep = ft_strnstr(str, "+=", ft_strlen(str)); - if (sep) - { - *key_len = sep - str; - *val_start = *key_len + 2; - } - else - { - sep = ft_strchr(str, '='); - if (sep) - { - *key_len = sep - str; - *val_start = *key_len + 1; - } - else - { - *key_len = ft_strlen(str); - *val_start = 0; - } - } -} - -int split_key_value(char *str, char **key_out, char **val_out) -{ - size_t key_len; - size_t val_start; - - if (!str || !key_out || !val_out) - return (1); - *key_out = NULL; - *val_out = NULL; - _set_len_and_pos(str, &key_len, &val_start); - *key_out = ft_substr(str, 0, key_len); - if (!*key_out) - return (1); - if (val_start > 0) - { - *val_out = ft_substr(str, val_start, ft_strlen(str) - val_start); - if (!*val_out) - return (free(*key_out), *key_out = NULL, 1); - } - return (0); -} diff --git a/src/builtin/split_key_value.c b/src/builtin/split_key_value.c new file mode 100644 index 0000000..7be8e20 --- /dev/null +++ b/src/builtin/split_key_value.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* split_key_value.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ttsubo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/01 14:27:33 by ttsubo #+# #+# */ +/* Updated: 2025/05/01 14:54:33 by ttsubo ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "main.h" + +static void _set_len_and_pos(char *str, size_t *key_len, size_t *val_start) +{ + const char *sep; + + sep = ft_strnstr(str, "+=", ft_strlen(str)); + if (sep) + { + *key_len = sep - str; + *val_start = *key_len + 2; + } + else + { + sep = ft_strchr(str, '='); + if (sep) + { + *key_len = sep - str; + *val_start = *key_len + 1; + } + else + { + *key_len = ft_strlen(str); + *val_start = 0; + } + } +} + +static char *_strip_quotes(char *str, size_t val_start) +{ + size_t len; + + if (!str) + return (NULL); + str = str + val_start; + len = ft_strlen(str); + if ((str[0] == '"' && str[len - 1] == '"') + || (str[0] == '\'' && str[len - 1] == '\'')) + return (ft_substr(str, 1, len - 2)); + return (ft_strdup(str)); +} + +/** + * @brief e.g. "ABC=DEF" -> key_out=ABC, valout=DEF + * + * @param str + * @param key_out + * @param val_out + * @return int + */ +int split_key_value(char *str, char **key_out, char **val_out) +{ + size_t key_len; + size_t val_start; + + if (!str || !key_out || !val_out) + return (1); + *key_out = NULL; + *val_out = NULL; + _set_len_and_pos(str, &key_len, &val_start); + *key_out = ft_substr(str, 0, key_len); + if (!*key_out) + return (1); + if (val_start > 0) + { + *val_out = _strip_quotes(str, val_start); + if (!*val_out) + return (free(*key_out), *key_out = NULL, 1); + } + return (0); +}