--- /dev/null
+// 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