From 23a404b1069bcec38d00061cf4b50547b0f145f1 Mon Sep 17 00:00:00 2001 From: Andrei Pago Date: Wed, 5 Apr 2023 19:29:57 +0200 Subject: [PATCH] Fix parsing --- Makefile | 1 + assets/numbers.map | 10 ++++++++++ includes/ft_bsq.h | 3 ++- srcs/parsing.c | 33 +++++++++++++++++---------------- srcs/validation.c | 23 +++++++++++++++++++++++ 5 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 assets/numbers.map create mode 100644 srcs/validation.c diff --git a/Makefile b/Makefile index fc74981..f86db1f 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ SRC = \ printing.c \ map_helpers.c \ ft_string.c \ + validation.c \ HEADERS = ft_bsq.h diff --git a/assets/numbers.map b/assets/numbers.map new file mode 100644 index 0000000..83ed00c --- /dev/null +++ b/assets/numbers.map @@ -0,0 +1,10 @@ +97ox +777777777777777777777777777 +7777o7777777777777777777777 +777777777777o77777777777777 +777777777777777777777777777 +7777o7777777777777777777777 +777777777777777o77777777777 +777777777777777777777777777 +777777o77777777777777o77777 +77o7777777o7777777777777777 diff --git a/includes/ft_bsq.h b/includes/ft_bsq.h index 41b5c22..608ce36 100644 --- a/includes/ft_bsq.h +++ b/includes/ft_bsq.h @@ -6,7 +6,7 @@ /* By: apago +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/05 09:56:45 by tischmid #+# #+# */ -/* Updated: 2023/04/05 19:08:07 by apago ### ########.fr */ +/* Updated: 2023/04/05 19:27:20 by apago ### ########.fr */ /* */ /* ************************************************************************** */ @@ -56,5 +56,6 @@ void solve(t_map *map); int itoc(int idx, int width); int itor(int idx, int width); int get_index(t_map *map, int idx, int top, int left); +int validate_meta(t_meta *meta); #endif diff --git a/srcs/parsing.c b/srcs/parsing.c index 63e15a9..2327417 100644 --- a/srcs/parsing.c +++ b/srcs/parsing.c @@ -6,7 +6,7 @@ /* By: apago +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/04 16:19:27 by apago #+# #+# */ -/* Updated: 2023/04/05 19:12:00 by apago ### ########.fr */ +/* Updated: 2023/04/05 19:28:14 by apago ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,23 +14,24 @@ int parse_meta(char *str, t_meta *meta) { - int read_bytes; + size_t read_bytes; - read_bytes = read_uint(str); - meta->height = parse_valid_uint(str, 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 (!read_char(&str[read_bytes++], &meta->empty)) - return (0); - if (!read_char(&str[read_bytes++], &meta->obstacle)) - return (0); - if (!read_char(&str[read_bytes++], &meta->full)) - return (0); - if (!printable(meta->empty) || !printable(meta->obstacle) - || !printable(meta->full)) - return (0); - if ((meta->empty == meta->obstacle) || (meta->obstacle == meta->full)) - return (0); if (str[read_bytes++] != '\n') return (0); return (read_bytes); @@ -91,7 +92,7 @@ int parse_input(char *str, t_map *map) size_t read_bytes; read_bytes = parse_meta(str, &map->meta); - if (!read_bytes) + if (!read_bytes || !validate_meta(&map->meta)) return (0); offset = read_bytes; map->meta.width = count_first_line(&str[offset]); diff --git a/srcs/validation.c b/srcs/validation.c new file mode 100644 index 0000000..b2b0be2 --- /dev/null +++ b/srcs/validation.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* validation.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apago +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/04/05 19:27:00 by apago #+# #+# */ +/* Updated: 2023/04/05 19:28:47 by apago ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_bsq.h" + +int validate_meta(t_meta *meta) +{ + if (!printable(meta->empty) || !printable(meta->obstacle) + || !printable(meta->full)) + return (0); + if ((meta->empty == meta->obstacle) || (meta->obstacle == meta->full)) + return (0); + return (1); +}