Make translation of FEN with holdings also handle S-Chess
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 17 Apr 2012 18:05:20 +0000 (20:05 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 17 Apr 2012 18:08:58 +0000 (20:08 +0200)
Like in Shogi FEN, UCI S-Chess engines have the holdings not immediately
behind the board, but before the move counters. Since Shogi FENs are
missing a few fields in this area (castling, e.p. and 50-move), some
recoding was necessary to make this work.

UCI2WB.c

index b2c4583..2ea2512 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -269,7 +269,7 @@ Move4Engine(char *m)
 void\r
 GUI2Engine()\r
 {\r
-    char line[256], command[256], *p, *q;\r
+    char line[256], command[256], *p, *q, *r;\r
 \r
     while(1) {\r
        int i, x;\r
@@ -336,10 +336,13 @@ GUI2Engine()
        }\r
        else if(!strcmp(command, "setboard")) {\r
                if(strstr(line+9, " b ")) stm = BLACK;\r
-                if(sc == 's' && (p = strchr(line+9, '['))) { char c;\r
-                    *p++ = ' '; q = strchr(p, ']'); c = 'w' + 'b' - q[2]; strcpy(q+2, " 1\n"); while(*--q != ' ') q[2] = *q; *p = c; p[1] = ' '; \r
-                }\r
-               sprintf(iniPos, "%s%sfen %s", iniPos[0]=='p' ? "position " : "", sc=='s' ? "s" : "", line+9);\r
+                if(p = strchr(line+9, '[')) { char c;\r
+                    *p++ = 0; q = strchr(p, ']'); *q = 0; r = q + 4; \r
+                   if(sc == 's') q[2] = 'w' + 'b' - q[2], strcpy(r=q+3, " 1\n"); // Shogi: reverse color\r
+                   else r = strchr(strchr(q+4, ' ') + 1, ' '); // skip to second space (after e.p. square)\r
+                   *r = 0; sprintf(command, "%s%s %s %s", line+9, q+1, p, r+1);\r
+                } else strcpy(command, line+9);\r
+               sprintf(iniPos, "%s%sfen %s", iniPos[0]=='p' ? "position " : "", sc=='s' ? "s" : "", command);\r
                iniPos[strlen(iniPos)-1] = 0;\r
        }\r
        else if(!strcmp(command, "variant")) {\r