X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=9c734eb1979f4519dc05a175f0f752dbf3ff97b0;hb=0bf664e507241790adc9f419b24be4d1d5963b28;hp=a75a87ad0bc582ece2be05df6879b0cf66a290f3;hpb=feb2178fcad4b5aaebb5bd1045e15553af2e6637;p=xboard.git diff --git a/backend.c b/backend.c index a75a87a..9c734eb 100644 --- a/backend.c +++ b/backend.c @@ -5947,37 +5947,38 @@ SetUpShuffle (Board board, int number) } int -ptclen (const char *s) +ptclen (const char *s, char *escapes) { int n = 0; - while(*s) n += (*s != '\'' && *s != '"' && *s != '`' && *s != '!'), s++; + if(!*escapes) return strlen(s); + while(*s) n += (*s != ':' && !strchr(escapes, *s)), s++; return n; } int -SetCharTable (char *table, const char * map) +SetCharTableEsc (unsigned char *table, const char * map, char * escapes) /* [HGM] moved here from winboard.c because of its general usefulness */ /* Basically a safe strcpy that uses the last character as King */ { int result = FALSE; int NrPieces; - if( map != NULL && (NrPieces=ptclen(map)) <= (int) EmptySquare + if( map != NULL && (NrPieces=ptclen(map, escapes)) <= (int) EmptySquare && NrPieces >= 12 && !(NrPieces&1)) { 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~' (Crazyhouse) */ p[-1] = PieceToChar((ChessSquare)(CHUDEMOTED piece)); @@ -18083,13 +18091,20 @@ ParseFEN (Board board, int *blackPlaysFirst, char *fen, Boolean autoSize) if (i != 0 && i != BOARD_HEIGHT-1) return FALSE; // only on back-rank board[i][(j++)+gameInfo.holdingsWidth] = ClearBoard; p++; subst++; // placeHolder } else if (*p == '+' || isalpha(*p)) { + char *q, *s = SUFFIXES; if (j >= gameInfo.boardWidth) return FALSE; if(*p=='+') { - piece = CharToPiece(*++p); + char c = *++p; + if(q = strchr(s, p[1])) p++; + piece = CharToPiece(c + (q ? 64*(q - s + 1) : 0)); if(piece == EmptySquare) return FALSE; /* unknown piece */ piece = (ChessSquare) (CHUPROMOTED piece ); p++; if(PieceToChar(piece) != '+') return FALSE; /* unpromotable piece */ - } else piece = CharToPiece(*p++); + } else { + char c = *p++; + if(q = strchr(s, *p)) p++; + piece = CharToPiece(c + (q ? 64*(q - s + 1) : 0)); + } if(piece==EmptySquare) return FALSE; /* unknown piece */ if(*p == '~') { /* [HGM] make it a promoted piece for Crazyhouse */