summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2019-03-16 19:50:30 +1300
committerDavid Phillips <david@sighup.nz>2019-03-16 19:50:30 +1300
commit605e548e42c2ec4882a65b88a09c329a4819cb0a (patch)
tree961cbc1ce7e170b860074fd0f20886d9e01e9ce6
parent6f81596763820040ad2305cf94b06e4142640940 (diff)
downloadsudoku-605e548e42c2ec4882a65b88a09c329a4819cb0a.tar.xz
Add file loading
-rw-r--r--Makefile2
-rw-r--r--load.c55
-rw-r--r--load.h10
-rw-r--r--solve.c104
4 files changed, 83 insertions, 88 deletions
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 <stdio.h>
+
+#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 <stdio.h>
+
+#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);