diff --git a/src/sudoku.c b/src/sudoku.c index c84f04a..dd18a78 100644 --- a/src/sudoku.c +++ b/src/sudoku.c @@ -1,6 +1,7 @@ #include "sudoku.h" #include +#include #define INPUT_PATTERN "%1d %1d %1d %1d %1d %1d %1d %1d %1d\n" @@ -35,3 +36,37 @@ bool parse_grid_str(struct sudoku *grid, const char *input) { return true; } + +bool parse_line_file(struct sudoku *grid, FILE *input) { + if (!input || !grid) + return false; + + char *line = NULL; + if (getline(&line, NULL, input) < 0) + return false; + + bool ret = parse_line_str(grid, line); + + free(line); + + return ret; +} + +bool parse_line_str(struct sudoku *grid, const char *input) { + if (!input || !grid) + return false; + + for (size_t i = 0; i < 9; ++i) { + for (size_t j = 0; j < 9; ++j) { + char c = *(input++); + if (c >= '1' && c <= '9') + grid->grid[i][j] = c - '0'; + else if (c == '.' || c == '0') + grid->grid[i][j] = 0; + else + return false; + } + } + + return true; +} diff --git a/src/sudoku.h b/src/sudoku.h index 4ecd566..33c81f9 100644 --- a/src/sudoku.h +++ b/src/sudoku.h @@ -10,5 +10,7 @@ struct sudoku { bool parse_grid_file(struct sudoku *grid, FILE *input); bool parse_grid_str(struct sudoku *grid, const char *input); +bool parse_line_file(struct sudoku *grid, FILE *input); +bool parse_line_str(struct sudoku *grid, const char *input); #endif /* !SUDOKU_H */