The parsing functions now recognize why they (probably?) failed.
The help is printed for certain errors.
plane.c \
object_color.c \
vec3.c \
- utils.c \
SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
/* 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 */
/* */
/* ************************************************************************** */
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(
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
/* 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 */
/* */
/* ************************************************************************** */
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);
/* ************************************************************************** */
/* */
/* ::: :::::::: */
-/* 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)
{
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);
}
/* 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 */
/* */
/* ************************************************************************** */
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);
/* 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 */
/* */
/* ************************************************************************** */
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)
{
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);
}
+++ /dev/null
-/* ************************************************************************** */
-/* */
-/* ::: :::::::: */
-/* 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 ;
-}