Add forgotten files 1.4.70b
[polyglot.git] / mainloop.cpp
1 // mainloop.cpp\r
2 \r
3 // constants\r
4 \r
5 static const int StringSize = 4096;\r
6 \r
7 // includes\r
8 \r
9 #include <cerrno>\r
10 #include <cstdio>\r
11 #include <cstdlib>\r
12 #include <cstring>\r
13 \r
14 #ifndef _WIN32\r
15 #include <sys/select.h>\r
16 #include <sys/types.h> // Mac OS X needs this one\r
17 #include <unistd.h>\r
18 #endif\r
19 \r
20 #include "main.h"\r
21 #include "engine.h"\r
22 #include "gui.h"\r
23 #include "option.h"\r
24 #include "xboard2uci.h"\r
25 #include "uci2uci.h"\r
26 \r
27 // prototypes\r
28 \r
29 static void mainloop_init            ();\r
30 static void mainloop_wait_for_event  ();\r
31 static void mainloop_engine_step(char * string);\r
32 static void mainloop_gui_step(char * string);\r
33 \r
34 // functions\r
35 \r
36 // mainloop_init()\r
37     \r
38 static void mainloop_init(){\r
39     if(!option_get_bool("UCI")){\r
40         xboard2uci_init();  // the default\r
41     }\r
42 }\r
43 \r
44 // mainloop_engine_step()\r
45 \r
46 static void mainloop_engine_step(char * string){\r
47     if(option_get_bool("UCI")){\r
48         uci2uci_engine_step(string); \r
49     }else{\r
50         xboard2uci_engine_step(string);\r
51     }\r
52 }\r
53 \r
54 // mainloop_gui_step()\r
55 \r
56 static void mainloop_gui_step(char * string){\r
57     if(option_get_bool("UCI")){\r
58         uci2uci_gui_step(string); \r
59     }else if(my_string_equal(string,"uci")){ // mode auto detection\r
60         my_log("POLYGLOT *** Switching to UCI mode ***\n");\r
61         option_set("UCI","true");\r
62         uci2uci_gui_step(string);\r
63     }else{\r
64         xboard2uci_gui_step(string);\r
65     }\r
66 }\r
67 \r
68 // mainloop()\r
69 \r
70 void mainloop() {\r
71     char string[StringSize];\r
72     mainloop_init();\r
73     while (!engine_eof(Engine)) {\r
74             // process buffered lines\r
75         while(TRUE){\r
76             if(gui_get_non_blocking(GUI,string,StringSize)){\r
77                 mainloop_gui_step(string);\r
78             }else if(!engine_eof(Engine) &&\r
79                      engine_get_non_blocking(Engine,string,StringSize) ){\r
80                 mainloop_engine_step(string);\r
81             }else{\r
82                 break;\r
83             }\r
84         }\r
85         mainloop_wait_for_event();\r
86     }\r
87     my_log("POLYGLOT *** Mainloop has ended ***\n");\r
88     // This should be handled better.\r
89     engine_close(Engine);\r
90     my_log("POLYGLOT Calling exit\n");\r
91     exit(EXIT_SUCCESS);\r
92 \r
93 }\r
94 \r
95 \r
96 \r
97 \r
98 // mainloop_wait_for_event()\r
99 \r
100 static void mainloop_wait_for_event(){\r
101 #ifdef _WIN32\r
102     HANDLE hHandles[2];\r
103     char string[StringSize];\r
104     hHandles[0]=(GUI->io).hEvent;\r
105     hHandles[1]=(Engine->io).hEvent;\r
106     WaitForMultipleObjects(2,               // count\r
107                            hHandles,        //\r
108                            FALSE,           // return if one object is signaled\r
109                            INFINITE         // no timeout\r
110                            );\r
111 #else\r
112    fd_set set[1];\r
113    int fd_max;\r
114    int val;\r
115    char string[StringSize];\r
116    // init\r
117 \r
118    FD_ZERO(set);\r
119    fd_max = -1; // HACK\r
120 \r
121    // add gui input\r
122 \r
123    ASSERT(GUI->io->in_fd>=0);\r
124 \r
125    FD_SET(GUI->io->in_fd,set);\r
126    if (GUI->io->in_fd > fd_max) fd_max = GUI->io->in_fd;\r
127 \r
128    // add engine input\r
129 \r
130    ASSERT(Engine->io->in_fd>=0);\r
131 \r
132    FD_SET(Engine->io->in_fd,set);\r
133    if (Engine->io->in_fd > fd_max) fd_max = Engine->io->in_fd;\r
134 \r
135    // wait for something to read (no timeout)\r
136 \r
137    ASSERT(fd_max>=0);\r
138    val = select(fd_max+1,set,NULL,NULL,NULL);\r
139    if (val == -1 && errno != EINTR) my_fatal("adapter_step(): select(): %s\n",strerror(errno));\r
140 \r
141    if (val > 0) {\r
142       if (FD_ISSET(GUI->io->in_fd,set)) io_get_update(GUI->io); // read some xboard input\r
143       if (FD_ISSET(Engine->io->in_fd,set)) io_get_update(Engine->io); // read some engine input\r
144    }    \r
145 #endif\r
146 }\r
147 \r
148 \r
149 \r