diff options
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 255 |
1 files changed, 154 insertions, 101 deletions
@@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/14 10:36:06 by charles ### ########.fr */ +/* Updated: 2020/06/15 13:12:21 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,109 +19,162 @@ #include "ast.h" #include "lexer.h" #include "parser.h" +#include "eval.h" -// int main(int argc, char **argv, char **envp) -// { -// (void)argc; -// (void)argv; -// /* (void)envp; */ -// /* t_path path; */ -// t_env env; -// /* char *line; */ -// /* int ret; */ -// env = env_from_array(envp); -// /* path = path_update(NULL, env_search(env, "PATH")); */ -// /* */ -// /* t_ast *ast; */ -// /* t_line line; */ -// /* t_cmd cmd; */ -// /* t_eval_state state; */ -// /* */ -// /* cmd.argv = ft_split("ls -l", ' '); */ -// /* cmd.in = NULL; */ -// /* cmd.out = NULL; */ -// /* cmd.is_append = false; */ -// /* */ -// /* line.left = ast_new(TAG_CMD, &cmd); */ -// /* line.right = NULL; */ -// /* line.sep = SEP_END; */ -// /* ast = ast_new(TAG_LINE, &line); */ -// /* printf("%p\n", ast); */ -// /* printf("%d\n", ast->tag); */ -// /* printf("%p\n", ast->data.line.left); */ -// /* printf("%p\n", ast->data.line.right); */ -// /* printf("%d\n", ast->data.line.left->tag); */ -// /* printf("%p\n", ast->data.line.left->data.cmd.argv); */ -// /* printf("%s\n", ast->data.line.left->data.cmd.argv[0]); */ -// /* printf("%s\n", ast->data.line.left->data.cmd.argv[1]); */ -// /* state.pipe_in[0] = -1; */ -// /* state.pipe_in[1] = -1; */ -// /* state.pipe_out[0] = -1; */ -// /* state.pipe_out[1] = -1; */ -// /* state.path = path; */ -// /* state.env = env; */ -// /* t_io_frame frame; */ -// /* io_frame_init(&frame); */ -// /* printf("ret: %d %s\n", eval(&frame,&state, ast), strerror(errno)); */ -// /* char buf[2048]; */ -// /* printf("%s\n", getcwd(buf, 2048)); */ -// /* builtin_env(NULL, state.env); */ -// /* ast_destroy(ast); */ -// /* while ((ret = ft_next_line(STDIN_FILENO, &line)) == 1) */ -// /* { */ -// /* if (eval(parse(line)) == -1) */ -// /* continue ; // and display error */ -// /* free(line); */ -// /* } */ -// /* free(line); */ -// /* ft_htdestroy(path, free); */ -// /* ms_glob("src#<{(|"); */ -// /* char *j = ms_glob("|)}>#*.c"); */ -// /* printf("%s\n", j); */ -// /* free(j); */ -// t_ftvec *v = ft_vecnew(32); -// ft_vecpush(v, token_new(TAG_STR, "$TERM$LFS$TERM$TERM.")); -// ft_vecpush(v, token_new(TAG_STR, "$$LFS$TERM$TERM.")); -// ft_vecpush(v, token_new(TAG_STR, "*/*.c$TERM")); -// ft_vecpush(v, token_new(TAG_STR, "src/*.c include/*.h")); -// ft_vecpush(v, token_new(TAG_STR, "$A$B")); -// ft_vecpush(v, token_new(TAG_STR, "\\$TERM")); -// ft_vecpush(v, token_new(TAG_STR, "$TER\\M")); -// ft_vecpush(v, token_new(TAG_STR, "\\\\")); -// ft_vecpush(v, token_new(TAG_STR_SINGLE, "''''$TEST\\TEST")); -// ft_vecpush(v, token_new(TAG_STR_DOUBLE, ",$TEST,$B,")); -// ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST")); -// ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST")); -// ft_vecpush(v, token_new(TAG_STR_DOUBLE , "$TEST")); -// ft_vecpush(v, token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST")); -// ft_vecpush(v, token_new(TAG_STR_SINGLE, "$TEST")); -// char **as = preprocess(v, env); -// char **tmp = as; -// while (*as != NULL) -// puts(*as++); -// ft_split_destroy(tmp); -// ft_vecdestroy(env, free); -// return (0); -// } +int main(int argc, char **argv, char **envp) +{ + t_path path; + t_env env; -///////////////////////////////////////////////////////////////////////////////////////// -// lexer main -///////////////////////////////////////////////////////////////////////////////////////// + env = env_from_array(envp); + path = path_update(NULL, env_search(env, "PATH")); -int main(int argc, char **argv) -{ - char *input; - t_ftlst *lst; + if (argc == 3 && ft_strcmp(argv[1], "-c") == 0) + { + t_ftlst *lex_out = lexer(argv[2]); + + t_ret *parser_out = parse(lex_out); - if (argv[1] == NULL) - return (0); - if (!(input = malloc(sizeof(char) * ft_strlen(argv[1]) + 1))) - return(0); - ft_strlcpy(input, argv[1], ft_strlen(argv[1]) + 1); + int eval_out = eval_cmd(env, path, parser_out->ast); + (void)eval_out; + } - lst = lexer(input); - parse(lst); - free(input); - exit(0); - return (0); + ft_htdestroy(path, free); + ft_vecdestroy(env, free); + return (0); } + +/* int main(int argc, char **argv, char **envp) */ +/* { */ +/* (void)argc; */ +/* (void)argv; */ +/* #<{(| (void)envp; |)}># */ +/* t_path path; */ +/* t_env env; */ +/* #<{(| char *line; |)}># */ +/* #<{(| int ret; |)}># */ +/* env = env_from_array(envp); */ +/* path = path_update(NULL, env_search(env, "PATH")); */ +/* #<{(| |)}># */ +/* #<{(| t_ast *ast; |)}># */ +/* #<{(| t_line line; |)}># */ +/* #<{(| t_cmd cmd; |)}># */ +/* #<{(| t_eval_state state; |)}># */ +/* #<{(| |)}># */ +/* #<{(| cmd.argv = ft_split("ls -l", ' '); |)}># */ +/* #<{(| cmd.in = NULL; |)}># */ +/* #<{(| cmd.out = NULL; |)}># */ +/* #<{(| cmd.is_append = false; |)}># */ +/* #<{(| |)}># */ +/* #<{(| line.left = ast_new(TAG_CMD, &cmd); |)}># */ +/* #<{(| line.right = NULL; |)}># */ +/* #<{(| line.sep = SEP_END; |)}># */ +/* #<{(| ast = ast_new(TAG_LINE, &line); |)}># */ +/* #<{(| printf("%p\n", ast); |)}># */ +/* #<{(| printf("%d\n", ast->tag); |)}># */ +/* #<{(| printf("%p\n", ast->data.line.left); |)}># */ +/* #<{(| printf("%p\n", ast->data.line.right); |)}># */ +/* #<{(| printf("%d\n", ast->data.line.left->tag); |)}># */ +/* #<{(| printf("%p\n", ast->data.line.left->data.cmd.argv); |)}># */ +/* #<{(| printf("%s\n", ast->data.line.left->data.cmd.argv[0]); |)}># */ +/* #<{(| printf("%s\n", ast->data.line.left->data.cmd.argv[1]); |)}># */ +/* #<{(| state.pipe_in[0] = -1; |)}># */ +/* #<{(| state.pipe_in[1] = -1; |)}># */ +/* #<{(| state.pipe_out[0] = -1; |)}># */ +/* #<{(| state.pipe_out[1] = -1; |)}># */ +/* #<{(| state.path = path; |)}># */ +/* #<{(| state.env = env; |)}># */ +/* #<{(| t_io_frame frame; |)}># */ +/* #<{(| io_frame_init(&frame); |)}># */ +/* #<{(| printf("ret: %d %s\n", eval(&frame,&state, ast), strerror(errno)); |)}># */ +/* #<{(| char buf[2048]; |)}># */ +/* #<{(| printf("%s\n", getcwd(buf, 2048)); |)}># */ +/* #<{(| builtin_env(NULL, state.env); |)}># */ +/* #<{(| ast_destroy(ast); |)}># */ +/* #<{(| while ((ret = ft_next_line(STDIN_FILENO, &line)) == 1) |)}># */ +/* #<{(| { |)}># */ +/* #<{(| if (eval(parse(line)) == -1) |)}># */ +/* #<{(| continue ; // and display error |)}># */ +/* #<{(| free(line); |)}># */ +/* #<{(| } |)}># */ +/* #<{(| free(line); |)}># */ +/* #<{(| ms_glob("src#<{(|"); |)}># */ +/* #<{(| char *j = ms_glob("|)}>#*.c"); |)}># */ +/* #<{(| printf("%s\n", j); |)}># */ +/* #<{(| free(j); |)}># */ +/* */ +/* t_ftlst *args = NULL; */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "echo"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "bonjour"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "je"))); |)}># */ +/* */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "cat"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-e"))); */ +/* */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "|)}>#*.c"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src#<{(|.c include#<{(|.h"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); |)}># */ +/* #<{(| ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); |)}># */ +/* */ +/* t_ftlst *redirs = NULL; */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); */ +/* */ +/* t_ast *ast = ast_new(AST_CMD); */ +/* ast->cmd_argv = args; */ +/* ast->redirs = redirs; */ +/* */ +/* printf("eval %d\n", eval_cmd(env, path, ast)); */ +/* ast_destroy(ast); */ +/* */ +/* */ +/* #<{(| char **as = preprocess(l, env); |)}># */ +/* #<{(| printf("%p\n", as); |)}># */ +/* #<{(| printf("%p\n", *as); |)}># */ +/* #<{(| char **tmp = as; |)}># */ +/* #<{(| while (*as != NULL) |)}># */ +/* #<{(| puts(*as++); |)}># */ +/* #<{(| ft_split_destroy(tmp); |)}># */ +/* ft_htdestroy(path, free); */ +/* ft_vecdestroy(env, free); */ +/* return (0); */ +/* } */ + +///////////////////////////////////////////////////////////////////////////////////////// +// lexer main +///////////////////////////////////////////////////////////////////////////////////////// + +/* int main(int argc, char **argv) */ +/* { */ +/* char *input; */ +/* t_ftlst *lst; */ +/* */ +/* if (argv[1] == NULL) */ +/* return (0); */ +/* if (!(input = malloc(sizeof(char) * ft_strlen(argv[1]) + 1))) */ +/* return(0); */ +/* ft_strlcpy(input, argv[1], ft_strlen(argv[1]) + 1); */ +/* */ +/* lst = lexer(input); */ +/* parse(lst); */ +/* free(input); */ +/* exit(0); */ +/* return (0); */ +/* } */ |
