/* ************************************************************************** */ /* */ /* :::::::: */ /* parse.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/04/18 11:29:58 by whaffman #+# #+# */ /* Updated: 2025/04/18 15:20:37 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "cub3d.h" #include "libft.h" #include #include #include ssize_t get_file_size(const char *filename) { int fd; ssize_t size; fd = open(filename, O_RDONLY); if (fd == -1) return (-1); size = read(fd, NULL, SIZE_MAX); if (size == -1) { close(fd); return (-1); } close(fd); return (size); } char *read_map_file(const char *filename) { int fd; ssize_t size; ssize_t bytes_read; char *buffer; fd = open(filename, O_RDONLY); if (fd == -1) return (NULL); size = get_file_size(filename); if (size == -1) return (close(fd), NULL); buffer = malloc(size + 1); if (!buffer) return (close(fd), NULL); bytes_read = read(fd, buffer, size); if (bytes_read == -1) { free(buffer); close(fd); return (NULL); } buffer[bytes_read] = '\0'; close(fd); return (buffer); } int is_map_line(const char *line) { if (!line || !*line) return (FAILURE); while (*line && ft_isspace(*line)) line++; if (!*line) return (FAILURE); if (ft_strchr(line, '1')) return (SUCCESS); return (FAILURE); } int parse_color(const char *color_str) { } int valid_color(char *str) { char **tokens; int i; tokens = ft_split(str, ','); if (!tokens || !tokens[0] || !tokens[1] || tokens[2]) return (FAILURE); i = 0; while (tokens[i]) { if (!ft_isdigit(tokens[i][0])) return (FAILURE); i++; } } int parse_config_line(const char *line, t_map *map) { char **tokens; tokens = ft_split(line, ' '); if (!tokens || !tokens[0] || !tokens[1] || tokens[2]) return (FAILURE); if (ft_strncmp(tokens[0], "NO", 2) == 0) map->NO_texture = ft_strdup(tokens[1]); else if (ft_strncmp(tokens[0], "SO", 2) == 0) map->SO_texture = ft_strdup(tokens[1]); else if (ft_strncmp(tokens[0], "WE", 2) == 0) map->WE_texture = ft_strdup(tokens[1]); else if (ft_strncmp(tokens[0], "EA", 2) == 0) map->EA_texture = ft_strdup(tokens[1]); else if (ft_strncmp(tokens[0], "F", 1) == 0) map->floor_color = parse_color(tokens[1]); else if (ft_strncmp(tokens[0], "C", 1) == 0) map->ceiling_color = parse_color(tokens[1]); else { ft_free_arr(tokens); return (FAILURE); } ft_free_arr(tokens); return (SUCCESS); } int parse_file(char *buffer, t_map *map) { char **lines; lines = ft_split(buffer, '\n'); if (!lines) return (FAILURE); while (*lines && !is_map_line(*lines)) { if (**lines && !parse_config_line(*lines, map)) return (free(lines), FAILURE); lines++; } parse_map(lines, map); free(lines); return (SUCCESS); }