-
Notifications
You must be signed in to change notification settings - Fork 1
/
parser.c
97 lines (88 loc) · 3.06 KB
/
parser.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parser.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: maolivei <maolivei@student.42sp.org.br> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/01 20:51:52 by maolivei #+# #+# */
/* Updated: 2022/11/04 20:01:29 by maolivei ### ########.fr */
/* */
/* ************************************************************************** */
#include <minirt.h>
#define ERR_OPEN_FAIL "Could not open .rt file"
#define ERR_BAD_ID "Invalid identifier in .rt file."
static t_delegator *get_parse_function(t_parse_id id)
{
static t_delegator *function_table[PARSE_ID_MAX + 1];
if (function_table[PARSE_ID_MIN])
return (function_table[id]);
function_table[PARSE_AMBIENT] = parse_ambient;
function_table[PARSE_CAMERA] = parse_camera;
function_table[PARSE_LIGHT] = parse_light;
function_table[PARSE_SPHERE] = parse_sphere;
function_table[PARSE_PLANE] = parse_plane;
function_table[PARSE_CYLINDER] = parse_cylinder;
function_table[PARSE_CONE] = parse_cone;
return (function_table[id]);
}
static t_parse_id get_token_id(char *token)
{
if (ft_strcmp(AMBIENT, token) == 0)
return (PARSE_AMBIENT);
if (ft_strcmp(CAMERA, token) == 0)
return (PARSE_CAMERA);
if (ft_strcmp(LIGHT, token) == 0)
return (PARSE_LIGHT);
if (ft_strcmp(SPHERE, token) == 0)
return (PARSE_SPHERE);
if (ft_strcmp(PLANE, token) == 0)
return (PARSE_PLANE);
if (ft_strcmp(CYLINDER, token) == 0)
return (PARSE_CYLINDER);
if (ft_strcmp(CONE, token) == 0)
return (PARSE_CONE);
return (NONE);
}
static int parse_rt_file(char *line, t_rt_scene *s)
{
int status;
char **tokens;
t_delegator *parse_function;
ft_swap_set(line, BLANKSPACES, ' ');
tokens = ft_split(line, ' ');
if (!tokens)
return (0);
parse_function = get_parse_function(get_token_id(tokens[0]));
if (!parse_function)
return (ft_free_matrix((void *)&tokens), error(ERR_BAD_ID));
status = parse_function(tokens, s);
ft_free_matrix((void *)&tokens);
return (status);
}
int read_rt_file(char *filename, t_rt_scene *s)
{
int file_descriptor;
char *current_line;
if (check_file_extension(filename) != 0)
return (-1);
file_descriptor = open(filename, O_RDONLY);
if (file_descriptor < 0)
return (perror(ERR_OPEN_FAIL), -1);
while (TRUE)
{
current_line = ft_gnl(file_descriptor, FALSE);
if (!current_line)
break ;
if (!*current_line || *current_line == '#')
{
free(current_line);
continue ;
}
if (parse_rt_file(current_line, s) != 0)
return (free(current_line), close(file_descriptor), -1);
free(current_line);
}
close(file_descriptor);
return (check_scene_elements(s));
}