Improve reading of pieceToCharTable
authorH.G.Muller <hgm@hgm-xboard.(none)>
Mon, 2 Mar 2015 18:59:18 +0000 (19:59 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 7 May 2015 18:53:33 +0000 (20:53 +0200)
The piece-to-char string can now contain ' and ! suffixes on pieces,
which are taken together with the preceding piece ID. An encountered : will
cause the assigning to skip to the chu-promoted series of pieces, however
these are numbered.

backend.c

index 6cd2224..a75a87a 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -5946,6 +5946,14 @@ SetUpShuffle (Board board, int number)
        if(number >= 0) appData.defaultFrcPosition %= nrOfShuffles; // normalize
 }
 
+int
+ptclen (const char *s)
+{
+    int n = 0;
+    while(*s) n += (*s != '\'' && *s != '"' && *s != '`' && *s != '!'), s++;
+    return n;
+}
+
 int
 SetCharTable (char *table, const char * map)
 /* [HGM] moved here from winboard.c because of its general usefulness */
@@ -5953,17 +5961,25 @@ SetCharTable (char *table, const char * map)
 {
     int result = FALSE; int NrPieces;
 
-    if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare
+    if( map != NULL && (NrPieces=ptclen(map)) <= (int) EmptySquare
                     && NrPieces >= 12 && !(NrPieces&1)) {
-        int i; /* [HGM] Accept even length from 12 to 34 */
+        int i, j = 0; /* [HGM] Accept even length from 12 to 88 */
 
         for( i=0; i<(int) EmptySquare; i++ ) table[i] = '.';
         for( i=0; i<NrPieces/2-1; i++ ) {
-            table[i] = map[i];
-            table[i + (int)BlackPawn - (int) WhitePawn] = map[i+NrPieces/2];
+            if(map[j] == ':') i = CHUPROMOTED WhitePawn, j++;
+            table[i] = map[j++];
+            if(map[j] == '\'') table[i] += 64;
+            if(map[j] == '!') table[i] += 128;
+        }
+        table[(int) WhiteKing]  = map[j++];
+        for( i=0; i<NrPieces/2-1; i++ ) {
+            if(map[j] == ':') i = CHUPROMOTED BlackPawn, j++;
+            table[WHITE_TO_BLACK i] = map[j++];
+            if(map[j] == '\'') table[WHITE_TO_BLACK i] += 64;
+            if(map[j] == '!') table[WHITE_TO_BLACK i] += 128;
         }
-        table[(int) WhiteKing]  = map[NrPieces/2-1];
-        table[(int) BlackKing]  = map[NrPieces-1];
+        table[(int) BlackKing]  = map[j++];
 
         result = TRUE;
     }