diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-06-12 09:05:28 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-06-12 12:00:27 +0200 |
| commit | f08325f76ba4aac15dc3125b7779045956863a4b (patch) | |
| tree | 2f6f022dc355c41985aab9e1c188a4e9582713b9 | |
| parent | 4e81fb861a79c9373b070176649bc0f4f8dfa850 (diff) | |
| download | minishell-f08325f76ba4aac15dc3125b7779045956863a4b.tar.gz minishell-f08325f76ba4aac15dc3125b7779045956863a4b.tar.bz2 minishell-f08325f76ba4aac15dc3125b7779045956863a4b.zip | |
Added preprocess escape with backslash, sticky str merge, travis CI before merge
| -rw-r--r-- | .travis.yml | 2 | ||||
| -rw-r--r-- | Makefile | 8 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | include/lexer.h | 7 | ||||
| -rw-r--r-- | include/minishell.h | 5 | ||||
| m--------- | libft | 0 | ||||
| -rw-r--r-- | src/env.c | 17 | ||||
| -rw-r--r-- | src/main.c | 17 | ||||
| -rw-r--r-- | src/ms_glob.c | 6 | ||||
| -rw-r--r-- | src/preprocess.c | 54 | ||||
| -rwxr-xr-x | test.sh | 14 |
11 files changed, 80 insertions, 52 deletions
diff --git a/.travis.yml b/.travis.yml index 039216a..466a76c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: c -script: make all && make test +script: make all @@ -6,7 +6,7 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2020/02/03 04:14:24 by cacharle #+# #+# # -# Updated: 2020/06/09 10:51:41 by charles ### ########.fr # +# Updated: 2020/06/12 09:17:28 by charles ### ########.fr # # # # **************************************************************************** # @@ -17,8 +17,6 @@ DOXYGEN = doxygen DOXYGEN_FILE = Doxyfile DOC_DIR = doc -TESTEXEC = test.sh - LIBFTDIR = libft INCLUDEDIR = include SRCDIR = src @@ -44,10 +42,6 @@ all: libft_all prebuild .PHONY: allnopre allnopre: $(NAME) -.PHONY: test -test: - @./$(TESTEXEC) - .PHONY: prebuild prebuild: @for subdir in $(OBJDIRS); do echo "Making dir $$subdir"; mkdir -p $$subdir; done @@ -1,4 +1,4 @@ -# minishell +# minishell [](https://travis-ci.com/HappyTramp/minishell) minishell project of school 42 diff --git a/include/lexer.h b/include/lexer.h index 9377807..c56244f 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -4,9 +4,10 @@ ////////////////////////////////////// enum e_token_tag { - LTAG_STR, - LTAG_STR_SINGLE, - LTAG_STR_DOUBLE, + LTAG_STR = 1 << 0, + LTAG_STR_SINGLE = 1 << 1, + LTAG_STR_DOUBLE = 1 << 2, + LTAG_STICK = 1 << 3, }; typedef struct diff --git a/include/minishell.h b/include/minishell.h index 76e4f7a..2afbed9 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/26 15:33:51 by cacharle #+# #+# */ -/* Updated: 2020/06/09 14:05:36 by charles ### ########.fr */ +/* Updated: 2020/06/12 11:57:36 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -109,7 +109,6 @@ int builtin_exit(char **argv, t_env env); ** preprocess.c */ -char *preprocess(char *input, t_env env); -char **preprocess_argv(t_ftvec *argv, t_env env); +char **preprocess(t_ftvec *argv, t_env env); #endif diff --git a/libft b/libft -Subproject 6fe30c97aad7a4a3564e7037d64a43edcb9a216 +Subproject 4f4fa0d6ba8f42da8d72257b50517c222c06249 @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 09:21:24 by cacharle #+# #+# */ -/* Updated: 2020/06/09 16:15:47 by charles ### ########.fr */ +/* Updated: 2020/06/12 10:51:10 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -67,8 +67,9 @@ char *env_search(t_env env, char *key) char *env_search_first_match(t_env env, const char *haystack) { - int len; + size_t len; size_t i; + size_t key_len; if (ft_isdigit(*haystack)) return (NULL); @@ -76,13 +77,15 @@ char *env_search_first_match(t_env env, const char *haystack) while (ft_isalnum(haystack[len]) || haystack[len] == '_') len++; if (len == 0) - return ("$"); - i = 0; - while (i < env->size - 1) + return (NULL); + i = -1; + while (++i < env->size - 1) { + key_len = ft_strchr(env->data[i], '=') - (char*)env->data[i]; + if (len != key_len) + continue ; if (ft_strncmp((char*)env->data[i], haystack, len) == 0) - return (ft_strchr((char*)env->data[i], '=') + 1); - i++; + return (ft_strchr(env->data[i], '=') + 1); } return (NULL); } @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/09 17:48:03 by charles ### ########.fr */ +/* Updated: 2020/06/12 11:57:48 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -100,7 +100,20 @@ int main(int argc, char **argv, char **envp) ft_vecpush(v, token_new(LTAG_STR, "*/*.c$TERM")); ft_vecpush(v, token_new(LTAG_STR, "src/*.c include/*.h")); ft_vecpush(v, token_new(LTAG_STR, "$A$B")); - char **as = preprocess_argv(v, env); + + ft_vecpush(v, token_new(LTAG_STR, "\\$TERM")); + ft_vecpush(v, token_new(LTAG_STR, "$TER\\M")); + ft_vecpush(v, token_new(LTAG_STR, "\\\\")); + ft_vecpush(v, token_new(LTAG_STR_SINGLE, "''''$TEST\\TEST")); + ft_vecpush(v, token_new(LTAG_STR_DOUBLE, ",$TEST,$B,")); + + ft_vecpush(v, token_new(LTAG_STR_DOUBLE | LTAG_STICK, "$TEST")); + ft_vecpush(v, token_new(LTAG_STR_DOUBLE | LTAG_STICK, "$TEST")); + ft_vecpush(v, token_new(LTAG_STR_DOUBLE , "$TEST")); + ft_vecpush(v, token_new(LTAG_STR_DOUBLE | LTAG_STICK, "$TEST")); + ft_vecpush(v, token_new(LTAG_STR_SINGLE, "$TEST")); + + char **as = preprocess(v, env); char **tmp = as; while (*as != NULL) diff --git a/src/ms_glob.c b/src/ms_glob.c index a96c45f..61dd93b 100644 --- a/src/ms_glob.c +++ b/src/ms_glob.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/05 11:44:07 by charles #+# #+# */ -/* Updated: 2020/06/09 17:51:30 by charles ### ########.fr */ +/* Updated: 2020/06/12 11:51:41 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -161,6 +161,10 @@ char *ms_glob(char *pattern) return (join); } +/* +** \brief Wrapper around `ms_glob` which free `pattern` for convinience +*/ + char *ms_globf(char *pattern) { char *ret; diff --git a/src/preprocess.c b/src/preprocess.c index c09ba71..1034068 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/06/09 17:56:20 by charles ### ########.fr */ +/* Updated: 2020/06/12 11:57:17 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,16 @@ #include "ms_glob.h" #include "lexer.h" -static char *iterpolate(char *str, t_env env) +static bool st_escapable(char c, enum e_token_tag tag) +{ + if (tag & LTAG_STR) + return (true); + if ((tag & LTAG_STR_DOUBLE) && (c == '\\' || c == '"' || c == '$')) + return (true); + return (false); +} + +static char *st_iterpolate_env(char *str, enum e_token_tag tag, t_env env) { size_t i; t_ftdstr *dstr; @@ -24,7 +33,9 @@ static char *iterpolate(char *str, t_env env) return (NULL); i = -1; while (++i < dstr->length) - if (dstr->str[i] == '$') + if (dstr->str[i] == '\\' && st_escapable(dstr->str[i + 1], tag)) + ft_dstrerase(dstr, i, 1); + else if (dstr->str[i] == '$') { if ((match = env_search_first_match(env, dstr->str + i + 1)) == NULL) { @@ -44,7 +55,7 @@ static char *iterpolate(char *str, t_env env) return (ft_dstrunwrap(dstr)); } -static char *iterpolate_globs(char *str) +static char *st_iterpolate_globs(char *str) { char **strs; int i; @@ -65,7 +76,7 @@ static char *iterpolate_globs(char *str) return (ft_strsjoinf(strs, " ")); } -static int splat_arg(t_ftvec *argv, int i) +static int st_splat_arg(t_ftvec *argv, int i) { t_token *splated; char **strs; @@ -93,7 +104,7 @@ static int splat_arg(t_ftvec *argv, int i) return (i + j - 1); } -void iter_func_unwrap_token(void **addr) +static void st_iter_func_unwrap_token(void **addr) { char *content; @@ -102,7 +113,7 @@ void iter_func_unwrap_token(void **addr) *(char**)addr = content; } -char **preprocess_argv(t_ftvec *argv, t_env env) +char **preprocess(t_ftvec *argv, t_env env) { size_t i; t_token *token; @@ -111,18 +122,35 @@ char **preprocess_argv(t_ftvec *argv, t_env env) while (++i < argv->size) { token = argv->data[i]; - if (token->tag == LTAG_STR_SINGLE) + if (token->tag & LTAG_STR_SINGLE) continue ; - token->content = iterpolate(token->content, env); - if (token->tag == LTAG_STR) + token->content = st_iterpolate_env(token->content, token->tag, env); + if (token->tag & LTAG_STR) { if (ft_strchr(token->content, '*') != NULL) - token->content = iterpolate_globs(token->content); - if ((i = splat_arg(argv, i)) == (size_t)-1) + token->content = st_iterpolate_globs(token->content); + if ((i = st_splat_arg(argv, i)) == (size_t)-1) + return (NULL); + } + } + + t_token *next; + i = -1; + while (++i < argv->size - 1) + { + token = argv->data[i]; + while (token->tag & LTAG_STICK && i + 1 < argv->size) + { + next = argv->data[i + 1]; + token->content = ft_strjoinf_fst(token->content, next->content); + if (token->content == NULL) return (NULL); + token->tag &= next->tag; + ft_vecremove(argv, i + 1, (void (*)(void*))token_destroy); } } - ft_veciter_addr(argv, iter_func_unwrap_token); + + ft_veciter_addr(argv, st_iter_func_unwrap_token); ft_vecpush(argv, NULL); return ((char**)ft_vecunwrap(argv)); } diff --git a/test.sh b/test.sh deleted file mode 100755 index 521f0dc..0000000 --- a/test.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -red() { - echo "`tput setaf 1`$1`tput sgr 0`\c" - test_status=1 -} - -green() { - echo "`tput setaf 2`$1`tput sgr 0`\c" -} - -echo "minishell test" - -echo "echo -n bonjour" | ./minishell |
