piscine-bsq/srcs/parsing.c

124 lines
2.9 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parsing.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apago <apago@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/04/04 16:19:27 by apago #+# #+# */
/* Updated: 2023/04/04 18:26:39 by apago ### ########.fr */
/* */
/* ************************************************************************** */
#include "parsing.h"
int parse_meta(char *str, t_meta *meta)
{
int read_bytes;
read_bytes = read_uint(str);
meta->height = parse_valid_uint(str, read_bytes);
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);
}
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)
dst[i] = '.';
else if (line[i] == meta->obstacle)
dst[i] = 'o';
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 offset;
size_t read_bytes;
int i;
i = 0;
res = malloc(meta->width * meta->height * sizeof(char));
if (!res)
return (0);
while (i < meta->height)
{
read_bytes = parse_line(data, res, meta);
if (!read_bytes)
{
free(res);
return (0);
}
data += read_bytes;
i++;
}
if (!*data)
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)
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);
return (1);
}
int read_fname(char *name, t_map *map)
{
int file;
char *text;
int res;
file = open(name, O_RDONLY);
if (file == -1)
return (0);
text = read_file(file);
close(file);
if (!text)
return (0);
res = parse_input(text, map);
free(text);
return (res);
}