version 1.4.36b
[polyglot.git] / mainloop.c
1 // mainloop.c\r
2 \r
3 // constants\r
4 \r
5 static const int StringSize = 4096;\r
6 \r
7 // includes\r
8 \r
9 #include <errno.h>\r
10 #include <stdio.h>\r
11 #include <stdlib.h>\r
12 #include <string.h>\r
13 \r
14 #include "main.h"\r
15 #include "engine.h"\r
16 #include "gui.h"\r
17 #include "option.h"\r
18 #include "xboard2uci.h"\r
19 #include "uci2uci.h"\r
20 \r
21 // prototypes\r
22 \r
23 static void mainloop_init            ();\r
24 static void mainloop_wait_for_event  ();\r
25 static void mainloop_engine_step(char * string);\r
26 static void mainloop_gui_step(char * string);\r
27 \r
28 // functions\r
29 \r
30 // mainloop_init()\r
31     \r
32 static void mainloop_init(){\r
33     if(!option_get_bool(Option,"UCI")){\r
34         xboard2uci_init();  // the default\r
35     }\r
36 }\r
37 \r
38 // mainloop_engine_step()\r
39 \r
40 static void mainloop_engine_step(char * string){\r
41     if(option_get_bool(Option,"UCI")){\r
42         uci2uci_engine_step(string); \r
43     }else{\r
44         xboard2uci_engine_step(string);\r
45     }\r
46 }\r
47 \r
48 // mainloop_gui_step()\r
49 \r
50 static void mainloop_gui_step(char * string){\r
51     if(option_get_bool(Option,"UCI")){\r
52         uci2uci_gui_step(string); \r
53     }else if(my_string_equal(string,"uci")){ // mode auto detection\r
54         my_log("POLYGLOT *** Switching to UCI mode ***\n");\r
55         option_set(Option,"UCI","true");\r
56         uci2uci_gui_step(string);\r
57     }else{\r
58         xboard2uci_gui_step(string);\r
59     }\r
60 }\r
61 \r
62 // mainloop()\r
63 \r
64 void mainloop() {\r
65     char string[StringSize];\r
66     mainloop_init();\r
67     while (!engine_eof(Engine)) {\r
68             // process buffered lines\r
69         while(TRUE){\r
70             if(gui_get_non_blocking(GUI,string)){\r
71                 mainloop_gui_step(string);\r
72             }else if(!engine_eof(Engine) &&\r
73                      engine_get_non_blocking(Engine,string) ){\r
74                 mainloop_engine_step(string);\r
75             }else{\r
76                 break;\r
77             }\r
78         }\r
79         mainloop_wait_for_event();\r
80     }\r
81     my_log("POLYGLOT *** Mainloop has ended ***\n");\r
82     // This should be handled better.\r
83     engine_close(Engine);\r
84     my_log("POLYGLOT Calling exit\n");\r
85     exit(EXIT_SUCCESS);\r
86 \r
87 }\r
88 \r
89 \r
90 \r
91 \r
92 // mainloop_wait_for_event()\r
93 \r
94 static void mainloop_wait_for_event(){\r
95     pipex_t *pipex[3];\r
96     pipex[0]=GUI->pipex;\r
97     pipex[1]=Engine->pipex;\r
98     pipex[2]=NULL;\r
99     pipex_wait_event(pipex);\r
100 }\r
101 \r
102 \r
103 \r