X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Fbook.c;h=83c9ef2aa271b75320ffaff3ba537cb688629283;hb=5bc9cec9b7ff92d624805e898f470d0952626c5f;hp=423749f89d47e8b9c3c3ed17e7bb57ee30cdf0a3;hpb=96253e9fec23f465f064dfbe1ae469d03c1d3267;p=gnushogi.git diff --git a/gnushogi/book.c b/gnushogi/book.c index 423749f..83c9ef2 100644 --- a/gnushogi/book.c +++ b/gnushogi/book.c @@ -569,42 +569,39 @@ static USHORT ltsimp(long x) /* #define HashValue(l) lts(l) */ #define HashValue(l) (USHORT)(l & 0xffff) - static int gfd; -static ULONG currentoffset; - #define MAXOFFSET(B) ((B.booksize - 1) * sizeof_gdxdata + sizeof_gdxadmin) -#define HashOffset(hashkey, B) \ -{ \ - currentoffset = ((ULONG)hashkey % B.booksize) \ - * sizeof_gdxdata + sizeof_gdxadmin; \ +static ULONG HashOffset(ULONG hashkey, struct gdxadmin *B) +{ + return (hashkey % B->booksize) * sizeof_gdxdata + sizeof_gdxadmin; } -#define NextOffset(B) \ -{ \ - currentoffset += sizeof_gdxdata; \ - if (currentoffset > B.maxoffset) \ - currentoffset = sizeof_gdxadmin; \ +static ULONG NextOffset(struct gdxadmin *B, ULONG offset) +{ + offset += sizeof_gdxdata; + if (offset > B->maxoffset) + offset = sizeof_gdxadmin; + return offset; } -#define WriteAdmin() \ -{ \ - lseek(gfd, 0, SEEK_SET); \ - write(gfd, (char *)&ADMIN, sizeof_gdxadmin); \ +static void WriteAdmin(void) +{ + lseek(gfd, 0, SEEK_SET); + write(gfd, (char *)&ADMIN, sizeof_gdxadmin); } -#define WriteData() \ -{ \ - if (mustwrite ) \ - { \ - lseek(gfd, currentoffset, SEEK_SET); \ - write(gfd, (char *)&DATA, sizeof_gdxdata); \ - mustwrite = false; \ - } \ +static void WriteData(ULONG offset, int *mustwrite) +{ + if (!*mustwrite) + return; + + lseek(gfd, offset, SEEK_SET); + write(gfd, (char *)&DATA, sizeof_gdxdata); + *mustwrite = false; } static int ReadAdmin(void) @@ -613,9 +610,9 @@ static int ReadAdmin(void) return (sizeof_gdxadmin == read(gfd, (char *)&ADMIN, sizeof_gdxadmin)); } -static int ReadData(struct gdxdata *DATA) +static int ReadData(ULONG offset, struct gdxdata *DATA) { - lseek(gfd, currentoffset, SEEK_SET); + lseek(gfd, offset, SEEK_SET); return (sizeof_gdxdata == read(gfd, (char *)DATA, sizeof_gdxdata)); } @@ -639,6 +636,7 @@ static int ReadData(struct gdxdata *DATA) void GetOpenings(void) { + ULONG currentoffset = 0; short i; int mustwrite = false, first; unsigned short side; @@ -736,13 +734,13 @@ GetOpenings(void) * exist from some other opening. */ - WriteData(); - HashOffset(bhashkey, B); + WriteData(currentoffset, &mustwrite); + currentoffset = HashOffset(bhashkey, &B); first = true; while (true) { - if (!ReadData(&DATA)) + if (!ReadData(currentoffset, &DATA)) break; /* corrupted binbook file */ if (DATA.bmove == 0) @@ -774,12 +772,12 @@ GetOpenings(void) { DATA.flags &= (~LASTMOVE); mustwrite = true; - WriteData(); + WriteData(currentoffset, &mustwrite); } } } - NextOffset(B); + currentoffset = NextOffset(&B, currentoffset); first = false; } @@ -821,14 +819,14 @@ GetOpenings(void) { /* reset for next opening */ games++; - WriteData(); + WriteData(currentoffset, &mustwrite); RESET(); i = 0; side = black; } } - WriteData(); + WriteData(currentoffset, &mustwrite); fclose(fd); /* write admin rec with counts */ ADMIN.bookcount = B.bookcount; @@ -898,6 +896,7 @@ GetOpenings(void) int OpeningBook(unsigned short *hint) { + ULONG currentoffset; unsigned short r, m; int possibles = TrPnt[2] - TrPnt[1]; @@ -923,14 +922,14 @@ OpeningBook(unsigned short *hint) } x = 0; - HashOffset(hashkey, B); + currentoffset = HashOffset(hashkey, &B); #ifdef BOOKTEST printf("looking for book move, bhashbd = 0x%lx bhashkey = 0x%x\n", (ULONG)hashbd, HashValue(hashkey)); #endif while (true) { - if (!ReadData(&OBB[x])) + if (!ReadData(currentoffset, &OBB[x])) break; if (OBB[x].bmove == 0) @@ -949,7 +948,7 @@ OpeningBook(unsigned short *hint) break; } - NextOffset(B); + currentoffset = NextOffset(&B, currentoffset); } #ifdef BOOKTEST