diff --git a/Makefile b/Makefile index 996e9c7..6e9af5d 100755 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ NAME = minishell LIBFT = libft.a -SRCS = minishell.c lexer.c parser.c caller.c built-in.c env.c -SRCS += utils_1.c utils_2.c utils_3.c +SRCS = minishell.c lexer.c lexer_2.c lexer_3.c parser.c caller.c +SRCS += built-in.c env.c utils_1.c utils_2.c OBJS = ${SRCS:.c=.o} @@ -15,24 +15,30 @@ ifeq ($(UNAME_S), Darwin) endif $(NAME): $(LIBFT) $(OBJS) - gcc -g ${OBJS} ${LIB} -o ${NAME} + @echo "Making Minishell." + @gcc -g ${OBJS} ${LIB} -o ${NAME} + @echo "Done." $(LIBFT): - ${MAKE} -C ./libft - cp ./libft/libft.a . + @${MAKE} -C ./libft + @cp ./libft/libft.a . all: $(NAME) %.o: %.c - gcc -Werror -Wextra -Wall -g -c $< ${READLINE_INC} + @gcc -Werror -Wextra -Wall -g -c $< ${READLINE_INC} clean: - rm -rf ${OBJS} + @echo "Cleaning objects." + @rm -rf ${OBJS} + @echo "Done." fclean: clean - ${MAKE} -C ./libft fclean - rm -rf libft.a - rm -rf ${NAME} + @${MAKE} -C ./libft fclean + @rm -rf libft.a + @echo "Cleaning binary." + @rm -rf ${NAME} + @echo "Done." re: fclean all diff --git a/README.md b/README.md index b262875..f1bc72d 100755 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ - ## Issues : - cat | ls ; cat | cat | ls ... -- syntax error for unclosed quotes +- syntax error for unclosed quotes -> handled as closed at end of line; - stderror syntax - export without arg -> env + declare. - segfault when last cmd empty diff --git a/built-in.c b/built-in.c index a5dc0ba..46e9861 100755 --- a/built-in.c +++ b/built-in.c @@ -6,12 +6,29 @@ /* By: narnaud +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/06 09:02:57 by narnaud #+# #+# */ -/* Updated: 2022/05/11 01:27:56 by narnaud@stude ### ########.fr */ +/* Updated: 2022/05/16 09:17:34 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +int is_builtin(char *cmd) +{ + int cmd_len; + + cmd_len = ft_strlen(cmd) + 1; + if (!ft_strncmp(cmd, "echo", ft_min(cmd_len, 5)) + || !ft_strncmp(cmd, "pwd", ft_min(cmd_len, 4)) + || !ft_strncmp(cmd, "cd", ft_min(cmd_len, 3)) + || !ft_strncmp(cmd, "export", ft_min(cmd_len, 7)) + || !ft_strncmp(cmd, "unset", ft_min(cmd_len, 6)) + || !ft_strncmp(cmd, "env", ft_min(cmd_len, 4)) + || !ft_strncmp(cmd, "exit", ft_min(cmd_len, 5))) + return (1); + else + return (0); +} + int ft_echo(t_command *cmd) { int no_nl; @@ -62,11 +79,11 @@ int ft_cd(t_command *cmd) if (cmd->argv[1]) { if (access(cmd->argv[1], X_OK)) - return (file_error(cmd->argv[0], cmd->argv[1], \ - "Permission denied\n")); + return (file_error(cmd->argv[0], cmd->argv[1], + "Permission denied\n")); else if (access(cmd->argv[1], F_OK)) - return (file_error(cmd->argv[0], cmd->argv[1], \ - "Not a directory\n")); + return (file_error(cmd->argv[0], cmd->argv[1], + "Not a directory\n")); chdir(cmd->argv[1]); return (1); } diff --git a/caller.c b/caller.c index e459464..375e00b 100755 --- a/caller.c +++ b/caller.c @@ -6,33 +6,16 @@ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/03 11:48:16 by narnaud #+# #+# */ -/* Updated: 2022/05/12 13:36:30 by mea ### ########.fr */ +/* Updated: 2022/05/16 08:12:12 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void exe(t_datas *datas, t_command *cmd); -static pid_t caller(t_datas *datas, t_command *cmd); +static void call_binary(t_datas *datas, t_command *cmd); +static pid_t call(t_datas *datas, t_command *cmd); -int is_builtin(char *cmd) -{ - int cmd_len; - - cmd_len = ft_strlen(cmd) + 1; - if (!ft_strncmp(cmd, "echo", ft_min(cmd_len, 5)) \ - || !ft_strncmp(cmd, "pwd", ft_min(cmd_len, 4)) \ - || !ft_strncmp(cmd, "cd", ft_min(cmd_len, 3)) \ - || !ft_strncmp(cmd, "export", ft_min(cmd_len, 7)) \ - || !ft_strncmp(cmd, "unset", ft_min(cmd_len, 6)) \ - || !ft_strncmp(cmd, "env", ft_min(cmd_len, 4)) \ - || !ft_strncmp(cmd, "exit", ft_min(cmd_len, 5))) - return (1); - else - return (0); -} - -int builtin_call(t_datas *datas, t_command *cmd) +int call_builtin(t_datas *datas, t_command *cmd) { if (ft_strncmp(cmd->argv[0], "echo", 5) == 0) return (ft_echo(cmd)); @@ -52,50 +35,7 @@ int builtin_call(t_datas *datas, t_command *cmd) return (-1); } -int check_skip(t_datas *datas, t_command *cmd) -{ - if (cmd->next && ((cmd->ope == AND && !datas->exit_code) \ - || (cmd->ope == OR && datas->exit_code))) - return (0); - return (1); -} - -int piper(t_datas *datas, t_command *cmd) -{ - int pip[2]; - pid_t pid; - int status; - - if (cmd->ope == PIPE) - { - pipe(pip); - if (!cmd->fd[1]) - cmd->fd[1] = pip[1]; - if (!cmd->next->fd[0]) - cmd->next->fd[0] = pip[0]; - } - pid = caller(datas, cmd); - if (cmd->fd[1]) - close(cmd->fd[1]); - if (cmd->fd[0]) - close(cmd->fd[0]); - if (DEBUG) - printf("%s -ope: %d, argc: %d, pid: %d, fdin: %d, fdout: %d\n", cmd->argv[0], cmd->ope, cmd->argc, pid, cmd->fd[0], cmd->fd[1]); - if (cmd->ope == PIPE) - pid = piper(datas, cmd->next); - waitpid(pid, &status, 0); - datas->exit_code = handle_status(datas, status); - if (cmd->ope != PIPE) - { - while (cmd->next && check_skip(datas, cmd)) - cmd = cmd->next; - if (cmd->next) - piper(datas, cmd->next); - } - return (1); -} - -static void exe(t_datas *datas, t_command *cmd) +static void call_binary(t_datas *datas, t_command *cmd) { char **path_dirs; char *path; @@ -121,15 +61,15 @@ static void exe(t_datas *datas, t_command *cmd) } } -static pid_t caller(t_datas *datas, t_command *cmd) +static pid_t call(t_datas *datas, t_command *cmd) { pid_t pid; pid = fork(); if (!pid) { - if (builtin_call(datas, cmd) == -1) - { + if (call_builtin(datas, cmd) == -1) + { if (cmd->fd[0]) { dup2(cmd->fd[0], STDIN_FILENO); @@ -140,9 +80,53 @@ static pid_t caller(t_datas *datas, t_command *cmd) dup2(cmd->fd[1], STDOUT_FILENO); close(cmd->fd[1]); } - exe(datas, cmd); + if (cmd->ope == PIPE) + close(cmd->next->fd[0]); + call_binary(datas, cmd); } exit(EXIT_SUCCESS); } return (pid); } + +void create_pipe(t_command *cmd) +{ + int pip[2]; + + if (cmd->ope != PIPE) + return ; + pipe(pip); + if (!cmd->fd[1]) + cmd->fd[1] = pip[1]; + else + close(pip[1]); + if (!cmd->next->fd[0]) + cmd->next->fd[0] = pip[0]; + else + close(pip[0]); +} + +int caller(t_datas *datas, t_command *cmd) +{ + int status; + + create_pipe(cmd); + cmd->pid = call(datas, cmd); + if (cmd->fd[0]) + close(cmd->fd[0]); + if (cmd->fd[1]) + close(cmd->fd[1]); + if (cmd->ope == PIPE) + caller(datas, cmd->next); + waitpid(cmd->pid, &status, 0); + datas->exit_code = handle_status(datas, status); + if (cmd->ope != PIPE) + { + while (cmd->next && !((cmd->ope == AND && !datas->exit_code) \ + || (cmd->ope == OR && datas->exit_code))) + cmd = cmd->next; + if (cmd->next) + caller(datas, cmd->next); + } + return (1); +} diff --git a/lexer.c b/lexer.c index 5640283..d6bc54a 100755 --- a/lexer.c +++ b/lexer.c @@ -6,21 +6,22 @@ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 13:44:57 by narnaud #+# #+# */ -/* Updated: 2022/05/12 14:53:06 by mea ### ########.fr */ +/* Updated: 2022/05/16 08:15:13 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" static int check_state(t_lexer *lex, char **line); + static int check_register(t_lexer *lex, char **line, char *tmp); t_token *lexer(t_datas *datas, char *line) { - t_lexer *lex; - t_token *ret; - char *tmp; - int tmp_i; + t_lexer *lex; + t_token *ret; + char *tmp; + int tmp_i; lex = ft_calloc(1, sizeof(*lex)); lex->state = ROOT_ST; @@ -30,7 +31,7 @@ t_token *lexer(t_datas *datas, char *line) { if (check_state(lex, &line)) continue ; - if (lex->state != S_QUOTE_ST && lex->deep == 0 && *line == '$' + if (lex->state != S_QUOTE_ST && lex->deep == 0 && *line == '$' && (line[1] != '\0' && !isspace(line[1]))) { tmp_i = replace_var(datas, &line, tmp, tmp_i); diff --git a/lexer_2.c b/lexer_2.c new file mode 100644 index 0000000..170df7a --- /dev/null +++ b/lexer_2.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: narnaud +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/05/16 07:53:17 by narnaud #+# #+# */ +/* Updated: 2022/05/16 09:20:23 by narnaud ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static char *get_var_value(t_datas *datas, char **line, int name_len); + +int replace_var(t_datas *datas, char **line, char *tmp, int tmp_i) +{ + int name_len; + int i; + char *value; + + if ((*line)[1] == '?') + { + value = ft_itoa(datas->exit_code); + name_len = 2; + } + else + { + name_len = 1; + while (ft_isalpha((*line)[name_len]) \ + || ft_isdigit((*line)[name_len]) || (*line)[name_len] == '_') + name_len++; + value = get_var_value(datas, line, name_len); + } + i = 0; + while (value[i]) + tmp[tmp_i++] = value[i++]; + tmp[tmp_i] = 0; + *line += name_len; + free(value); + return (tmp_i); +} + +char *expend_str(t_datas *datas, char *line) +{ + char *tmp; + int tmp_i; + + tmp = ft_calloc(STR_MAX_SIZE, sizeof(*tmp)); + if (!tmp) + free(tmp); + tmp_i = 0; + while (*line) + { + if (*line == '$') + tmp_i = replace_var(datas, &line, tmp, tmp_i); + else + tmp[tmp_i++] = *(line++); + } + return (tmp); +} + +static char *get_var_value(t_datas *datas, char **line, int name_len) +{ + int i; + char **env; + char *name; + char *value; + + name = ft_substr(*line, 1, name_len - 1); + i = 0; + value = NULL; + while (datas->envp[i] && !value) + { + env = ft_split(datas->envp[i], '='); + if (!ft_strncmp(name, env[0], name_len + 1)) + value = (free(env[0]), env[1]); + else if (++i) + ft_free_split(env); + } + free(name); + if (value) + free(env); + else + value = strdup(""); + return (value); +} + +int set_redir(t_lexer *lex, char **line, char ch) +{ + static t_type type_out[2] = {OUT, ADD}; + static t_type type_in[2] = {IN, HD}; + t_type *type; + + if (ch == '>') + type = type_out; + else + type = type_in; + if (**line == ch && (*line)++) + { + if (**line == ch && (*line)++) + lex->next_type = type[1]; + else + lex->next_type = type[0]; + return (1); + } + return (0); +} diff --git a/lexer_3.c b/lexer_3.c new file mode 100644 index 0000000..d0e3841 --- /dev/null +++ b/lexer_3.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_3.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: narnaud +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/05/16 09:18:30 by narnaud #+# #+# */ +/* Updated: 2022/05/16 09:56:05 by narnaud ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int wc_str_cmp(char *wc, char *str) +{ + int i; + int j; + int skip ; + + i = 0; + j = 0; + skip = (wc[0] != '.' && str[0] == '.'); + while (wc[i] && !skip) + { + if (wc[i] == '*' && ++i) + while (str[j] && str[j] != wc[i]) + j++; + else if (str[j] != wc[i]) + skip = 1; + else + { + i++; + j++; + } + } + if (str[j] != wc[i]) + skip = 1; + return (skip); +} + +int create_wc(t_lexer *lex, char *wc) +{ + DIR *direct; + struct dirent *file; + + direct = opendir("."); + file = (readdir(direct), readdir(direct), readdir(direct)); + while (file) + { + if (!wc_str_cmp(wc, file->d_name)) + create_token(lex, file->d_name); + file = readdir(direct); + } + closedir(direct); + lex->wc = 0; + return (1); +} diff --git a/libft/Makefile b/libft/Makefile index 1713a8e..2686b6f 100755 --- a/libft/Makefile +++ b/libft/Makefile @@ -37,19 +37,23 @@ RM = rm -rf CFLAGS = -Wall -Wextra -Werror .c.o: - ${CC} ${CFLAGS} -c $< -o ${<:.c=.o} + @${CC} ${CFLAGS} -c $< -o ${<:.c=.o} all : $(NAME) $(NAME): $(OBJS) - ${AR} ${NAME} ${OBJS} + @echo "Making libft." + @${AR} ${NAME} ${OBJS} + @echo "Done." clean: - ${RM} ${OBJS} - ${RM} ${OBJS_BONUS} + @echo "Cleaning libft." + @${RM} ${OBJS} + @${RM} ${OBJS_BONUS} + @echo "Done." fclean: clean - ${RM} ${NAME} + @${RM} ${NAME} re: fclean all diff --git a/minishell.c b/minishell.c index eeb05a2..2d01b05 100755 --- a/minishell.c +++ b/minishell.c @@ -6,7 +6,7 @@ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 12:14:09 by narnaud #+# #+# */ -/* Updated: 2022/05/11 00:45:01 by narnaud@stude ### ########.fr */ +/* Updated: 2022/05/16 08:16:48 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,6 @@ void termios(int ctl) signal(SIGINT, sigs_handler); signal(SIGQUIT, sigs_handler); } - termios_p.c_cc[VQUIT] = ctl * 28; tcsetattr(tty, TCSANOW, &termios_p); } @@ -66,9 +65,9 @@ void prompt(t_datas *datas, char *line) return ; cmd = parser(datas, lexer(datas, line), NULL); if (!cmd->prev && !cmd->next && is_builtin(cmd->argv[0])) - builtin_call(datas, cmd); + call_builtin(datas, cmd); else - piper(datas, cmd); + caller(datas, cmd); free_cmd(cmd); add_history(line); } diff --git a/minishell.h b/minishell.h index a04f5af..877740b 100755 --- a/minishell.h +++ b/minishell.h @@ -6,7 +6,7 @@ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 13:50:44 by narnaud #+# #+# */ -/* Updated: 2022/05/12 14:52:06 by mea ### ########.fr */ +/* Updated: 2022/05/16 09:22:48 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ # define ENVP_MAX_SIZE 4096 # define STR_MAX_SIZE 4096 # define PATHS_MAX_SIZE 126 -# define DEBUG 0 +# define DEBUG 1 # include "libft/libft.h" # include @@ -34,6 +34,7 @@ typedef struct s_command { + pid_t pid; char **argv; int argc; int ope; @@ -67,6 +68,7 @@ int is_valid_identifier(char *ident); int create_wc(t_lexer *lex, char *tmp); // ----------------------------------Builtins.c +int is_builtin(char *cmd); int ft_echo(t_command *cmd); int ft_pwd(t_command *cmd); int ft_cd(t_command *cmd); @@ -78,9 +80,8 @@ int ft_env(t_datas *datas, t_command *cmd); int ft_export(t_datas *datas, t_command *cmd); // ----------------------------------Caller.c -int is_builtin(char *cmd); -int builtin_call(t_datas *datas, t_command *cmd); -int piper(t_datas *datas, t_command *cmd); +int call_builtin(t_datas *datas, t_command *cmd); +int caller(t_datas *datas, t_command *cmd); // ----------------------------------Parser.c typedef enum e_type @@ -128,4 +129,5 @@ typedef struct s_lex t_token *lexer(t_datas *datas, char *line); int create_token(t_lexer *lex, char str[]); +int create_wc(t_lexer *lex, char *wc); #endif diff --git a/parser.c b/parser.c index 3c26784..c026108 100755 --- a/parser.c +++ b/parser.c @@ -6,7 +6,7 @@ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 16:09:25 by narnaud #+# #+# */ -/* Updated: 2022/05/11 13:53:47 by narnaud@stude ### ########.fr */ +/* Updated: 2022/05/16 08:17:31 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,8 @@ t_command *parser(t_datas *datas, t_token *tok, t_command *prev) tok = parse_cmd(datas, tok, cmd); if (tok) { - cmd->ope = tok->type; + if (tok->next) + cmd->ope = tok->type; cmd->next = parser(datas, tok->next, cmd); free(tok->value); free(tok); @@ -63,7 +64,8 @@ static t_token *parse_cmd(t_datas *datas, t_token *tok, t_command *cmd) if (tok->value[0] == '(') { cmd->argv[cmd->argc++] = ft_strdup("./minishell"); - cmd->argv[cmd->argc++] = ft_substr(tok->value, 1, ft_strlen(tok->value) - 2); + cmd->argv[cmd->argc++] = ft_substr(tok->value, + 1, ft_strlen(tok->value) - 2); } else if (tok->type) update_redir(datas, cmd, tok); diff --git a/utils_1.c b/utils_1.c index ca73d4b..46674ce 100644 --- a/utils_1.c +++ b/utils_1.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* utils.c :+: :+: :+: */ +/* utils_1.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/03 08:57:53 by narnaud #+# #+# */ -/* Updated: 2022/05/12 08:45:47 by narnaud ### ########.fr */ +/* Updated: 2022/05/16 08:18:23 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,6 +26,7 @@ int is_empty(char *line) int handle_status(t_datas *datas, int status) { int ret; + if (WIFSIGNALED(status)) { ret = 128 + WTERMSIG(status); @@ -34,7 +35,7 @@ int handle_status(t_datas *datas, int status) } else ret = WEXITSTATUS(status); - return ret; + return (ret); } void nothing(int sig_num) diff --git a/utils_2.c b/utils_2.c index 364d054..c5a65f7 100755 --- a/utils_2.c +++ b/utils_2.c @@ -6,7 +6,7 @@ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/06 13:15:59 by narnaud #+# #+# */ -/* Updated: 2022/05/12 14:29:56 by mea ### ########.fr */ +/* Updated: 2022/05/16 08:19:28 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,98 +24,29 @@ int file_error(char *cmd, char *file, char *msg) return (0); } -static char *get_var_value(t_datas *datas, char **line, int name_len); - -int replace_var(t_datas *datas, char **line, char *tmp, int tmp_i) +int is_valid_identifier(char *ident) { - int name_len; - int i; - char *value; + int i; - if ((*line)[1] == '?') - { - value = ft_itoa(datas->exit_code); - name_len = 2; - } - else - { - name_len = 1; - while (ft_isalpha((*line)[name_len]) \ - || ft_isdigit((*line)[name_len]) || (*line)[name_len] == '_') - name_len++; - value = get_var_value(datas, line, name_len); - } i = 0; - while (value[i]) - tmp[tmp_i++] = value[i++]; - tmp[tmp_i] = 0; - *line += name_len; - free(value); - return (tmp_i); -} - -char *expend_str(t_datas *datas, char *line) -{ - char *tmp; - int tmp_i; - - tmp = ft_calloc(STR_MAX_SIZE, sizeof(*tmp)); - if (!tmp) - free(tmp); - tmp_i = 0; - while (*line) + if (ft_isalpha(ident[0]) || ident[0] == '_') { - if (*line == '$') - tmp_i = replace_var(datas, &line, tmp, tmp_i); - else - tmp[tmp_i++] = *(line++); - } - return (tmp); -} - -static char *get_var_value(t_datas *datas, char **line, int name_len) -{ - int i; - char **env; - char *name; - char *value; - - name = ft_substr(*line, 1, name_len - 1); - i = 0; - value = NULL; - while (datas->envp[i] && !value) - { - env = ft_split(datas->envp[i], '='); - if (!ft_strncmp(name, env[0], name_len + 1)) - value = (free(env[0]), env[1]); - else if (++i) - ft_free_split(env); - } - free(name); - if (value) - free(env); - else - value = strdup(""); - return (value); -} - -int set_redir(t_lexer *lex, char **line, char ch) -{ - static t_type type_out[2] = {OUT, ADD}; - static t_type type_in[2] = {IN, HD}; - t_type *type; - - if (ch == '>') - type = type_out; - else - type = type_in; - if (**line == ch && (*line)++) - { - if (**line == ch && (*line)++) - lex->next_type = type[1]; - else - lex->next_type = type[0]; + while (ident[i]) + { + if (!ft_isalpha(ident[i]) && !ft_isdigit(ident[i] + && ident[i] != '_')) + { + ft_putstr_fd("export: not an identifier: ", 2); + ft_putstr_fd(ident, 2); + ft_putchar_fd('\n', 2); + return (0); + } + i++; + } return (1); } + ft_putstr_fd("export: not an identifier: ", 2); + ft_putstr_fd(ident, 2); + ft_putchar_fd('\n', 2); return (0); } diff --git a/utils_3.c b/utils_3.c deleted file mode 100644 index a39ceeb..0000000 --- a/utils_3.c +++ /dev/null @@ -1,76 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* utils_3.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: mea +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/05/12 14:33:58 by mea #+# #+# */ -/* Updated: 2022/05/12 14:51:17 by mea ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - - - -int is_valid_identifier(char *ident) -{ - int i; - - i = 0; - if (ft_isalpha(ident[0]) || ident[0] == '_') - { - while (ident[i]) - { - if (!ft_isalpha(ident[i]) && !ft_isdigit(ident[i] - && ident[i] != '_')) - { - ft_putstr_fd("export: not an identifier: ", 2); - ft_putstr_fd(ident, 2); - ft_putchar_fd('\n', 2); - return (0); - } - i++; - } - return (1); - } - ft_putstr_fd("export: not an identifier: ", 2); - ft_putstr_fd(ident, 2); - ft_putchar_fd('\n', 2); - return (0); -} - -int create_wc(t_lexer *lex, char *tmp) -{ - int i; - int j; - int skip ; - DIR * direct; - struct dirent *file; - - direct = opendir("."); - file = (readdir(direct), readdir(direct), readdir(direct)); - while (file) - { - i = 0; - j = 0; - skip = (tmp[0] != '.' && file->d_name[0] == '.'); - while (tmp[i] && !skip) - { - if (tmp[i] == '*') - while (file->d_name[j] && file->d_name[j] != tmp[i + 1]) - j++; - if (tmp[i] != '*' && file->d_name[j] != tmp[i]) - skip = 1; - else if (++i) - ++j; - } - if (!skip) - create_token(lex, file->d_name); - file = readdir(direct); - } - closedir(direct); - lex->wc = 0; - return (1); -} \ No newline at end of file