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; |