From 4ecbddaffa8812787e6b7f95066f515059e9bb12 Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Fri, 17 Jan 2025 12:24:29 +0100 Subject: [PATCH] Change help functionality The parsing functions now recognize why they (probably?) failed. The help is printed for certain errors. --- Makefile | 1 - inc/miniRT.h | 16 +++++++--- src/main.c | 5 +--- src/parse.c | 58 +++++++++++++++++++++++++----------- src/parse_rt.c | 26 ++++++++++------- src/tokenize.c | 10 +++---- src/utils.c | 79 -------------------------------------------------- 7 files changed, 74 insertions(+), 121 deletions(-) delete mode 100644 src/utils.c diff --git a/Makefile b/Makefile index 5a5b4b8..8363fde 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,6 @@ SOURCES := main.c \ plane.c \ object_color.c \ vec3.c \ - utils.c \ SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES)) diff --git a/inc/miniRT.h b/inc/miniRT.h index e0c0dfd..dc7241c 100644 --- a/inc/miniRT.h +++ b/inc/miniRT.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/13 19:51:09 by ljiriste #+# #+# */ -/* Updated: 2025/01/14 16:44:53 by ljiriste ### ########.fr */ +/* Updated: 2025/01/17 12:23:18 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -156,14 +156,23 @@ typedef struct s_obstruction double distance; } t_obstruction; +typedef enum e_status +{ + SUCCESS, + ARGUMENT_ERROR, + FILE_ERROR, + PARSING_ERROR, + ALLOCATION_FAILURE, +} t_res; + void free_token(void *token); -int tokenize(const char *filename, t_vec *tokens); +t_res tokenize(const char *filename, t_vec *tokens); double node_to_double(const t_parse_tree_node *double_node); t_color node_to_linear_rgb(const t_parse_tree_node *rgb_node); t_vec3 node_to_vec3(const t_parse_tree_node *vec3_node); -int parse_rt_file(const char *filename, t_scene *scene); +t_res parse_rt_file(const char *filename, t_scene *scene); int parse_args(int argc, char **argv, t_session *s); int add_light(const t_parse_tree_node *light_node, t_vec *lights); int add_camera( @@ -208,6 +217,5 @@ void translate( t_element *element, t_vec3 direction, double distance); void change_radius(t_element *element, double change); void change_height(t_element *element, double change); -void print_help(int argc, char **argv); #endif // MINIRT_H diff --git a/src/main.c b/src/main.c index 852cfb3..66e5312 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/13 17:16:00 by ljiriste #+# #+# */ -/* Updated: 2025/01/13 19:43:24 by ljiriste ### ########.fr */ +/* Updated: 2025/01/17 11:57:23 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -316,10 +316,7 @@ int main(int argc, char **argv) set_defaults(&s); if (parse_args(argc, argv, &s)) - { - print_help(argc, argv); return (1); - } init_session(&s); mlx_hook(s.win, KeyPress, KeyPressMask, handle_key_press, &s); mlx_hook(s.win, ButtonPress, ButtonPressMask, handle_mouse_press, &s); diff --git a/src/parse.c b/src/parse.c index 047e92e..2dd8da6 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1,18 +1,19 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* parsing.c :+: :+: :+: */ +/* parse.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/28 12:34:20 by ljiriste #+# #+# */ -/* Updated: 2025/01/14 15:10:27 by ljiriste ### ########.fr */ +/* Updated: 2025/01/17 12:23:11 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ #include "miniRT.h" #include "libft.h" #include +#include static int parse_arg(char **argv, t_session *s, int *i) { @@ -22,36 +23,59 @@ static int parse_arg(char **argv, t_session *s, int *i) else if (!ft_strcmp(argv[*i], "-h") && ft_isint(argv[*i + 1]) && ft_atoi(argv[*i + 1]) > 0) s->img.height = ft_atoi(argv[++*i]); - else if (!ft_strcmp(argv[*i], "-f")) - { - if (parse_rt_file(argv[++*i], &s->scene)) - return (2); - } else return (1); return (0); } -int parse_args(int argc, char **argv, t_session *s) +static t_res parse_args_inner(int argc, char **argv, t_session *s) { int i; - int got_file; s->scene.current_element = NULL; s->scene.relative_directions = 1; s->scene.current_light_ind = 0; s->scene.current_camera_ind = 0; - got_file = 0; - if (argc % 2 == 0) - return (1); - i = 1; + if (argc % 2 == 1) + return (ARGUMENT_ERROR); + i = 2; while (i + 1 < argc) { - if (!ft_strcmp(argv[i], "-f")) - got_file = 1; if (parse_arg(argv, s, &i)) - return (1); + return (ARGUMENT_ERROR); ++i; } - return (!got_file); + return (parse_rt_file(argv[1], &s->scene)); +} + +static void print_help(void) +{ + ft_dprintf(STDERR_FILENO, "Usage: miniRT file [options]\n"); + ft_dprintf(STDERR_FILENO, "Options:\n"); + ft_dprintf(STDERR_FILENO, "\t-w int - set the width of the window\n"); + ft_dprintf(STDERR_FILENO, "\t-h int - set the height of the window\n"); +} + +int parse_args(int argc, char **argv, t_session *s) +{ + int parsing_res; + + parsing_res = parse_args_inner(argc, argv, s); + if (parsing_res == ARGUMENT_ERROR) + { + ft_dprintf(STDERR_FILENO, "Error: Wrong argument.\n"); + print_help(); + } + else if (parsing_res == FILE_ERROR) + { + ft_dprintf(STDERR_FILENO, "Error: Could not find file %s.\n", argv[1]); + print_help(); + } + else if (parsing_res == PARSING_ERROR) + ft_dprintf(STDERR_FILENO, + "Error: The file could not be parsed properly.\n"); + else if (parsing_res == ALLOCATION_FAILURE) + ft_dprintf(STDERR_FILENO, + "Error: System error, probably allocation failure.\n"); + return (parsing_res != SUCCESS); } diff --git a/src/parse_rt.c b/src/parse_rt.c index 9c85a9f..5d46489 100644 --- a/src/parse_rt.c +++ b/src/parse_rt.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/14 15:09:41 by ljiriste #+# #+# */ -/* Updated: 2025/01/14 15:12:52 by ljiriste ### ########.fr */ +/* Updated: 2025/01/17 12:04:15 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -65,39 +65,43 @@ static int add_element_to_scene( return (0); } -static int parse_tree_to_scene(const t_parse_tree_node *tree, t_scene *scene) +static t_res parse_tree_to_scene(const t_parse_tree_node *tree, t_scene *scene) { + if (!tree) + return (PARSING_ERROR); if (tree->children.size == 2) { if (parse_tree_to_scene(ft_cget_node_child(tree, 0), scene)) - return (1); + return (ALLOCATION_FAILURE); if (add_element_to_scene(ft_cget_node_child(tree, 1), scene)) - return (1); + return (ALLOCATION_FAILURE); } - return (0); + return (SUCCESS); } -int parse_rt_file(const char *filename, t_scene *scene) +t_res parse_rt_file(const char *filename, t_scene *scene) { int res; t_vec tokens; t_parsing_table parsing_table; t_parse_tree_node *parse_tree; - res = 1; ft_vec_init(&tokens, sizeof(t_token)); - if (!tokenize(filename, &tokens)) + res = tokenize(filename, &tokens); + if (res == SUCCESS) { if (ft_parsing_table_init(&parsing_table) == success && ft_parsing_table_load_str (&parsing_table, g_parsing_table, g_grammar) == success) { parse_tree = ft_parse(&tokens, &parsing_table); - if (parse_tree && !parse_tree_to_scene(parse_tree, scene) - && scene->cameras.size > 0) - res = 0; + res = parse_tree_to_scene(parse_tree, scene); + if (!res && scene->cameras.size > 0) + res = SUCCESS; ft_parse_tree_free(parse_tree); } + else + res = ALLOCATION_FAILURE; ft_parsing_table_free(&parsing_table); } ft_vec_free(&tokens, free_token); diff --git a/src/tokenize.c b/src/tokenize.c index 11d6379..49f5306 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/14 14:49:32 by ljiriste #+# #+# */ -/* Updated: 2025/01/14 14:51:04 by ljiriste ### ########.fr */ +/* Updated: 2025/01/17 12:05:04 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -97,14 +97,14 @@ static int tokenize_line(const char *line, t_vec *tokens) return (0); } -int tokenize(const char *filename, t_vec *tokens) +t_res tokenize(const char *filename, t_vec *tokens) { int fd; char *line; fd = open(filename, O_RDONLY); if (fd < 0) - return (1); + return (FILE_ERROR); line = get_next_line(fd); while (line) { @@ -113,11 +113,11 @@ int tokenize(const char *filename, t_vec *tokens) free(line); get_next_line(-1); close(fd); - return (1); + return (ALLOCATION_FAILURE); } free(line); line = get_next_line(fd); } close(fd); - return (0); + return (SUCCESS); } diff --git a/src/utils.c b/src/utils.c deleted file mode 100644 index 9f26ea5..0000000 --- a/src/utils.c +++ /dev/null @@ -1,79 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parsing.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: ljiriste +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/11/28 12:34:20 by ljiriste #+# #+# */ -/* Updated: 2025/01/13 19:54:25 by ljiriste ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "miniRT.h" -#include -#include -#include - -void print_msg(char *msg) -{ - printf("%s\n", msg); - printf("Usage: miniRT [options] -f [file.rt]\n"); - printf("Options:\n"); - printf("\t-w [int] (width) - set the width of the window\n"); - printf("\t-h [int] (height) - set the height of the window\n"); -} - -/* -Function that check propriete file ending (.rt) and also -checks if this file exists. -- use fopen to open file and check if error occurs during -opening --> file can be open -*/ -int check_file(char *filename) -{ - int i; - int fd; - - fd = -1; - i = 0; - while (filename[i]) - i++; - if ((ft_strlen(filename) < 4) || (filename[i - 1] != 't' - || filename[i - 2] != 'r' || filename[i - 3] != '.')) - { - printf("Wrong file ending! Please, provide .rt file\n"); - return (1); - } - else - { - fd = open(filename, 0); - } - if (fd == -1) - { - printf("Error in opening file.\n"); - return (1); - } - close(fd); - return (0); -} - -/* -checks for errors in arguments and provide error message -*/ -void print_help(int argc, char **argv) -{ - if (argc < 2 || argc % 2 == 0) - { - print_msg("Wrong number of arguments"); - return ; - } - else if (ft_strcmp(argv[argc - 2], "-f")) - { - print_msg("Provide -f flag for filename\n"); - return ; - } - else - check_file(argv[argc - 1]); - return ; -} -- 2.30.2