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)