fen.c: code cleanup: separate parsing FEN and moves in 2 functions - chess-puzz… | |
git clone git://git.codemadness.org/chess-puzzles | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 2f8f9b16e1834cdd577d590efc51be17f3013585 | |
parent 752c96801f72527cf5bc3faab7ad7d1d7889ddbf | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Thu, 21 Dec 2023 18:27:41 +0100 | |
fen.c: code cleanup: separate parsing FEN and moves in 2 functions | |
Diffstat: | |
M TODO | 5 ++--- | |
M fen.c | 148 +++++++++++++++++------------… | |
2 files changed, 85 insertions(+), 68 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,6 +1,5 @@ | |
-- code cleanup: | |
- - separate parsefen() function. | |
- - separate parsemoves() function. | |
+- stream_lichess.sh: lichess API: read FEN of start position, for chess 960 | |
+chess variant. | |
- option for output for annotating moves in a human-like way (for screenreader… | |
https://en.wikipedia.org/wiki/Portable_Game_Notation | |
diff --git a/fen.c b/fen.c | |
@@ -444,63 +444,14 @@ showboard_ascii(void) | |
} | |
void | |
-usage(char *argv0) | |
-{ | |
- fprintf(stderr, "usage: %s [-cCfF] [-o ascii|fen|svg|tty] [FEN] [moves… | |
- exit(1); | |
-} | |
- | |
-int | |
-main(int argc, char *argv[]) | |
+parsefen(const char *fen) | |
{ | |
- const char *fen, *moves, *s, *output = "svg"; | |
- int x, y, x2, y2, field, piece, takepiece; | |
- int i, j; | |
char square[3]; | |
+ const char *s; | |
long l; | |
+ int x, y, field; | |
-#ifdef __OpenBSD__ | |
- if (pledge("stdio", NULL) == -1) | |
- err(1, "pledge"); | |
-#endif | |
- | |
- fen = "startpos"; | |
- moves = ""; | |
- | |
- for (i = 1; i < argc; i++) { | |
- if (argv[i][0] != '-') | |
- break; | |
- | |
- for (j = 1; argv[i][j]; j++) { | |
- switch (argv[i][j]) { | |
- case 'c': showcoords = 1; break; | |
- case 'C': showcoords = 0; break; | |
- case 'f': flipboard = 1; break; | |
- case 'F': flipboard = 0; break; | |
- case 'o': | |
- if (i + 1 >= argc) | |
- usage(argv[0]); | |
- output = argv[++i]; | |
- goto next; | |
- default: | |
- usage(argv[0]); | |
- break; | |
- } | |
- } | |
-next: | |
- ; | |
- } | |
- if (i < argc) { | |
- fen = argv[i]; | |
- i++; | |
- } | |
- if (i < argc) { | |
- moves = argv[i]; | |
- i++; | |
- } | |
- | |
- if (!strcmp(fen, "startpos")) | |
- fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 … | |
+ square[2] = '\0'; | |
/* initial board state, FEN format */ | |
x = y = field = 0; | |
@@ -547,7 +498,6 @@ next: | |
*(s + 1) >= '1' && *(s + 1) <= '6') { | |
square[0] = *s; | |
square[1] = *(s + 1); | |
- square[2] = '\0'; | |
squaretoxy(square, &x, &y); | |
enpassantsquare[0] = x; | |
@@ -589,6 +539,14 @@ next: | |
continue; | |
} | |
} | |
+} | |
+ | |
+void | |
+parsemoves(const char *moves) | |
+{ | |
+ char square[3]; | |
+ const char *s; | |
+ int i, x, y, x2, y2, piece, takepiece; | |
/* process moves */ | |
square[2] = '\0'; | |
@@ -634,10 +592,10 @@ next: | |
place(0, x2, y2); /* clear rook square… | |
} else if (x2 <= x - 2) { /* moved more than 1… | |
/* white: queenside castling: "e1c1" */ | |
- for (j = x2 - 1; j > 0; j--) { | |
- if (getpiece(j, y2) == 'R') { | |
+ for (i = x2 - 1; i > 0; i--) { | |
+ if (getpiece(i, y2) == 'R') { | |
place('R', x2 + 1, y2)… | |
- place(0, j, y2); /* cl… | |
+ place(0, i, y2); /* cl… | |
break; | |
} | |
} | |
@@ -664,21 +622,21 @@ next: | |
} else if (piece == 'k') { | |
black_can_castle[0] = black_can_castle[1] = 0; | |
} else if (piece == 'R' && y == 7) { | |
- for (j = 0; j < 7; j++) { | |
- if (getpiece(j, y) == 'K') { | |
- if (j < x) | |
+ for (i = 0; i < 7; i++) { | |
+ if (getpiece(i, y) == 'K') { | |
+ if (i < x) | |
white_can_castle[0] = … | |
- else if (j > x) | |
+ else if (i > x) | |
white_can_castle[1] = … | |
break; | |
} | |
} | |
} else if (piece == 'r' && y == 0) { | |
- for (j = 0; j < 7; j++) { | |
- if (getpiece(j, y) == 'k') { | |
- if (j > x) | |
+ for (i = 0; i < 7; i++) { | |
+ if (getpiece(i, y) == 'k') { | |
+ if (i > x) | |
black_can_castle[1] = … | |
- else if (j < x) | |
+ else if (i < x) | |
black_can_castle[0] = … | |
break; | |
} | |
@@ -728,6 +686,66 @@ next: | |
/* highlight last move */ | |
highlightmove(x, y, x2, y2); | |
+} | |
+ | |
+void | |
+usage(char *argv0) | |
+{ | |
+ fprintf(stderr, "usage: %s [-cCfF] [-o ascii|fen|svg|tty] [FEN] [moves… | |
+ exit(1); | |
+} | |
+ | |
+int | |
+main(int argc, char *argv[]) | |
+{ | |
+ const char *fen, *moves, *output = "svg"; | |
+ int i, j; | |
+ | |
+#ifdef __OpenBSD__ | |
+ if (pledge("stdio", NULL) == -1) | |
+ err(1, "pledge"); | |
+#endif | |
+ | |
+ fen = "startpos"; | |
+ moves = ""; | |
+ | |
+ for (i = 1; i < argc; i++) { | |
+ if (argv[i][0] != '-') | |
+ break; | |
+ | |
+ for (j = 1; argv[i][j]; j++) { | |
+ switch (argv[i][j]) { | |
+ case 'c': showcoords = 1; break; | |
+ case 'C': showcoords = 0; break; | |
+ case 'f': flipboard = 1; break; | |
+ case 'F': flipboard = 0; break; | |
+ case 'o': | |
+ if (i + 1 >= argc) | |
+ usage(argv[0]); | |
+ output = argv[++i]; | |
+ goto next; | |
+ default: | |
+ usage(argv[0]); | |
+ break; | |
+ } | |
+ } | |
+next: | |
+ ; | |
+ } | |
+ if (i < argc) { | |
+ fen = argv[i]; | |
+ i++; | |
+ } | |
+ if (i < argc) { | |
+ moves = argv[i]; | |
+ i++; | |
+ } | |
+ | |
+ if (!strcmp(fen, "startpos")) | |
+ fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 … | |
+ | |
+ parsefen(fen); | |
+ parsemoves(moves); | |
if (!strcmp(output, "ascii")) | |
showboard_ascii(); |