diff options
Diffstat (limited to 'src/parse/parse.c')
| -rw-r--r-- | src/parse/parse.c | 48 |
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); } |
