rtv1/src/parse.c

112 lines
3.0 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parse.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gbrochar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/02/06 11:39:56 by gbrochar #+# #+# */
/* Updated: 2019/02/22 10:05:31 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
#include "rtv1.h"
void free_parsing(t_env *e)
{
t_obj_list *obj_browser;
t_spot_list *spot_browser;
void *tmp;
get_next_line(0, NULL, 1);
obj_browser = e->objs;
spot_browser = e->spots;
while (obj_browser)
{
tmp = (void *)obj_browser->next;
ft_memdel(&obj_browser->obj);
ft_memdel((void **)&obj_browser);
obj_browser = (t_obj_list *)tmp;
}
while (spot_browser)
{
tmp = (void *)spot_browser->next;
ft_memdel((void **)&spot_browser);
spot_browser = (t_spot_list *)tmp;
}
}
int lex(char *str)
{
if (ft_strstr(str, "//"))
return (COMMENTARY);
else if (ft_strstr(str, "CAM"))
return (CAMERA);
else if (ft_strstr(str, "SPOT") || ft_strstr(str, "LIGHT"))
return (SPOT);
else if (ft_strstr(str, "PLANE"))
return (PLANE);
else if (ft_strstr(str, "SPHERE"))
return (SPHERE);
else if (ft_strstr(str, "CYLINDER"))
return (CYLINDER);
else if (ft_strstr(str, "CONE"))
return (CONE);
else if (ft_strstr(str, "SPECULAR"))
return (SPECULAR);
else if (ft_strstr(str, "AMBIENT"))
return (AMBIENT);
return (FAILURE);
}
int parse_line(char *line, t_env *e)
{
char **split;
t_add_elem add_elem[8];
int ret;
int i;
add_elem[CAMERA] = &set_camera;
add_elem[SPOT] = &add_spot;
add_elem[PLANE] = &add_plane;
add_elem[SPHERE] = &add_sphere;
add_elem[CYLINDER] = &add_cylinder;
add_elem[CONE] = &add_cone;
add_elem[SPECULAR] = &set_specular;
add_elem[AMBIENT] = &set_ambient;
split = ft_strsplit(line, ' ');
ret = FAILURE;
i = -1;
if (split[0])
if (FAILURE != (ret = lex(split[0])) && COMMENTARY != ret)
ret = add_elem[ret](split, e);
while (split[++i])
ft_memdel((void **)&split[i]);
ft_memdel((void **)&split);
return (ret);
}
int parse(char *path, t_env *e)
{
int fd;
int ret;
char *line;
line = NULL;
e->ambient = DEFAULT_AMBIENT;
e->spec_radius = DEFAULT_SPEC_RADIUS;
e->spec_ratio = DEFAULT_SPEC_RATIO;
e->objs = NULL;
e->spots = NULL;
init_camera(&e->camera);
fd = open(path, O_RDONLY);
while (0 < (ret = get_next_line(fd, &line, 0)))
{
ret = parse_line(line, e);
ft_memdel((void **)&line);
if (FAILURE == ret)
return (FAILURE);
}
return (ret);
}