aboutsummaryrefslogtreecommitdiffstats
path: root/libcharconv_xiangqi_red.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-01-25 19:05:56 +0100
committerMattias Andrée <m@maandree.se>2026-01-25 19:05:56 +0100
commit3a6e4aa0a450dd6248278e51bd5b3f1b0a32ac0a (patch)
tree5bdaa78a461b1a60399fe98c58e228de0795650f /libcharconv_xiangqi_red.c
parentAdd control characters (diff)
downloadcharconv-3a6e4aa0a450dd6248278e51bd5b3f1b0a32ac0a.tar.gz
charconv-3a6e4aa0a450dd6248278e51bd5b3f1b0a32ac0a.tar.bz2
charconv-3a6e4aa0a450dd6248278e51bd5b3f1b0a32ac0a.tar.xz
Add xiangqi
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libcharconv_xiangqi_red.c')
-rw-r--r--libcharconv_xiangqi_red.c150
1 files changed, 150 insertions, 0 deletions
diff --git a/libcharconv_xiangqi_red.c b/libcharconv_xiangqi_red.c
new file mode 100644
index 0000000..d68647a
--- /dev/null
+++ b/libcharconv_xiangqi_red.c
@@ -0,0 +1,150 @@
+/* See LICENSE file for copyright and license details. */
+#include "lib-common.h"
+#include <string.h>
+
+
+#define DEFAULT RED
+
+#define RED UINT32_C(0x1FA60)
+#define BLACK UINT32_C(0x1FA67)
+#define OTHER (RED ^ BLACK ^ DEFAULT)
+#define GENERAL 0u
+#define MANDARIN 1u
+#define ELEPHANT 2u
+#define HORSE 3u
+#define CHARIOT 4u
+#define CANNON 5u
+#define SOLDIER 6u
+
+
+static struct {
+ uint_least32_t cp;
+ const char *s;
+} symbols[] = {
+ {DEFAULT + GENERAL, "1"},
+ {DEFAULT + MANDARIN, "2"},
+ {DEFAULT + ELEPHANT, "3"},
+ {DEFAULT + HORSE, "4"},
+ {DEFAULT + CHARIOT, "5"},
+ {DEFAULT + CANNON, "6"},
+ {DEFAULT + SOLDIER, "7"},
+ {BLACK + GENERAL, "將"},
+ {BLACK + GENERAL, "将"},
+ {RED + GENERAL, "帥"},
+ {RED + GENERAL, "帅"},
+ {BLACK + GENERAL, "general"},
+ {BLACK + GENERAL, "king"},
+ {DEFAULT + GENERAL, "marshal"},
+ {OTHER + GENERAL, "MARSHAL"},
+ {BLACK + MANDARIN, "士"},
+ {RED + MANDARIN, "仕"},
+ {DEFAULT + MANDARIN, "advisor"},
+ {DEFAULT + MANDARIN, "guard"},
+ {DEFAULT + MANDARIN, "assistant"},
+ {DEFAULT + MANDARIN, "mandarin"},
+ {DEFAULT + MANDARIN, "warrior"},
+ {DEFAULT + MANDARIN, "scholar"},
+ {DEFAULT + MANDARIN, "guardian"},
+ {OTHER + MANDARIN, "ADVISOR"},
+ {OTHER + MANDARIN, "GUARD"},
+ {OTHER + MANDARIN, "ASSISTANT"},
+ {OTHER + MANDARIN, "MANDARIN"},
+ {OTHER + MANDARIN, "WARRIOR"},
+ {OTHER + MANDARIN, "SCHOLAR"},
+ {OTHER + MANDARIN, "GUARDIAN"},
+ {BLACK + MANDARIN, "gentleman"},
+ {BLACK + MANDARIN, "officer"},
+ {RED + MANDARIN, "official"},
+ {BLACK + ELEPHANT, "象"},
+ {RED + ELEPHANT, "相"},
+ {BLACK + ELEPHANT, "elephant"},
+ {DEFAULT + ELEPHANT, "bishop"},
+ {OTHER + ELEPHANT, "BISHOP"},
+ {RED + ELEPHANT, "minister"},
+ {BLACK + HORSE, "馬"},
+ {RED + HORSE, "傌"},
+ {DEFAULT + HORSE, "horse"},
+ {DEFAULT + HORSE, "knight"},
+ {OTHER + HORSE, "HORSE"},
+ {OTHER + HORSE, "KNIGHT"},
+ {BLACK + CHARIOT, "車"},
+ {RED + CHARIOT, "俥"},
+ {DEFAULT + CHARIOT, "车"},
+ {DEFAULT + CHARIOT, "chariot"},
+ {DEFAULT + CHARIOT, "rook"},
+ {DEFAULT + CHARIOT, "car"},
+ {OTHER + CHARIOT, "CHARIOT"},
+ {OTHER + CHARIOT, "ROOK"},
+ {OTHER + CHARIOT, "CAR"},
+ {BLACK + CANNON, "砲"},
+ {RED + CANNON, "炮"},
+ {BLACK + CANNON, "catapult"},
+ {RED + CANNON, "cannon"},
+ {BLACK + SOLDIER, "卒"},
+ {RED + SOLDIER, "兵"},
+ {BLACK + SOLDIER, "pawn"},
+ {BLACK + SOLDIER, "private"},
+ {RED + SOLDIER, "soldier"},
+ {DEFAULT + CHARIOT, "x"},
+ {DEFAULT + MANDARIN, "m"},
+ {DEFAULT + MANDARIN, "a"},
+ {DEFAULT + CANNON, "c"},
+ {DEFAULT + CHARIOT, "r"},
+ {DEFAULT + ELEPHANT, "e"},
+ {DEFAULT + GENERAL, "g"},
+ {DEFAULT + HORSE, "h"},
+ {DEFAULT + SOLDIER, "s"},
+ {OTHER + CHARIOT, "X"},
+ {OTHER + MANDARIN, "M"},
+ {OTHER + MANDARIN, "A"},
+ {OTHER + CANNON, "C"},
+ {OTHER + CHARIOT, "R"},
+ {OTHER + ELEPHANT, "E"},
+ {OTHER + GENERAL, "G"},
+ {OTHER + HORSE, "H"},
+ {OTHER + SOLDIER, "S"}
+};
+
+
+enum libcharconv_result
+libcharconv_xiangqi_red(const char *s, size_t slen, size_t *n, uint_least32_t *cp, size_t *ncp)
+{
+ size_t i, len, found, found_len;
+ int indeterminate;
+ *n = 0;
+ for (; slen; s++, slen--, ++*n) {
+ indeterminate = 0;
+ found = SIZE_MAX;
+ found_len = 0u;
+ for (i = 0u; i < sizeof(symbols) / sizeof(*symbols); i++) {
+ len = strlen(symbols[i].s);
+ if (strncmp(s, symbols[i].s, len < slen ? len : slen))
+ continue;
+ if (slen < len) {
+ indeterminate = 1;
+ continue;
+ }
+ if (len > found_len) {
+ found = i;
+ found_len = len;
+ }
+ }
+ if (found_len)
+ goto conv;
+ if (*n)
+ goto no_conv;
+ if (indeterminate)
+ return LIBCHARCONV_INDETERMINATE;
+ }
+no_conv:
+ return LIBCHARCONV_NO_CONVERT;
+
+conv:
+ if (*n)
+ goto no_conv;
+ if (*ncp)
+ *cp = symbols[found].cp;
+ *n += found_len;
+ *ncp = 1u;
+ return indeterminate ? LIBCHARCONV_CONVERT_IF_END : LIBCHARCONV_CONVERTED;
+}