Implement pondering on position / analysis
[hachu.git] / hachu.c
diff --git a/hachu.c b/hachu.c
index 478a20b..0b06fbb 100644 (file)
--- a/hachu.c
+++ b/hachu.c
 \r
 #ifdef WIN32 \r
 #    include <windows.h>\r
+     int InputWaiting()\r
+     {  // checks for waiting input in pipe\r
+       static int pipe, init;\r
+       static HANDLE inp;\r
+       DWORD cnt;\r
+\r
+       if(!init) inp = GetStdHandle(STD_INPUT_HANDLE);\r
+       if(!PeekNamedPipe(inp, NULL, 0, NULL, &cnt, NULL)) return 1;\r
+       return cnt;\r
+    }\r
 #else\r
 #    include <sys/time.h>\r
+#    include <sys/ioctl.h>\r
+     int InputWaiting()\r
+     {\r
+       int cnt;\r
+       if(ioctl(0, FIONREAD, &cnt)) return 1;\r
+       return cnt;\r
+     }\r
      int GetTickCount() // with thanks to Tord\r
      { struct timeval t;\r
        gettimeofday(&t, NULL);\r
@@ -1836,7 +1853,7 @@ if(PATH) printf("%d:%2d:%d %3d %6x %-10s %6d %6d\n", level, depth, iterDep, curM
        printf("\n");\r
         fflush(stdout);\r
       }\r
-      if(GetTickCount() - startTime > tlim1) break; // do not start iteration we can (most likely) not finish\r
+      if(!(abortFlag & 1) && GetTickCount() - startTime > tlim1) break; // do not start iteration we can (most likely) not finish\r
     }\r
     replyDep = iterDep;\r
 #ifdef HASH\r
@@ -2244,6 +2261,9 @@ MapFromScratch(attacks);
 void\r
 PonderUntilInput (int stm)\r
 {\r
+MapFromScratch(attacks);\r
+  repCnt = 0; abortFlag = -1;\r
+  Search(-INF-1, INF+1, rootEval, maxDepth, sup1, sup2);\r
 }\r
  \r
     int TakeBack(int n)\r
@@ -2280,6 +2300,7 @@ printf("# setup done");fflush(stdout);
         if(!strcmp(command, "put"))     { ReadSquare(inBuf+4, &lastPut); continue; }  // ditto\r
         if(!strcmp(command, "."))       { inBuf[0] = 0; return; } // ignore for now\r
         if(!strcmp(command, "lift"))    { inBuf[0] = 0; Highlight(inBuf+5); return; } // treat here\r
+        abortFlag = 1;\r
         return;\r
       }\r
     }\r
@@ -2287,7 +2308,11 @@ printf("# setup done");fflush(stdout);
     void\r
     TerminationCheck()\r
     {\r
+      if(abortFlag < 0) { // check for input\r
+        if(InputWaiting()) GetLine(0); // read & examine input command\r
+      } else {        // check for time\r
         if(GetTickCount() - startTime > tlim3) abortFlag = 2;\r
+      }\r
     }\r
 \r
     main()\r