Introduction
Introduction Statistics Contact Development Disclaimer Help
enable output options for the CGI mode - chess-puzzles - chess puzzle book gene…
git clone git://git.codemadness.org/chess-puzzles
Log
Files
Refs
README
LICENSE
---
commit 6554fcb56e12be089dbbf0e700f6777924e8b5b6
parent cd3acc17b7b82e112bd5abbc65324283a7c5bf7f
Author: Hiltjo Posthuma <[email protected]>
Date: Thu, 4 Jan 2024 17:04:22 +0100
enable output options for the CGI mode
Diffstat:
M fen.1 | 4 ++--
M fen.c | 74 +++++++++++++++++++++--------…
2 files changed, 53 insertions(+), 25 deletions(-)
---
diff --git a/fen.1 b/fen.1
@@ -60,8 +60,8 @@ Use a colour theme for certain output formats, supported are …
If this option is set
.Nm
will run in "CGI" mode suitable for a web server / HTTP daemon.
-This accepts the parameters: fen, moves, flip, coords and theme, similar to the
-command-line flags.
+This accepts the parameters: fen, moves, output, flip, coords and theme,
+similar to the command-line flags.
It will serve a SVG of the chess board and moves.
.El
.Sh EXIT STATUS
diff --git a/fen.c b/fen.c
@@ -15,7 +15,7 @@
#define SETFGCOLOR(r,g,b) printf("\x1b[38;2;%d;%d;%dm", r, g, b)
#define SETBGCOLOR(r,g,b) printf("\x1b[48;2;%d;%d;%dm", r, g, b)
-enum outputmode { ModeASCII = 0, ModeCGI, ModeFEN, ModePGN, ModeTTY, ModeSVG };
+enum outputmode { ModeInvalid = 0, ModeASCII, ModeCGI, ModeFEN, ModePGN, ModeT…
enum outputmode outputmode = ModeSVG;
/* localization of letter for PGN pieces */
@@ -1316,6 +1316,36 @@ decodeparam(char *buf, size_t bufsiz, const char *s)
return i;
}
+enum outputmode
+outputnametomode(const char *s)
+{
+ if (!strcmp(s, "ascii"))
+ return ModeASCII;
+ else if (!strcmp(s, "fen"))
+ return ModeFEN;
+ else if (!strcmp(s, "pgn"))
+ return ModePGN;
+ else if (!strcmp(s, "svg"))
+ return ModeSVG;
+ else if (!strcmp(s, "tty"))
+ return ModeTTY;
+ else
+ return ModeInvalid;
+}
+
+void
+output(struct board *b)
+{
+ switch (outputmode) {
+ case ModeASCII: output_ascii(b); break;
+ case ModeFEN: output_fen(b); break;
+ case ModePGN: break; /* handled in parsemoves() */
+ case ModeSVG: output_svg(b); break;
+ case ModeTTY: output_tty(b); break;
+ default: break;
+ }
+}
+
/* CGI mode */
int
cgi_mode(void)
@@ -1331,6 +1361,14 @@ cgi_mode(void)
board.flipboard = *p == '1' ? 1 : 0;
if ((p = getparam(query, "coords")) && (*p == '0' || *p == '1'))
board.showcoords = *p == '1' ? 1 : 0;
+
+ if ((p = getparam(query, "output"))) {
+ if (decodeparam(buf, sizeof(buf), p) == -1)
+ goto badrequest;
+ outputmode = outputnametomode(buf);
+ if (outputmode == ModeInvalid)
+ goto badrequest;
+ }
if ((p = getparam(query, "theme"))) {
if (decodeparam(buf, sizeof(buf), p) == -1)
goto badrequest;
@@ -1349,8 +1387,13 @@ cgi_mode(void)
board_playmoves(&board, buf);
}
- fputs("Status: 200 OK\r\nContent-Type: image/svg+xml\r\n\r\n", stdout);
- output_svg(&board);
+ fputs("Status: 200 OK\r\n", stdout);
+ if (outputmode == ModeSVG)
+ fputs("Content-Type: image/svg+xml\r\n\r\n", stdout);
+ else
+ fputs("Content-Type: text/plain\r\n\r\n", stdout);
+
+ output(&board);
return 0;
@@ -1358,7 +1401,7 @@ badrequest:
fputs("Status: 400 Bad Request\r\n", stdout);
fputs("Content-Type: text/plain\r\n", stdout);
fputs("\r\n", stdout);
- fputs("Bad request: fen parameter use a valid format or \"startpos\" (…
+ fputs("Bad request: make sure to use valid parameters\n", stdout);
return 1;
}
@@ -1404,17 +1447,9 @@ main(int argc, char *argv[])
if (i + 1 >= argc)
usage(argv[0]);
i++;
- if (!strcmp(argv[i], "ascii"))
- outputmode = ModeASCII;
- else if (!strcmp(argv[i], "fen"))
- outputmode = ModeFEN;
- else if (!strcmp(argv[i], "pgn"))
- outputmode = ModePGN;
- else if (!strcmp(argv[i], "svg"))
- outputmode = ModeSVG;
- else if (!strcmp(argv[i], "tty"))
- outputmode = ModeTTY;
- else
+
+ outputmode = outputnametomode(argv[i]);
+ if (outputmode == ModeInvalid)
usage(argv[0]);
goto next;
case 't': /* theme name */
@@ -1443,14 +1478,7 @@ next:
board_setup_fen(&board, fen);
board_playmoves(&board, moves);
- switch (outputmode) {
- case ModeASCII: output_ascii(&board); break;
- case ModeFEN: output_fen(&board); break;
- case ModePGN: break; /* handled in parsemoves(…
- case ModeSVG: output_svg(&board); break;
- case ModeTTY: output_tty(&board); break;
- default: usage(argv[0]); break;
- }
+ output(&board);
return 0;
}
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.