112 lines
3.0 KiB
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);
|
|
}
|