XBoard: split printing of the features line for clarity.
[gnushogi.git] / gnushogi / tcontrl.c
index 9142d20..2ce4416 100644 (file)
@@ -2,11 +2,15 @@
  * FILE: tcontrl.c
  *
  * ----------------------------------------------------------------------
- *
- * Copyright (c) 2012 Free Software Foundation
+ * 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
  *
+ * Copyright (c) 1988, 1989, 1990 John Stanback
+ * Copyright (c) 1992 Free Software Foundation
+ *
  * This file is part of GNU SHOGI.
  *
  * GNU Shogi is free software; you can redistribute it and/or modify it
@@ -342,5 +346,92 @@ CheckForTimeout(int score, int globalscore, int Jscore, int zwndw)
 #endif
 
     if (flag.timeout)
-        ShowMessage("timeout");
+        dsp->ShowMessage("timeout");
+}
+
+
+/*
+ * Determine the time that has passed since the search was started. If the
+ * elapsed time exceeds the target(ResponseTime + ExtraTime) then set timeout
+ * to true which will terminate the search.
+ * iop = COMPUTE_MODE calculate et, bump ETnodes
+ * iop = COMPUTE_AND_INIT_MODE calculate et, set timeout if time exceeded,
+ *     set reference time
+ */
+void
+ElapsedTime(ElapsedTime_mode iop)
+{
+    long current_time;
+#ifdef HAVE_GETTIMEOFDAY
+    struct timeval tv;
+#endif
+
+    dsp->PollForInput();
+
+#ifdef HAVE_GETTIMEOFDAY
+    gettimeofday(&tv, NULL);
+    current_time = tv.tv_sec*100 + (tv.tv_usec/10000);
+#else
+    et = ((current_time = time((long *) 0)) - time0) * 100;
+#endif
+
+#ifdef INTERRUPT_TEST
+    if (iop == INIT_INTERRUPT_MODE)
+    {
+        itime0 = current_time;
+    }
+    else if (iop == COMPUTE_INTERRUPT_MODE)
+    {
+        it = current_time - itime0;
+    }
+    else
+#endif
+    {
+#ifdef HAVE_GETTIMEOFDAY
+        et = current_time - time0;
+#endif
+        ETnodes = NodeCnt + znodes;
+
+        if (et < 0)
+        {
+#ifdef INTERRUPT_TEST
+            printf("elapsed time %ld not positive\n", et);
+#endif
+            et = 0;
+        }
+
+        if (iop == COMPUTE_AND_INIT_MODE)
+        {
+            if ((et > (ResponseTime + ExtraTime)) && (Sdepth > MINDEPTH))
+                flag.timeout = true;
+
+            time0 = current_time;
+        }
+
+#ifdef QUIETBACKGROUND
+        if (!background)
+#endif
+            dsp->UpdateClocks();
+    }
+}
+
+
+void
+SetTimeControl(void)
+{
+    if (TCflag)
+    {
+        TimeControl.moves[black] = TimeControl.moves[white] = TCmoves;
+        TimeControl.clock[black] += 6000L * TCminutes + TCseconds * 100;
+        TimeControl.clock[white] += 6000L * TCminutes + TCseconds * 100;
+    }
+    else
+    {
+        TimeControl.moves[black] = TimeControl.moves[white] = 0;
+        TimeControl.clock[black] = TimeControl.clock[white] = 0;
+    }
+
+    flag.onemove = (TCmoves == 1);
+    et = 0;
+    ElapsedTime(COMPUTE_AND_INIT_MODE);
 }