X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=book.c;h=a5aa6ab5084f597694994dfdbe598fcfaaf23b87;hb=c4545166b97f99043e21f352e1439af355da5d32;hp=3a764b9dde63ff61f8b4ebddc7f24b3a244413c1;hpb=0d4aa8b0a16c1ee2bcaf4120ef37ba4d1492206e;p=xboard.git diff --git a/book.c b/book.c index 3a764b9..a5aa6ab 100644 --- a/book.c +++ b/book.c @@ -36,6 +36,7 @@ #include "common.h" #include "backend.h" +#include "moves.h" #ifdef _MSC_VER typedef unsigned __int64 uint64; @@ -277,6 +278,23 @@ uint64 hash(int moveNr) { int r, f, p_enc, squareNr, pieceGroup; uint64 key=0, holdingsKey=0, Zobrist; + VariantClass v = gameInfo.variant; + + switch(v) { + case VariantNormal: + case VariantFischeRandom: // compatible with normal + case VariantNoCastle: + case VariantXiangqi: // for historic reasons; does never collide anyway because of other King type + break; + case VariantGiveaway: // in opening same as suicide + key += VariantSuicide; + break; + case VariantGothic: // these are special cases of CRC, and can share book + case VariantCapablanca: + v = VariantCapaRandom; + default: + key += v; // variant type incorporated in key to allow mixed books without collisions + } for(f=0; f= 2*appData.bookDepth) return -1; // if(gameInfo.variant != VariantNormal) return -1; // Zobrist scheme only works for normal Chess, so far - f=fopen(book,"rb"); + if(!f || strcmp(book, curBook)){ // keep book file open until book changed + strncpy(curBook, book, MSG_SIZ); + if(f) fclose(f); + f = fopen(book,"rb"); + } if(!f){ DisplayError("Polyglot book not valid", 0); appData.usePolyglotBook = FALSE; @@ -488,7 +511,6 @@ int GetBookMoves(int moveNr, char *book, entry_t entries[]) offset=find_key(f, key, &entry); if(entry.key != key) { - fclose(f); return FALSE; } entries[0] = entry; @@ -505,7 +527,6 @@ int GetBookMoves(int moveNr, char *book, entry_t entries[]) if(count == MOVE_BUF) break; entries[count++] = entry; } - fclose(f); return count; } @@ -533,6 +554,7 @@ char *ProbeBook(int moveNr, char *book) for(i=0; i> 12; // create random < total_weight total_weight = 0; for(i=0; i writepos) { + fseek(f, readpos, SEEK_SET); + readpos += len1 = fread(buf1, 1, 4096, f); + } else len1 = 0; // wrote already past old EOF fseek(f, writepos, SEEK_SET); fwrite(buf2, 1, len2, f); writepos += len2; @@ -679,3 +704,4 @@ void SaveToBook(char *text) } fclose(f); } +