Book: replace Write* macros with functions.
[gnushogi.git] / gnushogi / book.c
index 88d21be..0e95607 100644 (file)
@@ -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,9 +359,7 @@ RESET(void)
 }
 
 
-
-static
-int
+static int
 Vparse (FILE * fd, USHORT *mv, USHORT *flags, int moveno)
 {
     int c, i;
@@ -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));
 }
 
@@ -741,8 +735,8 @@ GetOpenings(void)
                              * exist from some other opening.
                              */
 
-                            WriteData();
-                            HashOffset(bhashkey, B);
+                            WriteData(&mustwrite);
+                            HashOffset(bhashkey, &B);
                             first = true;
 
                             while (true)
@@ -779,12 +773,12 @@ GetOpenings(void)
                                         {
                                             DATA.flags &= (~LASTMOVE);
                                             mustwrite = true;
-                                            WriteData();
+                                            WriteData(&mustwrite);
                                         }
                                     }
                                 }
 
-                                NextOffset(B);
+                                NextOffset(&B);
                                 first = false;
                             }
 
@@ -826,14 +820,14 @@ GetOpenings(void)
                 {
                     /* reset for next opening */
                     games++;
-                    WriteData();
+                    WriteData(&mustwrite);
                     RESET();
                     i = 0;
                     side = black;
                 }
             }
 
-            WriteData();
+            WriteData(&mustwrite);
             fclose(fd);
             /* write admin rec with counts */
             ADMIN.bookcount = B.bookcount;
@@ -888,7 +882,6 @@ GetOpenings(void)
 }
 
 
-
 /*
  * OpeningBook(hint)
  *
@@ -929,7 +922,7 @@ OpeningBook(unsigned short *hint)
         }
 
         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));
@@ -955,7 +948,7 @@ OpeningBook(unsigned short *hint)
                     break;
             }
 
-            NextOffset(B);
+            NextOffset(&B);
         }
 
 #ifdef BOOKTEST
@@ -1053,6 +1046,3 @@ OpeningBook(unsigned short *hint)
     Book--;
     return false;
 }
-
-
-