* ----------------------------------------------------------------------
* Copyright (c) 1993, 1994, 1995 Matthias Mutz
* Copyright (c) 1999 Michael Vanier and the Free Software Foundation
+ * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation
*
* GNU SHOGI is based on GNU CHESS
*
* Generate move strings in different formats.
*/
-void
+static void
Balgbr(short f, short t, short flag)
{
short promoted = false;
short piece = flag & pmask;
bmvstr[0][0] = pxx[piece];
bmvstr[0][1] = '*';
- bmvstr[0][2] = cxx[column(t)];
- bmvstr[0][3] = rxx[row(t)];
+ bmvstr[0][2] = COL_NAME(column(t));
+ bmvstr[0][3] = ROW_NAME(row(t));
bmvstr[0][4] = bmvstr[2][0] = '\0';
strcpy(bmvstr[1], bmvstr[0]);
bmvstr[1][1] = '\'';
/* algebraic notation */
/* bmvstr[0]: 7g7f bmvstr[1]:
* (+)P7g7f(+) bmvstr[2]: (+)P7f(+) */
- bmvstr[0][0] = cxx[column(f)];
- bmvstr[0][1] = rxx[row(f)];
- bmvstr[0][2] = cxx[column(t)];
- bmvstr[0][3] = rxx[row(t)];
+ bmvstr[0][0] = COL_NAME(column(f));
+ bmvstr[0][1] = ROW_NAME(row(f));
+ bmvstr[0][2] = COL_NAME(column(t));
+ bmvstr[0][3] = ROW_NAME(row(t));
bmvstr[0][4] = '\0';
if (promoted)
}
-
-
#ifndef QUIETBOOKGEN
-void
+static void
bkdisplay(char *s, int cnt, int moveno)
{
static short pnt;
}
#endif /* SEMIQUIETBOOKGEN */
}
-
#endif /* QUIETBOOKGEN */
-
/*
* BVerifyMove(s, mv, moveno)
*
* opponent. If a match is found, make the move on the board.
*/
-int
+static int
BVerifyMove(char *s, unsigned short *mv, int moveno)
{
static short pnt, tempb, tempc, tempsf, tempst, cnt;
UnmakeMove(opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
/* Illegal move in check */
#if !defined QUIETBOOKGEN
- /* 077: "Illegal move (in check) %s" */
- puts(CP[77]);
+ puts("Illegal move (in check): %s");
bkdisplay(s, cnt, moveno);
#endif
return false;
/* Illegal move */
#if !defined QUIETBOOKGEN
- /* 075: "Illegal move (no match)%s\n" */
- printf(CP[75], s);
+ printf("Illegal move (no match): %s\n", s);
bkdisplay(s, cnt, moveno);
#endif
return false;
}
-
-
/*
* RESET()
*
*
*/
-void
+static void
RESET(void)
{
short l;
- flag.illegal = flag.mate = flag.post = flag.quit
+ flag.illegal = flag.mate = flag.quit
= flag.reverse = flag.bothsides = flag.onemove = flag.force
= false;
+ flag.post &= xboard; /* [HGM] xboard: do not clear in XBoard mode */
+
flag.material = flag.coords = flag.hash = flag.easy
= flag.beep = flag.rcptr
= true;
}
-
-static
-int
-Vparse (FILE * fd, USHORT *mv, USHORT *flags, USHORT side, int moveno)
+static int
+Vparse (FILE * fd, USHORT *mv, USHORT *flags, int moveno)
{
int c, i;
char s[255];
/* #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;
- unsigned short xside, side;
+ int first;
+ unsigned short side;
short c;
USHORT mv, flags;
unsigned int x;
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;
- xside = white;
hashbd = hashkey = 0;
i = 0;
- while ((c = Vparse(fd, &mv, &flags, side, i)) >= 0)
+ while ((c = Vparse(fd, &mv, &flags, i)) >= 0)
{
if (c == 1)
{
* 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;
}
computer = opponent;
opponent = computer ^ 1;
- xside = side;
side = side ^ 1;
}
else if (i > 0)
{
/* reset for next opening */
games++;
- WriteData();
+ WriteData(currentoffset, &mustwrite);
RESET();
i = 0;
side = black;
- xside = white;
-
}
}
- WriteData();
+ WriteData(currentoffset, &mustwrite);
fclose(fd);
/* write admin rec with counts */
ADMIN.bookcount = B.bookcount;
}
- /* 213: "Book used %d(%d)." */
- sprintf(msg, CP[213], B.bookcount, B.booksize);
- ShowMessage(msg);
+ sprintf(msg, "Book used %lu(%lu).", B.bookcount, B.booksize);
+ dsp->ShowMessage(msg);
}
/* Set everything back to start the game. */
/* Now get ready to play .*/
if (!B.bookcount)
{
- /* 212: "Can't find book." */
- ShowMessage(CP[212]);
+ dsp->ShowMessage("Can't find book.");
Book = 0;
}
}
-
/*
- * OpeningBook(hint, side)
+ * OpeningBook(hint)
*
* Go through each of the opening lines of play and check for a match with
* the current game listing. If a match occurs, generate a random
*/
int
-OpeningBook(unsigned short *hint, short side)
+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
Book--;
return false;
}
-
-
-