5 static const int StringSize = 4096;
\r
15 #include <sys/select.h>
\r
16 #include <sys/types.h> // Mac OS X needs this one
\r
24 #include "xboard2uci.h"
\r
25 #include "uci2uci.h"
\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
38 static void mainloop_init(){
\r
39 if(!option_get_bool("UCI")){
\r
40 xboard2uci_init(); // the default
\r
44 // mainloop_engine_step()
\r
46 static void mainloop_engine_step(char * string){
\r
47 if(option_get_bool("UCI")){
\r
48 uci2uci_engine_step(string);
\r
50 xboard2uci_engine_step(string);
\r
54 // mainloop_gui_step()
\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
64 xboard2uci_gui_step(string);
\r
71 char string[StringSize];
\r
73 while (!engine_eof(Engine)) {
\r
74 // process buffered lines
\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
85 mainloop_wait_for_event();
\r
87 my_log("POLYGLOT *** EOF file received from engine ***\n");
\r
93 // mainloop_wait_for_event()
\r
95 static void mainloop_wait_for_event(){
\r
98 char string[StringSize];
\r
99 hHandles[0]=(GUI->io).hEvent;
\r
100 hHandles[1]=(Engine->io).hEvent;
\r
101 WaitForMultipleObjects(2, // count
\r
103 FALSE, // return if one object is signaled
\r
104 INFINITE // no timeout
\r
110 char string[StringSize];
\r
114 fd_max = -1; // HACK
\r
118 ASSERT(GUI->io->in_fd>=0);
\r
120 FD_SET(GUI->io->in_fd,set);
\r
121 if (GUI->io->in_fd > fd_max) fd_max = GUI->io->in_fd;
\r
123 // add engine input
\r
125 ASSERT(Engine->io->in_fd>=0);
\r
127 FD_SET(Engine->io->in_fd,set);
\r
128 if (Engine->io->in_fd > fd_max) fd_max = Engine->io->in_fd;
\r
130 // wait for something to read (no timeout)
\r
133 val = select(fd_max+1,set,NULL,NULL,NULL);
\r
134 if (val == -1 && errno != EINTR) my_fatal("adapter_step(): select(): %s\n",strerror(errno));
\r
137 if (FD_ISSET(GUI->io->in_fd,set)) io_get_update(GUI->io); // read some xboard input
\r
138 if (FD_ISSET(Engine->io->in_fd,set)) io_get_update(Engine->io); // read some engine input
\r