/* ************************************************************************** */ /* LE - / */ /* / */ /* ft_parse_map.c .:: .:/ . .:: */ /* +:+:+ +: +: +:+:+ */ /* By: rbousset +:+ +: +: +:+ */ /* #+# #+ #+ #+# */ /* Created: 2020/02/02 17:19:31 by rbousset #+# ## ## #+# */ /* Updated: 2020/02/02 17:19:31 by rbousset ### #+. /#+ ###.fr */ /* / */ /* / */ /* ************************************************************************** */ #include #include #include #include #include #include static void ft_check_cub(const char *map_path, t_cub *clist) { char **words; size_t i; if (!(words = ft_split(map_path, '.'))) { ft_dprintf(STDERR_FILENO, "Error\n"); ft_dprintf(STDERR_FILENO, "\033[31;1mMap is not a .cub\033[0m\n"); ft_free_words(words); ft_exit(6, clist); } i = 0; while (words[i]) i++; if (ft_strncmp(words[i - 1], "cub", 3)) { ft_dprintf(STDERR_FILENO, "Error\n"); ft_dprintf(STDERR_FILENO, "\033[31;1mMap is not a .cub\033[0m\n"); ft_free_words(words); ft_exit(6, clist); } ft_free_words(words); } static void ft_check_map_last_line(t_cub *clist) { t_map *ml; size_t i; size_t j; i = 0; ml = clist->mlist; while (ml->map[i]) i++; j = 0; while (ml->map[i - 1][j]) { if (ml->map[i - 1][j] != '1' && ml->map[i - 1][j] != '\0') ft_map_error(clist); j++; } } static int8_t ft_error_here(char *line, t_cub *clist) { ft_memdel((void**)&line); return (ft_map_error(clist)); } static int8_t ft_parse_it(int fd, t_cub *clist) { char *line; char **words; int ret; clist->mlist->line_chk += 1; if ((ret = get_next_line(fd, &line)) < 0) return (ft_map_error(clist)); if (ret == 0) return (ft_error_here(line, clist)); if (!line[0]) { ft_memdel((void**)&line); return (ft_parse_it(fd, clist)); } if (!ft_ischarset("RNSEWFC1\0", line[0]) || !(words = ft_split(line, ' '))) return (ft_error_here(line, clist)); if ((ret = ft_select_get(words, clist)) == 12) return ((ft_get_map_first_line(line, clist) < 0) ? (-1) : (12)); ft_memdel((void**)&line); return (ret); } void ft_parse_map(const char *map_path, t_cub *clist) { int fd; int8_t ret; ft_check_cub(map_path, clist); fd = open(map_path, O_RDONLY); if (fd < 0) { ft_dprintf(STDERR_FILENO, "Error\n"); ft_dprintf(STDERR_FILENO, "\033[31;1mNo map\033[0m\n"); ft_exit(5, clist); } ret = 1; while (ret != 12 && ret != -1) ret = ft_parse_it(fd, clist); (ret == -1) ? (ft_map_error(clist)) : 0; if (ft_get_map_core(fd, clist) < 0) ft_map_error(clist); ft_check_map_last_line(clist); ft_get_player_spawn(clist->plist, clist); ft_check_missing(clist); ft_set_minimap_scale(clist); ft_print_list(clist); close(fd); }