From 6e456095fce214a2eadea0cafa3fa7ea1113b4e6 Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 19 Jul 2020 19:27:52 +0200 Subject: Added errof for cleaner error message, Removed previous error functions --- include/minishell.h | 37 +++++++++----------------- src/builtin/cd.c | 14 +++------- src/builtin/exit.c | 10 +++---- src/builtin/export.c | 5 ++-- src/builtin/unset.c | 4 +-- src/error.c | 73 +++++++++++++++++++--------------------------------- src/eval/cmd.c | 16 +++--------- src/eval/redir.c | 4 +-- src/parse/parse.c | 41 ++++++++++------------------- src/preprocess.c | 4 +-- 10 files changed, 71 insertions(+), 137 deletions(-) diff --git a/include/minishell.h b/include/minishell.h index 3406041..fe05b7e 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/26 15:33:51 by cacharle #+# #+# */ -/* Updated: 2020/07/17 11:17:16 by charles ### ########.fr */ +/* Updated: 2020/07/19 19:24:06 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,7 @@ # include # include # include +# include # include "libft.h" # include "libft_ht.h" @@ -113,31 +114,17 @@ char *preprocess_filename(t_ftlst **tokens, t_env env); ** error.c */ -enum e_error +typedef enum { - ERROR_AMBIGUOUS_REDIR, - ERROR_OPEN, - ERROR_CMD_NOT_FOUND, - ERROR_SYNTAX, - ERROR_CMD_FOUND_ERROR, -}; - -/* -** \brief Error specification -** \param id Error type -** \param status Status code returned -** \param msg Error message to print, if is NULL, use strerror as a msg -*/ - -typedef struct -{ - enum e_error id; - int status; - char *msg; -} t_error; - -void error_eval_put(enum e_error id, char *content); -void error_put_invalid_identifier(char *prefix, char *identifier); + ERR_FATAL = -1, + ERR_NONE = 0, + ERR_AMBIGUOUS_REDIR = 1, + ERR_OPEN = 1, + ERR_CMD_NOT_FOUND = 127, + ERR_SYNTAX = 2, +} t_err; + +void errorf(const char *format, ...); /* ** signal.c diff --git a/src/builtin/cd.c b/src/builtin/cd.c index 2377ce7..d7115e5 100644 --- a/src/builtin/cd.c +++ b/src/builtin/cd.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:10:20 by charles #+# #+# */ -/* Updated: 2020/07/19 15:55:08 by charles ### ########.fr */ +/* Updated: 2020/07/19 19:05:25 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,8 +25,7 @@ int builtin_cd(char **argv, t_env env) (void)env; if (argv[1] != NULL && argv[2] != NULL) { - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putendl_fd(": cd: too many arguments", STDERR_FILENO); + errorf("cd: too many arguments\n"); return (1); } if (argv[1] != NULL && argv[1][0] == '\0') @@ -35,8 +34,7 @@ int builtin_cd(char **argv, t_env env) { if ((home = env_search(env, "HOME")) == NULL) { - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putendl_fd(": cd: HOME not set", STDERR_FILENO); + errorf("cd: HOME not set\n"); return (1); } argv[1] = home; @@ -44,11 +42,7 @@ int builtin_cd(char **argv, t_env env) errno = 0; if (chdir(argv[1]) == -1) { - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putstr_fd(": cd: ", STDERR_FILENO); - ft_putstr_fd(argv[1], STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putendl_fd(strerror(errno), STDERR_FILENO); + errorf("cd: %s: %s\n", argv[1], strerror(errno)); return (1); } if (!(getcwd(buf, PATH_MAX))) diff --git a/src/builtin/exit.c b/src/builtin/exit.c index 860325e..3f1d843 100644 --- a/src/builtin/exit.c +++ b/src/builtin/exit.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:10:16 by charles #+# #+# */ -/* Updated: 2020/07/17 16:36:03 by charles ### ########.fr */ +/* Updated: 2020/07/19 19:12:46 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,16 +33,12 @@ int builtin_exit(char **argv, t_env env) after++; if (*after != '\0' || errno == ERANGE) { - // replace with minishell error system - ft_putstr_fd("minishell: exit: ", STDERR_FILENO); - ft_putstr_fd(argv[1], STDERR_FILENO); - ft_putstr_fd(": numeric argument required\n", STDERR_FILENO); + errorf("exit: %s: numeric argument required\n", argv[1]); return 2; } if (argv[2] != NULL) { - // replace with minishell error system - ft_putendl_fd("minishell: exit: too many arguments", STDERR_FILENO); + errorf("exit: too many arguments\n"); return 1; } } diff --git a/src/builtin/export.c b/src/builtin/export.c index 809b809..6fbb88f 100644 --- a/src/builtin/export.c +++ b/src/builtin/export.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:11:34 by charles #+# #+# */ -/* Updated: 2020/07/15 13:22:18 by charles ### ########.fr */ +/* Updated: 2020/07/19 18:46:48 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ static void st_put_declare_x(char *s) { char *equal_ptr; + // could use errorf on stdout if (s == NULL) return ; ft_putstr("declare -x "); @@ -57,7 +58,7 @@ int builtin_export(char **argv, t_env env) { if (!skip) *equal_ptr = '='; - error_put_invalid_identifier("export", argv[i]); + errorf("export: `%s': not a valid identifier\n", argv[i]); status = 1; continue; } diff --git a/src/builtin/unset.c b/src/builtin/unset.c index b7b6d58..367f063 100644 --- a/src/builtin/unset.c +++ b/src/builtin/unset.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:10:51 by charles #+# #+# */ -/* Updated: 2020/07/15 13:14:38 by charles ### ########.fr */ +/* Updated: 2020/07/19 18:47:36 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ int builtin_unset(char **argv, t_env env) { if (!utils_valid_identifier(argv[i])) { - error_put_invalid_identifier("unset", argv[i]); + errorf("unset: `%s': not a valid identifier\n", argv[i]); status = 1; continue; // put invalid identifier } diff --git a/src/error.c b/src/error.c index fe5b4b1..0d2095e 100644 --- a/src/error.c +++ b/src/error.c @@ -6,61 +6,40 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 11:02:52 by charles #+# #+# */ -/* Updated: 2020/07/19 15:34:20 by charles ### ########.fr */ +/* Updated: 2020/07/19 19:20:38 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "eval.h" -static t_error g_errors[] = -{ - {ERROR_AMBIGUOUS_REDIR, 1, "ambiguous redirect"}, - {ERROR_OPEN, 1, NULL}, - {ERROR_CMD_NOT_FOUND, 127, "command not found"}, -}; - -t_error *st_error_get(enum e_error id) -{ - size_t i; - t_error *match; - - match = NULL; - i = 0; - while (i < sizeof(g_errors) / sizeof(t_error)) - { - if (g_errors[i].id == id) - match = &g_errors[i]; - i++; - } - return (match); -} - -void error_eval_put(enum e_error id, char *unexpected) -{ - t_error *err; +/* +** \brief printf like function that only works with `%s`, +** prefix the message with the program name +** and output on STDERR +** \note NULL arguments are ignored +*/ - err = st_error_get(id); - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putstr_fd(unexpected, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - if (err->msg == NULL) - ft_putendl_fd(strerror(errno), STDERR_FILENO); - else - ft_putendl_fd(err->msg, STDERR_FILENO); -} - -int error_status(enum e_error id) +void errorf(const char *format, ...) { - return (st_error_get(id)->status); -} + va_list ap; + char *arg; -void error_put_invalid_identifier(char *prefix, char *identifier) -{ + va_start(ap, format); ft_putstr_fd(g_basename, STDERR_FILENO); ft_putstr_fd(": ", STDERR_FILENO); - ft_putstr_fd(prefix, STDERR_FILENO); - ft_putstr_fd(": `", STDERR_FILENO); - ft_putstr_fd(identifier, STDERR_FILENO); - ft_putstr_fd("': not a valid identifier\n", STDERR_FILENO); + while (*format != '\0') + { + if (format[0] == '%' && format[1] == 's') + { + arg = va_arg(ap, char*); + ft_putstr_fd(arg, STDERR_FILENO); + format += 2; + } + else + { + ft_putchar_fd(*format, STDERR_FILENO); + format++; + } + } + va_end(ap); } diff --git a/src/eval/cmd.c b/src/eval/cmd.c index a7a6f71..87c9bbf 100644 --- a/src/eval/cmd.c +++ b/src/eval/cmd.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 10:41:31 by charles #+# #+# */ -/* Updated: 2020/07/19 16:53:54 by charles ### ########.fr */ +/* Updated: 2020/07/19 19:00:54 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,19 +74,12 @@ int forked_cmd(void *void_param) struct stat statbuf; if (stat(param->exec_path, &statbuf) != -1 && S_ISDIR(statbuf.st_mode)) { - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putstr_fd(param->exec_path, STDERR_FILENO); - ft_putendl_fd(": Is a directory", STDERR_FILENO); + errorf("%s: Is a directory\n", param->exec_path); ret = 126; } else { - ft_putstr_fd(g_basename, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putstr_fd(param->exec_path, STDERR_FILENO); - ft_putstr_fd(": ", STDERR_FILENO); - ft_putendl_fd(strerror(errno), STDERR_FILENO); + errorf("%s: %s\n", param->exec_path, strerror(errno)); ret = 126; } } @@ -121,7 +114,6 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast) ft_vecpop(param.env_local, NULL); if (ft_vecswallow_at(env, env->size - 1, param.env_local) == NULL) { - /* printf("hyo\n"); */ ft_vecdestroy(param.env_local, free); return (-1); } @@ -146,7 +138,7 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast) if (param.exec_path == NULL) { g_last_status_code = 127; - error_eval_put(ERROR_CMD_NOT_FOUND, argv[0]); + errorf("%s: command not found\n", argv[0]); ft_split_destroy(argv); return (-1); // return error status } diff --git a/src/eval/redir.c b/src/eval/redir.c index 7249ad5..49cfa1d 100644 --- a/src/eval/redir.c +++ b/src/eval/redir.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/15 11:05:34 by charles #+# #+# */ -/* Updated: 2020/06/17 16:17:43 by charles ### ########.fr */ +/* Updated: 2020/07/19 18:57:03 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ static bool st_open_replace(int *fd, char *filename, int oflag) *fd = open(filename, oflag); if (*fd == -1) { - error_eval_put(ERROR_OPEN, filename); + errorf("%s: %s\n", filename, strerror(errno)); free(filename); return (false); } diff --git a/src/parse/parse.c b/src/parse/parse.c index 6922530..89102bc 100644 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -6,7 +6,7 @@ /* By: nahaddac +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 18:09:04 by nahaddac #+# #+# */ -/* Updated: 2020/07/17 16:12:53 by nahaddac ### ########.fr */ +/* Updated: 2020/07/19 19:25:29 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,6 @@ t_ret *parse_redir(t_ftlst *input, t_ftlst **redirs) { enum e_token_tag tag; t_ret *tmp; - char *error; push_token(redirs, input->data); input = input->next; @@ -60,9 +59,7 @@ t_ret *parse_redir(t_ftlst *input, t_ftlst **redirs) } if (!(tag & TAG_IS_STR)) { - error = ft_strjoin3(g_basename,": syntax error unexpected token `", ((t_token *)input->data)->content); - error = ft_strjoin(error, "\'\n"); - ft_putstr_fd(error, 2); + errorf("syntax error near unexpected token `%s'\n", ((t_token *)input->data)->content); tmp = ret_wrap_ast(NULL, NULL); tmp->syntax_error = true; return tmp; @@ -75,15 +72,12 @@ t_ret *parse_cmd(t_ftlst *input) { enum e_token_tag tag; t_ast *ast; - char *error; t_ret *tmp; tag = ((t_token *)input->data)->tag; if (tag & TAG_IS_SEP) { - error = ft_strjoin3(g_basename,": syntax error unexpected token `", ((t_token *)input->data)->content); - error = ft_strjoin(error, "\'\n"); - ft_putstr_fd(error, 2); + errorf("syntax error near unexpected token `%s'\n", ((t_token *)input->data)->content); tmp = ret_wrap_ast(NULL, NULL); tmp->syntax_error = true; return tmp; @@ -121,7 +115,6 @@ t_ret *parse_op(t_ftlst *input) t_ret *right_ret; enum e_token_tag tag; t_ret *tmp; - char *error; left_ret = parse_expr(input); if (left_ret == NULL || left_ret->syntax_error) @@ -133,19 +126,15 @@ t_ret *parse_op(t_ftlst *input) tag = ((t_token*)input->data)->tag; if (!(tag & TAG_IS_SEP)) { - error = ft_strjoin3(g_basename,": syntax error near unexpected token `", ((t_token *)input->data)->content); - error = ft_strjoin(error, "\'\n"); - ft_putstr_fd(error, 2); + errorf("syntax error near unexpected token `%s'\n", ((t_token *)input->data)->content); tmp = ret_wrap_ast(NULL, NULL); tmp->syntax_error = true; return tmp; } input = input->next; - if(input == NULL) + if (input == NULL) { - error = ft_strjoin(g_basename,": syntax error expected token "); - error = ft_strjoin(error, "\n"); - ft_putstr_fd(error, 2); + errorf("syntax error expected token\n"); tmp = ret_wrap_ast(NULL, NULL); tmp->syntax_error = true; return tmp; @@ -165,7 +154,6 @@ t_ret *parse_expr(t_ftlst *input) t_ret *tmp; enum e_token_tag tag; t_ast *new_ast; - char *error; tag = ((t_token*)input->data)->tag; if (tag & TAG_PARENT_OPEN) @@ -175,24 +163,21 @@ t_ret *parse_expr(t_ftlst *input) input = tmp->rest; if (input == NULL) { - error = ft_strjoin(g_basename,": syntax error expected token"); - ft_putstr_fd(error, 2); + errorf("syntax error expected token\n"); tmp->syntax_error = true; return (tmp); } tag = ((t_token*)input->data)->tag; - if (!(tag & TAG_PARENT_CLOSE) ) + if (!(tag & TAG_PARENT_CLOSE)) { - error = ft_strjoin(g_basename,": syntax error expected token `)''"); - ft_putstr_fd(error, 2); - tmp->syntax_error = TRUE; + errorf("syntax error expected token `)'\n"); + tmp->syntax_error = true; return (tmp); } // if (tag & TAG_IS_SEP) // { - // error = ft_strjoin(g_basename,": syntax error expected token `)''"); - // ft_putstr_fd(error, 2); - // tmp->syntax_error = TRUE; + // errorf("syntax error expected token `)'\n"); + // tmp->syntax_error = true; // return (tmp); // } input = input->next; @@ -239,7 +224,7 @@ t_ret *parse(t_ftlst *input) ret->rest = NULL; ret->syntax_error = false; // ret = error_syntax_simple(input, ret); - // if (ret->syntax_error == TRUE) + // if (ret->syntax_error == true) // return ret; ret = parse_op(input); return (ret); diff --git a/src/preprocess.c b/src/preprocess.c index f7e4538..2a884df 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/07/19 17:00:16 by charles ### ########.fr */ +/* Updated: 2020/07/19 19:01:53 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -189,7 +189,7 @@ char *preprocess_filename(t_ftlst **tokens, t_env env) if (strs[1] != NULL) { /* save tokens */ - error_eval_put(ERROR_AMBIGUOUS_REDIR, strs[1]); + errorf("%s: ambiguous redidrect\n", strs[1]); ft_split_destroy(strs); return (NULL); } -- cgit