/* #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, 0); \
- 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, 0); \
- 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)
{
- lseek(gfd, 0, 0);
+ lseek(gfd, 0, SEEK_SET);
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, 0);
+ 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;
+ int first;
unsigned short side;
short c;
USHORT mv, flags;
DATA.flags = 0;
DATA.hint = 0;
DATA.count = 0;
- write(gfd, (char *)&ADMIN, sizeof_gdxadmin);
+ WriteAdmin();
printf("creating bookfile %s %ld %ld\n",
binbookfile, B.maxoffset, B.booksize);
for (x = 0; x < B.booksize; x++)
{
- write(gfd, (char *)&DATA, sizeof_gdxdata);
+ int mustwrite = true;
+ WriteData(sizeof_gdxadmin + x* sizeof_gdxdata, &mustwrite);
}
}
if (gfd >= 0)
{
+ int mustwrite = false;
/* setvbuf(fd, buffr, _IOFBF, 2048); */
side = black;
hashbd = hashkey = 0;
* 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)
{
DATA.flags &= (~LASTMOVE);
mustwrite = true;
- WriteData();
+ WriteData(currentoffset, &mustwrite);
}
}
}
- NextOffset(B);
+ currentoffset = NextOffset(&B, currentoffset);
first = false;
}
{
/* 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;
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