Implement XBoard memory command
[gnushogi.git] / gnushogi / commondsp.c
index 4a2aa7f..4cdc459 100644 (file)
@@ -1493,8 +1493,8 @@ SetMachineTime(char *time)
  * the hint move, then set Sdepth to zero.
  */
 
-void
-InputCommand(char *command)
+int
+InputCommand(char *command, int root)
 {
 #ifdef QUIETBACKGROUND
     short have_shown_prompt = false;
@@ -1502,6 +1502,7 @@ InputCommand(char *command)
     short ok, done, is_move = false;
     unsigned short mv;
     char s[80], sx[80];
+    static char backlog[80];
 
     ok = flag.quit = done = false;
     player = opponent;
@@ -1511,7 +1512,7 @@ InputCommand(char *command)
         ZeroTTable();
 #endif
 
-    if ((hint > 0) && !flag.easy && !flag.force)
+    if ((hint > 0) && !flag.easy && !flag.force && !command && !backlog[0] && root)
     {
         /*
          * A hint move for the player is available.  Compute a move for the
@@ -1575,6 +1576,10 @@ InputCommand(char *command)
     {
         player = opponent;
 
+        if (flag.analyze && !command && !backlog[0] && root) {
+            SelectMove(opponent, BACKGROUND_MODE);
+        }
+
 #ifdef QUIETBACKGROUND
         if (!have_shown_prompt)
         {
@@ -1588,12 +1593,15 @@ InputCommand(char *command)
         have_shown_prompt = false;
 #endif /* QUIETBACKGROUND */
 
+        if (!command && backlog[0]) command = backlog; /* pick up backlogged command */
+
         if (command == NULL) {
             int eof = dsp->GetString(sx);
             if (eof)
                 dsp->ExitShogi();
         } else {
             strcpy(sx, command);
+            backlog[0]= '\0'; /* make sure no backlog is left */
             done = true;
         }
 
@@ -1601,6 +1609,12 @@ InputCommand(char *command)
         if (sscanf(sx, "%s", s) < 1)
             continue;
 
+        if (!root && strcmp(s, "."))
+        {   /* during search most commands can only be done after abort */
+            strcpy(backlog, sx); /* backlog the command    */
+            return true;         /* and order search abort */
+        }
+
         if (strcmp(s, "bd") == 0)   /* bd -- display board */
         {
             /* FIXME: Hack alert! */
@@ -1623,6 +1637,12 @@ InputCommand(char *command)
         {
             flag.post = 0;
         }
+#ifdef MINISHOGI
+        else if (strcmp(s, "variant") == 0)
+        {   /* only variant we play is minishogi */
+            printf("setup (P.BR.S...G.+.++.+Kp.br.s...g.+.++.+k) 5x5+5_shogi rbsgk/4p/5/P4/KGSBR [-] w 0 1\n");
+        }
+#endif
         else if (strcmp(s, "alg") == 0 ||
                  strcmp(s, "accepted") == 0 || strcmp(s, "rejected") == 0 ||
                  strcmp(s, "variant") == 0 || strcmp(s, "computer") == 0)
@@ -1630,7 +1650,7 @@ InputCommand(char *command)
             /* noop */ ;
         }
         else if ((strcmp(s, "quit") == 0) ||
-                 (strcmp(s, "exit") == 0))
+                 (strcmp(s, "exit") == 0) && !xboard)
         {
             flag.quit = true;
         }
@@ -1642,13 +1662,41 @@ InputCommand(char *command)
         }
         else if (strcmp(s, "protover") == 0)
         {
-            printf("feature myname=\"GNU %sShogi %s\" variants=\"%sshogi\" debug=1 setboard=0 sigint=0 done=1\n",
+            printf("feature myname=\"GNU %s %s\" ",
 #ifdef MINISHOGI
-                                       "mini", PACKAGE_VERSION, "5x5+5_"
+                   "MiniShogi",
 #else
-                                         "",   PACKAGE_VERSION, ""
+                   "Shogi",
 #endif
-                  );
+                   PACKAGE_VERSION
+                );
+            printf("variants=\"%s\" ",
+#ifdef MINISHOGI
+                   "5x5+5_shogi,minishogi"
+#else
+                   "shogi"
+#endif
+                );
+            printf("debug=1 setboard=0 sigint=0 memory=1 done=1\n");
+        }
+        else if (strcmp(s, ".") == 0)
+        {   // periodic update request of analysis info: send stat01 info
+            ElapsedTime(2);
+            algbr((short)(currentMove >> 8), (short)(currentMove & 0xFF), 0);
+            printf("stat01: %4ld %8ld %2d %2d %2d %s\n",
+                    et, NodeCnt, Sdepth, movesLeft, TrPnt[2]-TrPnt[1], mvstr[0]);
+            fflush(stdout);
+            if (!root) return false; /* signal no abort needed */
+        }
+        else if (strcmp(s, "exit") == 0)
+        {
+            flag.analyze = false;
+            flag.force = true;
+        }
+        else if (strcmp(s, "analyze") == 0)
+        {
+            flag.analyze = true;
+            flag.force = true;
         }
         else if ((strcmp(s, "set") == 0) ||
                  (strcmp(s, "edit") == 0))
@@ -1663,6 +1711,17 @@ InputCommand(char *command)
         {
             ok = true;
         }
+#if ttblsz
+        else if (strcmp(s, "memory") == 0)
+        {
+            unsigned int mem, size, t = 1;
+            sscanf(sx, "memory %d", &mem);
+            if(mem > 2048) mem = 2048; /* prevent integer overflow for > 2GB hash */
+            size = (mem << 20) / sizeof(struct hashentry) - rehash;
+            while(t <= size/4) t <<= 1;
+            AllocateTT(t);
+        }
+#endif
         else if (strcmp(s, "go") == 0)
         {
             ok = true;
@@ -2000,4 +2059,6 @@ InputCommand(char *command)
                    ++mycnt2, s, TimeControl.clock[player] * 10);
         }
     }
+
+    return true;
 }