Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
1 change: 1 addition & 0 deletions inc/builtin_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 1 addition & 2 deletions inc/env_utils_2.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: ttsubo <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

Expand All @@ -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
50 changes: 1 addition & 49 deletions src/builtin/env_utils_2.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: ttsubo <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

Expand Down Expand Up @@ -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);
}
83 changes: 83 additions & 0 deletions src/builtin/split_key_value.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* split_key_value.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttsubo <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}