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