aboutsummaryrefslogtreecommitdiff
path: root/src/parse/parse.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-05 01:29:44 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-05 01:29:44 +0100
commitaf747497060d8a311204ec58b3ac87cc585462fc (patch)
tree2022e10ac93243772f22f281071a4e0fd5c55f1d /src/parse/parse.c
parent3b224458a5d539bbe00318d939c9a099f3f158e1 (diff)
downloadcub3d-af747497060d8a311204ec58b3ac87cc585462fc.tar.gz
cub3d-af747497060d8a311204ec58b3ac87cc585462fc.tar.bz2
cub3d-af747497060d8a311204ec58b3ac87cc585462fc.zip
better parsing
Diffstat (limited to 'src/parse/parse.c')
-rw-r--r--src/parse/parse.c48
1 files changed, 19 insertions, 29 deletions
diff --git a/src/parse/parse.c b/src/parse/parse.c
index 4c51945..c1f1a5f 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/11/15 09:29:21 by cacharle #+# #+# */
-/* Updated: 2020/02/04 04:41:26 by cacharle ### ########.fr */
+/* Updated: 2020/02/05 01:27:22 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -22,19 +22,15 @@ t_state *parse(char *filename)
return (error_put_return("create empty state"));
if ((lines = get_file_lines(filename)) == NULL)
return (error_put_return_state_destroy("read .cub file", state));
- i = -1;
- while (lines[++i] != NULL)
+ if ((i = parse_premap(state, lines)) == -1)
{
- if (*lines[i] == '1')
- break ;
- if (!parse_line(state, lines[i]))
- return (error_put_return_lines_state_destroy(
- "parse configuration", state, lines));
+ return (error_put_return_lines_state_destroy(
+ "parse option", state, lines));
}
- if ((state = parse_map(state, lines + i)) == NULL)
+ if (state->pflags != 0xFF || (state = parse_map(state, lines + i)) == NULL)
{
- return (error_put_return_lines_state_destroy("parse map",
- state, lines));
+ return (error_put_return_lines_state_destroy(state == NULL ?
+ "parse map" : "parse options", state, lines));
}
helper_free_splited(lines);
return (state);
@@ -54,15 +50,14 @@ static t_option_parser g_option_parsers[] =
t_bool parse_line(t_state *state, char *line)
{
- int i;
- char *tmp;
+ int i;
+ char *tmp;
if (!*line)
return (TRUE);
i = -1;
while (++i < (int)(sizeof(g_option_parsers) / sizeof(t_option_parser)))
{
-
if (ft_strncmp(g_option_parsers[i].id, line,
ft_strlen(g_option_parsers[i].id)) == 0)
{
@@ -84,37 +79,27 @@ t_state *parse_map(t_state *state, char **lines)
if (*lines[i] != '1')
return (NULL);
state->map_height = i;
- if ((state->map = (t_map)malloc(sizeof(t_cell*) * i)) == NULL)
+ if ((state->map = (t_map)ft_calloc(i, sizeof(t_cell*))) == NULL)
return (NULL);
state->map_width = ft_strcount(*lines, '1');
i = -1;
while (lines[++i] != NULL)
- if ((state->map[i] = create_map_row(lines[i])) == NULL)
+ if ((state->map[i] = create_map_row(state, lines[i])) == NULL)
return (NULL);
return (state);
}
-t_cell *create_map_row(char *line)
+t_cell *create_map_row(t_state *state, char *line)
{
int i;
t_cell *row;
- if ((row = (t_cell*)malloc(sizeof(t_cell) * ft_strlen(line))) == NULL)
+ if ((row = (t_cell*)malloc(sizeof(t_cell) * state->map_width)) == NULL)
return (NULL);
i = 0;
while (*line)
{
- if (*line == '0' || *line == '1' || *line == '2')
- row[i++] = *line - '0';
- else if (*line == 'N')
- row[i++] = CELL_LOOK_NORTH;
- else if (*line == 'S')
- row[i++] = CELL_LOOK_SOUTH;
- else if (*line == 'W')
- row[i++] = CELL_LOOK_WEST;
- else if (*line == 'E')
- row[i++] = CELL_LOOK_EAST;
- else
+ if (!create_map_row_char(*line, row, i++))
{
free(row);
return (NULL);
@@ -123,5 +108,10 @@ t_cell *create_map_row(char *line)
while (*line == ' ')
line++;
}
+ if (i != state->map_width)
+ {
+ free(row);
+ return (NULL);
+ }
return (row);
}