/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parsing.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: apago +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/04 16:19:27 by apago #+# #+# */ /* Updated: 2023/04/05 19:28:14 by apago ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_bsq.h" int parse_meta(char *str, t_meta *meta) { size_t read_bytes; read_bytes = 0; while (str[read_bytes] && str[read_bytes] != '\n') read_bytes++; if (read_bytes < 4) return (0); if (!read_char(&str[read_bytes - 3], &meta->empty)) return (0); if (!read_char(&str[read_bytes - 2], &meta->obstacle)) return (0); if (!read_char(&str[read_bytes - 1], &meta->full)) return (0); if (read_uint(str) < read_bytes - 3) return (0); meta->height = parse_valid_uint(str, read_bytes - 3); if (meta->height < 1) return (0); if (str[read_bytes++] != '\n') return (0); return (read_bytes); } size_t parse_line(char *line, char *dst, t_meta *meta) { int i; i = 0; while (i < meta->width) { if (!line[i]) return (0); if (line[i] == meta->empty || line[i] == meta->obstacle) dst[i] = line[i]; else return (0); i++; } if (line[i] != '\n') return (0); return (meta->width + 1); } char *parse_data(char *data, t_meta *meta) { char *res; size_t read_bytes; size_t read_total; int i; i = 0; read_total = 0; res = malloc(meta->width * meta->height * sizeof(char)); if (!res) return (0); while (i < meta->height) { read_bytes = parse_line(&data[read_total], &res[read_total - i], meta); if (!read_bytes) { free(res); return (0); } read_total += read_bytes; i++; } if (!data[read_total]) return (res); free(res); return (0); } int parse_input(char *str, t_map *map) { size_t offset; size_t read_bytes; read_bytes = parse_meta(str, &map->meta); if (!read_bytes || !validate_meta(&map->meta)) return (0); offset = read_bytes; map->meta.width = count_first_line(&str[offset]); if (!map->meta.width) return (0); map->data = parse_data(&str[offset], &map->meta); if (!map->data) return (0); map->index = malloc(sizeof(int) * (map->meta.width * map->meta.height)); if (!map->index) { free(map->data); return (0); } ft_memset_int(map->index, 0, map->meta.width * map->meta.height); return (1); } int parse_file(int file, t_map *map) { char *text; int res; text = read_file(file); if (!text) return (0); res = parse_input(text, map); free(text); return (res); }