Introduction
Introduction Statistics Contact Development Disclaimer Help
do not use ctype functions - chess-puzzles - chess puzzle book generator
git clone git://git.codemadness.org/chess-puzzles
Log
Files
Refs
README
LICENSE
---
commit d30b443f23a15ffab12f6a00931d979b9cfab061
parent 07c37ef3931e33b55aebe2561ed92d37735cabe8
Author: Hiltjo Posthuma <[email protected]>
Date: Sun, 9 Mar 2025 10:46:12 +0100
do not use ctype functions
These can be locale-specific on some platforms.
Diffstat:
M fen.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
---
diff --git a/fen.c b/fen.c
@@ -1,4 +1,3 @@
-#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -11,6 +10,12 @@
#define LEN(s) (sizeof(s)/sizeof(*s))
+/* ctype-like macros, but always compatible with ASCII / UTF-8 */
+#define ISDIGIT(c) (((unsigned)c) - '0' < 10)
+#define ISXDIGIT(c) ((((unsigned)c) - '0' < 10) || ((unsigned)c | 32) - 'a' < …
+#define TOLOWER(c) ((((unsigned)c) - 'A' < 26) ? ((c) | 32) : (c))
+#define TOUPPER(c) ((((unsigned)c) - 'a' < 26) ? ((c) & 0x5f) : (c))
+
/* macro for truecolor RGB output to tty */
#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)
@@ -238,7 +243,7 @@ speak(const char *fmt, ...)
int
pgnpiece(int piece)
{
- piece = toupper(piece);
+ piece = TOUPPER(piece);
/* no mapping */
if (!pgn_piecemapping[0])
@@ -554,7 +559,7 @@ output_tty(struct board *b)
fputs("\x1b[30m", stdout); /* black */
/* workaround: use black unicode chess symbol,…
the color is filled and better visible */
- showpiece_tty(tolower(piece));
+ showpiece_tty(TOLOWER(piece));
} else {
fputs(" ", stdout);
}
@@ -1027,7 +1032,7 @@ board_setup_fen(struct board *b, const char *fen)
if (l >= 0 && l < 32767) {
b->halfmove = l;
- for (; *s && isdigit((unsigned char)*s); s++)
+ for (; *s && ISDIGIT((unsigned char)*s); s++)
;
}
break;
@@ -1038,7 +1043,7 @@ board_setup_fen(struct board *b, const char *fen)
l = strtol(s, NULL, 10);
if (l >= 0 && l < 32767) {
b->movenumber = (int)l;
- for (; *s && isdigit((unsigned char)*s); s++)
+ for (; *s && ISDIGIT((unsigned char)*s); s++)
;
}
break;
@@ -1162,9 +1167,9 @@ board_playmoves(struct board *b, const char *moves)
/* is a valid piece? should be queen, rook, bishop, knight (no…
if (isvalidpiece(*s)) {
if (side == 'w')
- promote = toupper(*s);
+ promote = TOUPPER(*s);
else
- promote = tolower(*s);
+ promote = TOLOWER(*s);
s++;
}
@@ -1450,8 +1455,8 @@ decodeparam(char *buf, size_t bufsiz, const char *s)
case '%':
if (i + 3 >= bufsiz)
return -1;
- if (!isxdigit((unsigned char)*(s+1)) ||
- !isxdigit((unsigned char)*(s+2)))
+ if (!ISXDIGIT((unsigned char)*(s+1)) ||
+ !ISXDIGIT((unsigned char)*(s+2)))
return -1;
buf[i++] = hexdigit(*(s+1)) * 16 + hexdigit(*(s+2));
s += 2;
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.