Change ElapsedTime to a normal display function.
[gnushogi.git] / gnushogi / search.c
index 3d49b8b..1491057 100644 (file)
@@ -14,8 +14,8 @@
  *
  * GNU Shogi is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 1, or (at your option) any
- * later version.
+ * Free Software Foundation; either version 3 of the License,
+ * or (at your option) any later version.
  *
  * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  * for more details.
  *
  * You should have received a copy of the GNU General Public License along
- * with GNU Shogi; see the file COPYING.  If not, write to the Free
- * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * with GNU Shogi; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
  * ----------------------------------------------------------------------
  *
  */
 
 #include "gnushogi.h"
+#include <poll.h>
+#include <unistd.h>
 
 #if !defined OLDTIME && defined HAVE_GETTIMEOFDAY
 double pow(double x, double y);
@@ -176,6 +178,7 @@ SelectMove(short side, SelectMove_mode iop)
     }
     else
     {
+        background = false; /* [HGM] with ponder on we did not switch back to foreground mode??? */
         player = side;
         SetResponseTime(side);
     }
@@ -529,6 +532,8 @@ search(short side,
     short best = -(SCORE_LIMIT + 3000);
     short bestwidth = 0;
     short mustcut;
+    static struct pollfd pollfds[1] = { /* [0] = */ { /* .fd = */ STDIN_FILENO,
+                                                      /* .events = */ POLLIN } };
 
 #ifdef NULLMOVE
     short PVsave;
@@ -546,6 +551,19 @@ search(short side,
         {
             ElapsedTime(COMPUTE_MODE);
 
+            if(background) {
+                int cnt = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 0);
+                if (cnt < 0) {
+                    perror("polling standard input");
+                    ExitShogi();
+                }
+                if (cnt) { /* if anything to read, or error occured */
+                    if (!flag.timeout)
+                        flag.back = true; /* previous: flag.timeout = true; */
+                    flag.bothsides = false;
+                }
+            }
+
             if (flag.back)
             {
                 flag.back = false;
@@ -884,7 +902,7 @@ search(short side,
 
             MakeMove(side, node, &tempb, &tempc, &tempsf,
                      &tempst, &INCscore);
-            CptrFlag[ply] = (node->flags & capture);
+            CptrFlag[ply] = ((node->flags & capture) != 0);
             TesujiFlag[ply] = (node->flags & tesuji)
                 && (node->flags & dropmask);
             Tscore[ply] = node->score;