X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=book.c;h=c40cd925895c6bf42541188e68da96a62aec5c10;hb=7e0222e64da6706bf0dc2468f459b98e4346206b;hp=5c5eea6353e7a6059f3303be33387a6f68ad2e51;hpb=e433631c9b9449829b54526e0d0ebaeec71b270a;p=xboard.git diff --git a/book.c b/book.c index 5c5eea6..c40cd92 100644 --- a/book.c +++ b/book.c @@ -35,7 +35,18 @@ #include #include "common.h" +#include "frontend.h" #include "backend.h" +#include "moves.h" +#include "gettext.h" + +#ifdef ENABLE_NLS +# define _(s) gettext (s) +# define N_(s) gettext_noop (s) +#else +# define _(s) (s) +# define N_(s) s +#endif #ifdef _MSC_VER typedef unsigned __int64 uint64; @@ -43,7 +54,6 @@ typedef unsigned long long int uint64; #endif - #ifdef _MSC_VER # define U64(u) (u##ui64) #else @@ -273,10 +283,28 @@ uint64 *RandomEnPassant =Random64+772; uint64 *RandomTurn =Random64+780; -uint64 hash(int moveNr) +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); + DisplayError(_("Polyglot book not valid"), 0); appData.usePolyglotBook = FALSE; return -1; } @@ -488,7 +525,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,12 +541,12 @@ int GetBookMoves(int moveNr, char *book, entry_t entries[]) if(count == MOVE_BUF) break; entries[count++] = entry; } - fclose(f); return count; } -char *ProbeBook(int moveNr, char *book) -{ // +char * +ProbeBook (int moveNr, char *book) +{ entry_t entries[MOVE_BUF]; int count; int i, j; @@ -533,13 +569,14 @@ char *ProbeBook(int moveNr, char *book) for(i=0; i> 12; // create random < total_weight total_weight = 0; for(i=0; i j) break; } - if(i >= count) DisplayFatalError("Book Fault", 0, 1); // safety catch, cannot happen + if(i >= count) DisplayFatalError(_("Book Fault"), 0, 1); // safety catch, cannot happen move_to_string(move_s, entries[i].move); if(appData.debugMode) fprintf(debugFP, "book move field = %d\n", entries[i].move); @@ -549,7 +586,8 @@ char *ProbeBook(int moveNr, char *book) extern char yy_textstr[]; entry_t lastEntries[MOVE_BUF]; -char *MovesToText(int count, entry_t *entries) +char * +MovesToText (int count, entry_t *entries) { int i, totalWeight = 0; char algMove[6]; @@ -569,7 +607,8 @@ char *MovesToText(int count, entry_t *entries) return p; } -int TextToMoves(char *text, int moveNum, entry_t *entries) +int +TextToMoves (char *text, int moveNum, entry_t *entries) { int i, w, count=0; uint64 hashKey = hash(moveNum); @@ -579,6 +618,7 @@ int TextToMoves(char *text, int moveNum, entry_t *entries) float dummy; int width = BOARD_RGHT - BOARD_LEFT; + entries[0].key = hashKey; // make sure key is returned even if no moves while((i=sscanf(text, "%f%%%d", &dummy, &w))==2 || (i=sscanf(text, "%d", &w))==1) { if(i == 2) text = strchr(text, '%') + 1; // skip percentage if(w == 1) text = strstr(text, "1 ") + 2; // skip weight that could be recognized as move number one @@ -607,7 +647,8 @@ int TextToMoves(char *text, int moveNum, entry_t *entries) Boolean bookUp; int currentCount; -Boolean DisplayBook(int moveNr) +Boolean +DisplayBook (int moveNr) { entry_t entries[MOVE_BUF]; int count; @@ -621,19 +662,22 @@ Boolean DisplayBook(int moveNr) return TRUE; } -void EditBookEvent() +void +EditBookEvent () { bookUp = TRUE; bookUp = DisplayBook(currentMove); } -void int_to_file(FILE *f, int l, uint64 r) +void +int_to_file (FILE *f, int l, uint64 r) { int i; for(i=l-1;i>=0;i--) fputc(r>>8*i & 255, f); } -void entry_to_file(FILE *f, entry_t *entry) +void +entry_to_file (FILE *f, entry_t *entry) { int_to_file(f,8,entry->key); int_to_file(f,2,entry->move); @@ -644,18 +688,19 @@ void entry_to_file(FILE *f, entry_t *entry) char buf1[4096], buf2[4096]; -void SaveToBook(char *text) +void +SaveToBook (char *text) { entry_t entries[MOVE_BUF], entry; int count = TextToMoves(text, currentMove, entries); int offset, i, len1=0, len2, readpos=0, writepos=0; FILE *f; - if(!count) return; + if(!count && !currentCount) return; f=fopen(appData.polyglotBook, "rb+"); - if(!f){ DisplayError("Polyglot book not valid", 0); return; } + if(!f){ DisplayError(_("Polyglot book not valid"), 0); return; } offset=find_key(f, entries[0].key, &entry); - if(entries[0].key != entry.key) { - DisplayError("Hash keys are different", 0); + if(entries[0].key != entry.key && currentCount) { + DisplayError(_("Hash keys are different"), 0); fclose(f); return; } @@ -670,8 +715,10 @@ void SaveToBook(char *text) if(count != currentCount) { do { 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 +726,4 @@ void SaveToBook(char *text) } fclose(f); } +