/* #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)
-static void HashOffset(ULONG hashkey, struct gdxadmin *B)
+static ULONG HashOffset(ULONG hashkey, struct gdxadmin *B)
{
- currentoffset = (hashkey % B->booksize) * sizeof_gdxdata + sizeof_gdxadmin;
+ return (hashkey % B->booksize) * sizeof_gdxdata + sizeof_gdxadmin;
}
-static void NextOffset(struct gdxadmin *B)
+static ULONG NextOffset(struct gdxadmin *B, ULONG offset)
{
- currentoffset += sizeof_gdxdata;
- if (currentoffset > B->maxoffset)
- currentoffset = sizeof_gdxadmin;
+ offset += sizeof_gdxdata;
+ if (offset > B->maxoffset)
+ offset = sizeof_gdxadmin;
+ return offset;
}
write(gfd, (char *)&ADMIN, sizeof_gdxadmin);
}
-static void WriteData(int *mustwrite)
+static void WriteData(ULONG offset, int *mustwrite)
{
if (!*mustwrite)
return;
- lseek(gfd, currentoffset, SEEK_SET);
+ lseek(gfd, offset, SEEK_SET);
write(gfd, (char *)&DATA, sizeof_gdxdata);
*mustwrite = false;
}
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));
}
void
GetOpenings(void)
{
+ ULONG currentoffset = 0;
short i;
int mustwrite = false, first;
unsigned short side;
* exist from some other opening.
*/
- WriteData(&mustwrite);
- 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)
{
DATA.flags &= (~LASTMOVE);
mustwrite = true;
- WriteData(&mustwrite);
+ WriteData(currentoffset, &mustwrite);
}
}
}
- NextOffset(&B);
+ currentoffset = NextOffset(&B, currentoffset);
first = false;
}
{
/* reset for next opening */
games++;
- WriteData(&mustwrite);
+ WriteData(currentoffset, &mustwrite);
RESET();
i = 0;
side = black;
}
}
- WriteData(&mustwrite);
+ WriteData(currentoffset, &mustwrite);
fclose(fd);
/* write admin rec with counts */
ADMIN.bookcount = B.bookcount;
int
OpeningBook(unsigned short *hint)
{
+ ULONG currentoffset;
unsigned short r, m;
int possibles = TrPnt[2] - TrPnt[1];
}
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)
break;
}
- NextOffset(&B);
+ currentoffset = NextOffset(&B, currentoffset);
}
#ifdef BOOKTEST