126 lines
3.0 KiB
C
126 lines
3.0 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* parsing.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: apago <apago@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* 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);
|
|
}
|