X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Fbook.c;h=0e9560783658aa73f9cd5ab7f02f9d0891c35c9e;hb=8e08526b483296c7c932521fa9307ef0ee48f259;hp=727ae55ebd8e200981e9b1df29ecb95fccb1cab8;hpb=9da823015c78c8e9131cf76f14598a1071d29192;p=gnushogi.git diff --git a/gnushogi/book.c b/gnushogi/book.c index 727ae55..0e95607 100644 --- a/gnushogi/book.c +++ b/gnushogi/book.c @@ -4,6 +4,7 @@ * ---------------------------------------------------------------------- * 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 * @@ -72,7 +73,7 @@ static ULONG bhashkey; * Generate move strings in different formats. */ -void +static void Balgbr(short f, short t, short flag) { short promoted = false; @@ -116,8 +117,8 @@ Balgbr(short f, short t, short flag) 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] = '\''; @@ -129,10 +130,10 @@ Balgbr(short f, short t, short flag) /* 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) @@ -165,10 +166,8 @@ Balgbr(short f, short t, short flag) } - - #ifndef QUIETBOOKGEN -void +static void bkdisplay(char *s, int cnt, int moveno) { static short pnt; @@ -239,11 +238,9 @@ bkdisplay(char *s, int cnt, int moveno) } #endif /* SEMIQUIETBOOKGEN */ } - #endif /* QUIETBOOKGEN */ - /* * BVerifyMove(s, mv, moveno) * @@ -251,7 +248,7 @@ bkdisplay(char *s, int cnt, int 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; @@ -292,7 +289,7 @@ BVerifyMove(char *s, unsigned short *mv, int moveno) UnmakeMove(opponent, &xnode, &tempb, &tempc, &tempsf, &tempst); /* Illegal move in check */ #if !defined QUIETBOOKGEN - puts("Illegal move (in check) %s"); + puts("Illegal move (in check): %s"); bkdisplay(s, cnt, moveno); #endif return false; @@ -312,15 +309,13 @@ BVerifyMove(char *s, unsigned short *mv, int moveno) /* Illegal move */ #if !defined QUIETBOOKGEN - printf("Illegal move (no match) %s\n", s); + printf("Illegal move (no match): %s\n", s); bkdisplay(s, cnt, moveno); #endif return false; } - - /* * RESET() * @@ -328,15 +323,17 @@ BVerifyMove(char *s, unsigned short *mv, int moveno) * */ -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; @@ -362,10 +359,8 @@ RESET(void) } - -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]; @@ -581,46 +576,45 @@ 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 void HashOffset(ULONG hashkey, struct gdxadmin *B) +{ + currentoffset = (hashkey % B->booksize) * sizeof_gdxdata + sizeof_gdxadmin; } -#define NextOffset(B) \ -{ \ - currentoffset += sizeof_gdxdata; \ - if (currentoffset > B.maxoffset) \ - currentoffset = sizeof_gdxadmin; \ +static void NextOffset(struct gdxadmin *B) +{ + currentoffset += sizeof_gdxdata; + if (currentoffset > B->maxoffset) + currentoffset = sizeof_gdxadmin; } -#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(int *mustwrite) +{ + if (*mustwrite) + { + lseek(gfd, currentoffset, 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) { - lseek(gfd, currentoffset, 0); + lseek(gfd, currentoffset, SEEK_SET); return (sizeof_gdxdata == read(gfd, (char *)DATA, sizeof_gdxdata)); } @@ -646,7 +640,7 @@ GetOpenings(void) { short i; int mustwrite = false, first; - unsigned short xside, side; + unsigned short side; short c; USHORT mv, flags; unsigned int x; @@ -715,11 +709,10 @@ GetOpenings(void) { /* 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) { @@ -742,8 +735,8 @@ GetOpenings(void) * exist from some other opening. */ - WriteData(); - HashOffset(bhashkey, B); + WriteData(&mustwrite); + HashOffset(bhashkey, &B); first = true; while (true) @@ -780,12 +773,12 @@ GetOpenings(void) { DATA.flags &= (~LASTMOVE); mustwrite = true; - WriteData(); + WriteData(&mustwrite); } } } - NextOffset(B); + NextOffset(&B); first = false; } @@ -821,23 +814,20 @@ GetOpenings(void) computer = opponent; opponent = computer ^ 1; - xside = side; side = side ^ 1; } else if (i > 0) { /* reset for next opening */ games++; - WriteData(); + WriteData(&mustwrite); RESET(); i = 0; side = black; - xside = white; - } } - WriteData(); + WriteData(&mustwrite); fclose(fd); /* write admin rec with counts */ ADMIN.bookcount = B.bookcount; @@ -875,7 +865,7 @@ GetOpenings(void) } - sprintf(msg, "Book used %d(%d).", B.bookcount, B.booksize); + sprintf(msg, "Book used %lu(%lu).", B.bookcount, B.booksize); dsp->ShowMessage(msg); } @@ -892,9 +882,8 @@ GetOpenings(void) } - /* - * 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 @@ -906,7 +895,7 @@ GetOpenings(void) */ int -OpeningBook(unsigned short *hint, short side) +OpeningBook(unsigned short *hint) { unsigned short r, m; int possibles = TrPnt[2] - TrPnt[1]; @@ -933,7 +922,7 @@ OpeningBook(unsigned short *hint, short side) } x = 0; - HashOffset(hashkey, B); + HashOffset(hashkey, &B); #ifdef BOOKTEST printf("looking for book move, bhashbd = 0x%lx bhashkey = 0x%x\n", (ULONG)hashbd, HashValue(hashkey)); @@ -959,7 +948,7 @@ OpeningBook(unsigned short *hint, short side) break; } - NextOffset(B); + NextOffset(&B); } #ifdef BOOKTEST @@ -1057,6 +1046,3 @@ OpeningBook(unsigned short *hint, short side) Book--; return false; } - - -