Skip to content

Commit 488c8e7

Browse files
authored
Merge pull request #197 from cacapon/feature/193-fix-export-dquote
split_key_value分離
2 parents a10676f + d0796df commit 488c8e7

File tree

5 files changed

+87
-52
lines changed

5 files changed

+87
-52
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ PARSER_SRC = allocate_cmds.c parser.c parser_utils.c setup_cmds.c \
5757
expand_env.c
5858
BUILTIN_SRC = cd.c exit.c pwd.c echo.c env.c unset.c export.c \
5959
env_utils.c env_utils_2.c env_utils_3.c builtin_utils.c \
60-
export_exec.c export_print_sorted_env.c export_error.c
60+
export_exec.c export_print_sorted_env.c export_error.c split_key_value.c
6161

6262
# 3.Add more directories as they are added.
6363
$(eval $(call add_module,root))

inc/builtin_utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ char *ft_strndup(const char *s1, size_t n);
2828
int export_exec(int argc, char **argv, t_minish *minish);
2929
int print_sorted_env(t_env *head);
3030
void export_err_invalid(char *sh, char *arg);
31+
int split_key_value(char *str, char **key_out, char **val_out);
3132

3233
#endif

inc/env_utils_2.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: ttsubo <[email protected]> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2025/04/17 11:40:36 by dayano #+# #+# */
9-
/* Updated: 2025/04/21 12:14:53 by ttsubo ### ########.fr */
9+
/* Updated: 2025/05/01 15:20:13 by ttsubo ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -18,6 +18,5 @@
1818
void free_env_list(t_env *head);
1919
void cleanup_minish(t_minish *minish);
2020
void handle_error_and_exit(const char *func_name, t_minish *minish);
21-
int split_key_value(char *str, char **key_out, char **val_out);
2221

2322
#endif

src/builtin/env_utils_2.c

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/* By: ttsubo <[email protected]> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2025/04/17 11:17:22 by dayano #+# #+# */
9-
/* Updated: 2025/04/28 16:32:00 by ttsubo ### ########.fr */
9+
/* Updated: 2025/05/01 14:27:15 by ttsubo ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

@@ -40,51 +40,3 @@ void handle_error_and_exit(const char *func_name, t_minish *minish)
4040
perror(func_name);
4141
exit(EXIT_FAILURE);
4242
}
43-
44-
static void _set_len_and_pos(char *str, size_t *key_len, size_t *val_start)
45-
{
46-
const char *sep;
47-
48-
sep = ft_strnstr(str, "+=", ft_strlen(str));
49-
if (sep)
50-
{
51-
*key_len = sep - str;
52-
*val_start = *key_len + 2;
53-
}
54-
else
55-
{
56-
sep = ft_strchr(str, '=');
57-
if (sep)
58-
{
59-
*key_len = sep - str;
60-
*val_start = *key_len + 1;
61-
}
62-
else
63-
{
64-
*key_len = ft_strlen(str);
65-
*val_start = 0;
66-
}
67-
}
68-
}
69-
70-
int split_key_value(char *str, char **key_out, char **val_out)
71-
{
72-
size_t key_len;
73-
size_t val_start;
74-
75-
if (!str || !key_out || !val_out)
76-
return (1);
77-
*key_out = NULL;
78-
*val_out = NULL;
79-
_set_len_and_pos(str, &key_len, &val_start);
80-
*key_out = ft_substr(str, 0, key_len);
81-
if (!*key_out)
82-
return (1);
83-
if (val_start > 0)
84-
{
85-
*val_out = ft_substr(str, val_start, ft_strlen(str) - val_start);
86-
if (!*val_out)
87-
return (free(*key_out), *key_out = NULL, 1);
88-
}
89-
return (0);
90-
}

src/builtin/split_key_value.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/* ************************************************************************** */
2+
/* */
3+
/* ::: :::::::: */
4+
/* split_key_value.c :+: :+: :+: */
5+
/* +:+ +:+ +:+ */
6+
/* By: ttsubo <[email protected]> +#+ +:+ +#+ */
7+
/* +#+#+#+#+#+ +#+ */
8+
/* Created: 2025/05/01 14:27:33 by ttsubo #+# #+# */
9+
/* Updated: 2025/05/01 14:54:33 by ttsubo ### ########.fr */
10+
/* */
11+
/* ************************************************************************** */
12+
13+
#include "main.h"
14+
15+
static void _set_len_and_pos(char *str, size_t *key_len, size_t *val_start)
16+
{
17+
const char *sep;
18+
19+
sep = ft_strnstr(str, "+=", ft_strlen(str));
20+
if (sep)
21+
{
22+
*key_len = sep - str;
23+
*val_start = *key_len + 2;
24+
}
25+
else
26+
{
27+
sep = ft_strchr(str, '=');
28+
if (sep)
29+
{
30+
*key_len = sep - str;
31+
*val_start = *key_len + 1;
32+
}
33+
else
34+
{
35+
*key_len = ft_strlen(str);
36+
*val_start = 0;
37+
}
38+
}
39+
}
40+
41+
static char *_strip_quotes(char *str, size_t val_start)
42+
{
43+
size_t len;
44+
45+
if (!str)
46+
return (NULL);
47+
str = str + val_start;
48+
len = ft_strlen(str);
49+
if ((str[0] == '"' && str[len - 1] == '"')
50+
|| (str[0] == '\'' && str[len - 1] == '\''))
51+
return (ft_substr(str, 1, len - 2));
52+
return (ft_strdup(str));
53+
}
54+
55+
/**
56+
* @brief e.g. "ABC=DEF" -> key_out=ABC, valout=DEF
57+
*
58+
* @param str
59+
* @param key_out
60+
* @param val_out
61+
* @return int
62+
*/
63+
int split_key_value(char *str, char **key_out, char **val_out)
64+
{
65+
size_t key_len;
66+
size_t val_start;
67+
68+
if (!str || !key_out || !val_out)
69+
return (1);
70+
*key_out = NULL;
71+
*val_out = NULL;
72+
_set_len_and_pos(str, &key_len, &val_start);
73+
*key_out = ft_substr(str, 0, key_len);
74+
if (!*key_out)
75+
return (1);
76+
if (val_start > 0)
77+
{
78+
*val_out = _strip_quotes(str, val_start);
79+
if (!*val_out)
80+
return (free(*key_out), *key_out = NULL, 1);
81+
}
82+
return (0);
83+
}

0 commit comments

Comments
 (0)