version 1.4w10UCIb17
[polyglot.git] / mainloop.cpp
diff --git a/mainloop.cpp b/mainloop.cpp
new file mode 100644 (file)
index 0000000..0d5a8f0
--- /dev/null
@@ -0,0 +1,134 @@
+// mainloop.cpp\r
+\r
+// constants\r
+\r
+static const int StringSize = 4096;\r
+\r
+// includes\r
+\r
+#include <cerrno>\r
+#include <cstdio>\r
+#include <cstdlib>\r
+#include <cstring>\r
+\r
+#ifndef _WIN32\r
+#include <sys/select.h>\r
+#include <sys/types.h> // Mac OS X needs this one\r
+#include <unistd.h>\r
+#endif\r
+\r
+#include "main.h"\r
+#include "engine.h"\r
+#include "gui.h"\r
+#include "option.h"\r
+#include "xboard2uci.h"\r
+#include "uci2uci.h"\r
+\r
+// prototypes\r
+\r
+static void mainloop_step      ();\r
+static void mainloop_init();\r
+static void mainloop_engine_step(char * string);\r
+static void mainloop_gui_step(char * string);\r
+\r
+// mainloop_init()\r
+    \r
+static void mainloop_init(){\r
+    if(!option_get_bool("UCI")){\r
+        xboard_init();\r
+    }\r
+}\r
+\r
+// mainloop_engine_step()\r
+\r
+static void mainloop_engine_step(char * string){\r
+    if(option_get_bool("UCI")){\r
+       uci_engine_step(string); \r
+    }else{\r
+        engine_step(string);\r
+    }\r
+}\r
+\r
+// mainloop_gui_step()\r
+\r
+static void mainloop_gui_step(char * string){\r
+    if(option_get_bool("UCI")){\r
+        uci_gui_step(string); \r
+    }else{\r
+        xboard_step(string);\r
+    }  \r
+}\r
+\r
+\r
+\r
+// mainloop()\r
+\r
+void mainloop() {\r
+    mainloop_init();\r
+    while (!engine_eof(Engine)) mainloop_step();\r
+    my_log("POLYGLOT *** EOF file received from engine ***");\r
+}\r
+\r
+// adapter_step()\r
+\r
+#ifdef _WIN32\r
+static void mainloop_step(){  // polling!\r
+    bool xin,ein;\r
+    char string[StringSize];\r
+    xin=gui_get_non_blocking(GUI,string,StringSize);\r
+    if(xin) mainloop_gui_step(string);\r
+    ein=engine_get_non_blocking(Engine,string,StringSize);\r
+    if(ein) mainloop_engine_step(string);\r
+    if(xin==false && ein==false) Idle();//nobody wants me,lets have a beauty nap\r
+}\r
+#else\r
+static void mainloop_step() {\r
+\r
+   fd_set set[1];\r
+   int fd_max;\r
+   int val;\r
+   char string[StringSize];\r
+\r
+       // process buffered lines\r
+\r
+   while (io_line_ready(GUI->io)){\r
+       gui_get(GUI,string,StringSize);\r
+       mainloop_gui_step(string);\r
+   }\r
+   while (!engine_eof(Engine) && io_line_ready(Engine->io)){\r
+       engine_get(Engine,string,StringSize);\r
+       mainloop_engine_step(string);\r
+   }\r
+\r
+   // init\r
+\r
+   FD_ZERO(set);\r
+   fd_max = -1; // HACK\r
+\r
+   // add xboard input\r
+\r
+   ASSERT(GUI->io->in_fd>=0);\r
+\r
+   FD_SET(GUI->io->in_fd,set);\r
+   if (GUI->io->in_fd > fd_max) fd_max = GUI->io->in_fd;\r
+\r
+   // add engine input\r
+\r
+   ASSERT(Engine->io->in_fd>=0);\r
+\r
+   FD_SET(Engine->io->in_fd,set);\r
+   if (Engine->io->in_fd > fd_max) fd_max = Engine->io->in_fd;\r
+\r
+   // wait for something to read (no timeout)\r
+\r
+   ASSERT(fd_max>=0);\r
+   val = select(fd_max+1,set,NULL,NULL,NULL);\r
+   if (val == -1 && errno != EINTR) my_fatal("adapter_step(): select(): %s\n",strerror(errno));\r
+\r
+   if (val > 0) {\r
+      if (FD_ISSET(GUI->io->in_fd,set)) io_get_update(GUI->io); // read some xboard input\r
+      if (FD_ISSET(Engine->io->in_fd,set)) io_get_update(Engine->io); // read some engine input\r
+   }\r
+}\r
+#endif\r
+\r