Introduction
Introduction Statistics Contact Development Disclaimer Help
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();
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.