From 605e548e42c2ec4882a65b88a09c329a4819cb0a Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sat, 16 Mar 2019 19:50:30 +1300 Subject: Add file loading --- Makefile | 2 +- load.c | 55 +++++++++++++++++++++++++++++++++ load.h | 10 ++++++ solve.c | 104 +++++++++++---------------------------------------------------- 4 files changed, 83 insertions(+), 88 deletions(-) create mode 100644 load.c create mode 100644 load.h diff --git a/Makefile b/Makefile index 07b5fea..d5483ab 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CFLAGS += -Werror -Wall all: solve -solve: display.o update.o cell.h +solve: display.o update.o load.o cell.h load.h display.o: display.c cell.h display.h diff --git a/load.c b/load.c new file mode 100644 index 0000000..bc2b875 --- /dev/null +++ b/load.c @@ -0,0 +1,55 @@ +#include + +#include "cell.h" + +int load(FILE *f, struct cell (*b)[9][9]) +{ + int x = 0; + int y = 0; + char c = '\0'; + + while (y < 9) { + c = fgetc(f); + + switch(c) { + case ' ': + case '\n': + case '\t': + case '|': + /* skip whitespace, | */ + continue; + + case '_': + case '?': + /* blank = same as 0 */ + c = '0'; + /* fallthrough */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + (*b)[x][y].val = c - '0'; + break; + + case EOF: + printf("Unexpected EOF when filling (%d,%d)\n", x, y); + return -1; + default: + printf("Unexpected '%c' when filling (%d,%d)\n", c, x, y); + return -1; + } + + /* move to next position in board */ + if (++x == 9) { + x = 0; + y++; + } + } + return 0; +} diff --git a/load.h b/load.h new file mode 100644 index 0000000..9074719 --- /dev/null +++ b/load.h @@ -0,0 +1,10 @@ +#ifndef SUDOKU_LOAD_H +#define SUDOKU_LOAD_H + +#include + +#include "cell.h" + +int load(FILE *f, struct cell (*b)[9][9]); + +#endif /* SUDOKU_LOAD_H */ diff --git a/solve.c b/solve.c index a5f02bf..ff82351 100644 --- a/solve.c +++ b/solve.c @@ -5,6 +5,7 @@ #include "update.h" #include "cell.h" #include "display.h" +#include "load.h" /* * For all unsolved cells on the board, solve them if they have been marked as @@ -344,98 +345,27 @@ int board_is_solved(struct cell (*b)[9][9]) int main(int argc, char **argv) { struct cell board[9][9]; + FILE *f = NULL; memset(board, 0, sizeof(board)); - board[1][0].val = 6; - board[2][0].val = 1; - board[3][0].val = 5; - board[8][0].val = 9; - - board[1][1].val = 7; - board[2][1].val = 5; - board[3][1].val = 4; - board[4][1].val = 9; - board[5][1].val = 3; - board[6][1].val = 6; - - board[0][2].val = 9; - board[3][2].val = 6; - board[7][2].val = 7; - - board[0][3].val = 4; - board[3][3].val = 2; - board[5][3].val = 6; - - board[0][4].val = 3; - board[2][4].val = 9; - board[6][4].val = 2; - board[8][4].val = 7; - - board[3][5].val = 9; - board[5][5].val = 5; - board[8][5].val = 3; - - board[1][6].val = 8; - board[5][6].val = 9; - board[8][6].val = 5; - - - board[2][7].val = 4; - board[3][7].val = 7; - board[4][7].val = 5; - board[5][7].val = 2; - board[6][7].val = 8; - board[7][7].val = 9; - - - board[0][8].val = 5; - board[5][8].val = 1; - board[6][8].val = 7; - board[7][8].val = 3; - -// board[7][0].val = 3; -// board[4][1].val = 3; -// board[0][7].val = 3; -// board[1][4].val = 3; -// -// /* dummy board taken from the guardian lol */ -// /* FIXME: have a way to input boards, silly */ -// board[0][0].val = 7; -// board[0][4].val = 5; -// -// board[1][2].val = 5; -// board[1][4].val = 9; -// -// board[2][1].val = 6; -// board[2][2].val = 4; -// board[2][5].val = 2; -// -// board[3][0].val = 1; -// board[3][5].val = 9; -// board[3][6].val = 7; -// -// board[4][0].val = 9; -// board[4][2].val = 6; -// board[4][3].val = 4; -// board[4][7].val = 8; -// board[4][8].val = 5; -// -// board[5][4].val = 2; -// -// board[6][4].val = 8; -// board[6][6].val = 5; -// board[6][7].val = 6; -// -// board[7][1].val = 8; -// board[7][6].val = 3; -// -// board[8][0].val = 4; -// board[8][4].val = 1; -// board[8][5].val = 7; -// board[8][8].val = 8; + if (argc != 2) { + printf("Syntax: %s puzzle_file\n", argv[0]); + return 1; + } + + f = fopen(argv[1], "r"); + if (!f) { + perror("fopen"); + return 1; + } + if (load(f, &board) < 0) { + fclose(f); + return 1; + } + fclose(f); display(board); -- cgit v1.1