Check-in modifications made by HGM so far
[capablanca.git] / lasker-2.2.3 / src / eco.c
old mode 100644 (file)
new mode 100755 (executable)
index bc3a115..5d13738
@@ -48,63 +48,66 @@ static int ECO_entries, NIC_entries, LONG_entries;
 
 void FEN_to_board(char* FENpos, struct game_state_t* gs)
 {
-  int f,r;
-  char next;
-  
-  for (r=7; r >=0; r--) {
-    f=0;
-    while (f<8) {
-      next = *(FENpos++);
-      if (isalpha(next))
-        gs->board[f++][r] = CharToPiece(next);
-      else if (next != '/') {
-        int t = (next - '0');
-        do
-          gs->board[f++][r] = NOPIECE;
-        while (--t);
-      }
-    }
-  }
-  if (*(FENpos + 1) == 'w') /* the char after the space */
-    gs->onMove = WHITE;
-  else
-    gs->onMove = BLACK;
+  int f,r;\r
+  char next;\r
+printf("FEN, var='%s'\n", gs->variant);\r
+  for (r=gs->ranks-1; r >=0; r--) {\r
+    f=0;\r
+    while (f<gs->files) {\r
+      next = *(FENpos++);\r
+      if (isalpha(next))\r
+        gs->board[f++][r] = CharToPiece(next, gs->variant);\r
+      else if (next != '/') {\r
+        int t = (next - '0');\r
+         if(*FENpos >= '0' && *FENpos <= '9') // [HGM] can be double-digit\r
+             t = 10*t + *(FENpos++) - '0';\r
+        do\r
+          gs->board[f++][r] = NOPIECE;\r
+        while (--t && f < gs->files);\r
+      }\r
+    }\r
+  }\r
+  if (*(FENpos + 1) == 'w') /* the char after the space */\r
+    gs->onMove = WHITE;\r
+  else\r
+    gs->onMove = BLACK;\r
 }
 
 /* converts a board to a FEN pos */
 
 static void board_to_FEN(char* FENpos, struct game_state_t* gs)
 {
-  int f,r,count;
-  char piece;  
-
-  for (r=7; r>=0; r--) {
-    count = 0;
-    for (f=0;  f<8; f++) {
-      if ((piece = PieceToChar(gs->board[f][r])) != ' ') {
-        if (count) { 
-          *(FENpos++) = count + '0';
-          count = 0;
-        }
-        *(FENpos++) = piece;
-      } else {
-        if (f == 7)
-          *(FENpos++) = count + '0' + 1;
-        else
-          count++;
-      }
-    }
-    *(FENpos++) = '/';
-  }
-
-  *(--FENpos) = ' ';
-
-  if (gs->onMove == WHITE)
-    *(++FENpos) = 'w';
-  else
-    *(++FENpos) = 'b';
-  *(++FENpos) = '\0';
+  int f,r,count;\r
+  char piece;  \r
+\r
+  for (r=gs->ranks-1; r>=0; r--) {\r
+    count = 0;\r
+    for (f=0;  f<gs->files; f++) {\r
+      if ((piece = PieceToChar(gs->board[f][r])) != ' ') {\r
+        if (count) { \r
+           if(count > 9) { count -= 10; *(FENpos++) = '1'; }\r
+          *(FENpos++) = count + '0';\r
+          count = 0;\r
+        }\r
+        *(FENpos++) = piece;\r
+      } else {\r
+        if (f == gs->files-1) {\r
+           if(count > 8) { count -= 10; *(FENpos++) = '1'; }\r
+          *(FENpos++) = count + '0' + 1;\r
+        } else\r
+          count++;\r
+      }\r
+    }\r
+    *(FENpos++) = '/';\r
+  }\r
+\r
+  *(--FENpos) = ' ';\r
+\r
+  if (gs->onMove == WHITE)\r
+    *(++FENpos) = 'w';\r
+  else\r
+    *(++FENpos) = 'b';\r
+  *(++FENpos) = '\0';\r
 }
 
 char *boardToFEN(int g)