Change help functionality
authorLukas Jiriste <ljiriste@student.42prague.com>
Fri, 17 Jan 2025 11:24:29 +0000 (12:24 +0100)
committerLukas Jiriste <ljiriste@student.42prague.com>
Fri, 17 Jan 2025 11:24:29 +0000 (12:24 +0100)
The parsing functions now recognize why they (probably?) failed.
The help is printed for certain errors.

Makefile
inc/miniRT.h
src/main.c
src/parse.c
src/parse_rt.c
src/tokenize.c
src/utils.c [deleted file]

index 5a5b4b878e0a7268171a8a7c400bbc7a373cc2a4..8363fde0a617465e28f8603fdf5fc5cfb4eaacfa 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -36,7 +36,6 @@ SOURCES :=    main.c                          \
                        plane.c                         \
                        object_color.c          \
                        vec3.c                          \
-                       utils.c                         \
 
 SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
 
index e0c0dfdafdbb66a60307e94fdab66a7033f54b22..dc7241c5bad50218eab8754ae35c010b847b2589 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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
index 852cfb3d297cc42202be72d77e1d1b7f1fde2da7..66e53126817d1394871b130a9693a4e4697b3577 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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);
index 047e92ed0fd68ecbf33f4316beb55c36d4af7a15..2dd8da67985c11503cc4f62d250690891d31bf9c 100644 (file)
@@ -1,18 +1,19 @@
 /* ************************************************************************** */
 /*                                                                            */
 /*                                                        :::      ::::::::   */
-/*   parsing.c                                          :+:      :+:    :+:   */
+/*   parse.c                                            :+:      :+:    :+:   */
 /*                                                    +:+ +:+         +:+     */
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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 <stddef.h>
+#include <unistd.h>
 
 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);
 }
index 9c85a9f4239b7e2b85ce05fdba480c618e4fc260..5d464899f7aeb47c401ded9c50cd827c8b0c0bf0 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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);
index 11d6379b261d1c8c6f1ad27427990afd25c80bcb..49f53064afcb1f76c9899e54b77e553a444efd83 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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 (file)
index 9f26ea5..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* ************************************************************************** */
-/*                                                                            */
-/*                                                        :::      ::::::::   */
-/*   parsing.c                                          :+:      :+:    :+:   */
-/*                                                    +:+ +:+         +:+     */
-/*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
-/*                                                +#+#+#+#+#+   +#+           */
-/*   Created: 2024/11/28 12:34:20 by ljiriste          #+#    #+#             */
-/*   Updated: 2025/01/13 19:54:25 by ljiriste         ###   ########.fr       */
-/*                                                                            */
-/* ************************************************************************** */
-
-#include "miniRT.h"
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-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 ;
-}