/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parse.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); }