version 1.4.56b
[polyglot.git] / main.c
1 \r
2 // main.c\r
3 \r
4 // includes\r
5 \r
6 #include <errno.h>\r
7 #include <stdio.h>\r
8 #include <stdlib.h>\r
9 #include <string.h>\r
10 #include <time.h>\r
11 \r
12 #include "attack.h"\r
13 #include "board.h"\r
14 #include "book.h"\r
15 #include "book_make.h"\r
16 #include "book_merge.h"\r
17 #include "engine.h"\r
18 #include "epd.h"\r
19 #include "fen.h"\r
20 #include "gui.h"\r
21 #include "hash.h"\r
22 #include "list.h"\r
23 #include "main.h"\r
24 #include "mainloop.h"\r
25 #include "move.h"\r
26 #include "move_gen.h"\r
27 #include "option.h"\r
28 #include "piece.h"\r
29 #include "search.h"\r
30 #include "square.h"\r
31 #include "uci.h"\r
32 #include "util.h"\r
33 #include "xboard2uci.h"\r
34 #include "uci2uci.h"\r
35 #include "ini.h"\r
36 #include "util.h"\r
37 \r
38 \r
39 // constants\r
40 \r
41 \r
42 static const char * const Version = "1.4.56b";\r
43 static const char * const HelpMessage = "\\r
44 SYNTAX\n\\r
45 * polyglot [configfile] [-noini] [-ec engine] [-ed enginedirectory] [-en enginename] [-log] [-lf logfile] [-hash value] [-bk book] [-pg <name>=<value>]* [-uci <name>=<value>]*\n\\r
46 * polyglot make-book [-pgn inputfile] [-bin outputfile] [-max-ply ply] [-min-game games] [-min-score score] [-only-white] [-only-black] [-uniform]\n\\r
47 * polyglot merge-book -in1 inputfile1 -in2 inputfile2 [-out outputfile]\n\\r
48 * polyglot info-book [-bin inputfile] [-exact]\n\\r
49 * polyglot dump-book [-bin inputfile] -color color [-out outputfile]\n\\r
50 * polyglot [configfile] epd-test [engineoptions] [-epd inputfile] [-min-depth depth] [-max-depth depth] [-min-time time] [-max-time time] [-depth-delta delta]\n\\r
51 * polyglot perft [-fen fen] [-max-depth depth]\\r
52 ";\r
53 \r
54 static const int SearchDepth = 63;\r
55 static const double SearchTime = 3600.0;\r
56 static const int StringSize = 4096;\r
57 \r
58 // variables\r
59 \r
60 static bool Init;\r
61 \r
62 // prototypes\r
63 \r
64 static void stop_search  ();\r
65 \r
66 // functions\r
67 \r
68 // arg_shift_left()\r
69 \r
70 static void arg_shift_left(char **argv, int index){\r
71     int i;\r
72     for(i=index; argv[i]!=NULL; i++){\r
73         argv[i]=argv[i+1];\r
74     }\r
75 }\r
76 \r
77 // parse_args()\r
78 \r
79 static void parse_args(ini_t *ini, char **argv){\r
80     int arg_index;\r
81     char *arg;\r
82     arg_index=0;\r
83     while((arg=argv[arg_index])){\r
84         if(my_string_equal(arg,"-ec") && argv[arg_index+1]){\r
85             ini_insert_ex(ini,"PolyGlot","EngineCommand",argv[arg_index+1]);\r
86             arg_shift_left(argv,arg_index);\r
87             arg_shift_left(argv,arg_index);\r
88             continue;\r
89         }if(my_string_equal(arg,"-ed") && argv[arg_index+1]){\r
90             ini_insert_ex(ini,"PolyGlot","EngineDir",argv[arg_index+1]);\r
91             arg_shift_left(argv,arg_index);\r
92             arg_shift_left(argv,arg_index);\r
93             continue;\r
94         }\r
95         if(my_string_equal(arg,"-en") && argv[arg_index+1]){\r
96             ini_insert_ex(ini,"PolyGlot","EngineName",argv[arg_index+1]);\r
97             arg_shift_left(argv,arg_index);\r
98             arg_shift_left(argv,arg_index);\r
99             continue;\r
100         }\r
101         if(my_string_equal(arg,"-log") &&\r
102            argv[arg_index+1] &&\r
103            IS_BOOL(argv[arg_index+1])){\r
104             ini_insert_ex(ini,\r
105                           "PolyGlot",\r
106                           "Log",\r
107                           TO_BOOL(argv[arg_index+1])?"true":"false");\r
108             arg_shift_left(argv,arg_index);\r
109             arg_shift_left(argv,arg_index);\r
110             continue;\r
111         }\r
112         if(my_string_equal(arg,"-lf") && argv[arg_index+1]){\r
113             ini_insert_ex(ini,"PolyGlot","LogFile",argv[arg_index+1]);\r
114             arg_shift_left(argv,arg_index);\r
115             arg_shift_left(argv,arg_index);\r
116             continue;\r
117         }\r
118         if(my_string_equal(arg,"-wb") &&\r
119            argv[arg_index+1]&&\r
120            IS_BOOL(argv[arg_index+1])){\r
121                ini_insert_ex(ini,"PolyGlot",\r
122                              "OnlyWbOptions",\r
123                              TO_BOOL(argv[arg_index+1])?"true":"false");\r
124                arg_shift_left(argv,arg_index);\r
125                arg_shift_left(argv,arg_index);\r
126                continue;\r
127         }\r
128         if((my_string_equal(arg,"-pg")||my_string_equal(arg,"-uci")) &&\r
129            argv[arg_index+1]){\r
130             int ret;\r
131             char section[StringSize];\r
132             char name[StringSize];\r
133             char value[StringSize];\r
134             ret=ini_line_parse(argv[arg_index+1],section,name,value);\r
135             if(ret==NAME_VALUE){\r
136                 if(my_string_equal(arg,"-pg")){\r
137                     ini_insert_ex(ini,"PolyGlot",name,value);\r
138                 }else{\r
139                     ini_insert_ex(ini,"Engine",name,value);\r
140                 }\r
141             }\r
142             arg_shift_left(argv,arg_index);\r
143             arg_shift_left(argv,arg_index);\r
144             continue;\r
145         }\r
146         arg_index++;\r
147     }\r
148 }\r
149 \r
150 \r
151 // make_ini()\r
152 \r
153 static void make_ini(ini_t *ini){\r
154     option_t *opt;\r
155     ini_insert_ex(ini,"polyglot",\r
156                   "EngineCommand",\r
157                   option_get(Option,"EngineCommand"));\r
158     ini_insert_ex(ini,"polyglot",\r
159                   "EngineDir",\r
160                   option_get(Option,"EngineDir"));\r
161     option_start_iter(Option);\r
162     while((opt=option_next(Option))){\r
163         if(my_string_case_equal(opt->name,"SettingsFile")) continue;\r
164         if(my_string_case_equal(opt->name,"EngineCommand")) continue;\r
165         if(my_string_case_equal(opt->name,"EngineDir")) continue;\r
166         if(!my_string_equal(opt->value,opt->default_)&& !IS_BUTTON(opt->type))\r
167         {\r
168             ini_insert_ex(ini,"polyglot",opt->name,opt->value);\r
169         }\r
170     }\r
171     option_start_iter(Uci->option);\r
172     while((opt=option_next(Uci->option))){\r
173         if(!strncmp(opt->name,"UCI_",4) &&\r
174             !my_string_case_equal(opt->name,"UCI_LimitStrength") &&\r
175             !my_string_case_equal(opt->name,"UCI_Elo"))continue;\r
176         if(!my_string_equal(opt->value,opt->default_)&&\r
177            !IS_BUTTON(opt->type)){\r
178             ini_insert_ex(ini,"engine",opt->name,opt->value);\r
179         }\r
180     }\r
181 }\r
182 \r
183 \r
184 // write_ini()\r
185 \r
186 static void write_ini(const char *filename,\r
187                          ini_t *ini){\r
188   // TODO Quote, dequote\r
189     const char *quote;\r
190     ini_entry_t *entry;\r
191     char tmp[StringSize];\r
192     char tmp1[StringSize];\r
193     char tmp2[StringSize];\r
194     FILE *f;\r
195     time_t t=time(NULL);\r
196     f=fopen(filename,"w");\r
197     if(!f){\r
198       gui_send(GUI,"tellusererror write_ini(): %s: %s.",filename,strerror(errno));\r
199       my_log("POLYGLOT write_ini(): %s: %s.\n",filename,strerror(errno));\r
200       return;\r
201     }\r
202     fprintf(f,"; Created: %s\n",ctime(&t));\r
203     fprintf(f,"[PolyGlot]\n");\r
204     ini_start_iter(ini);\r
205     while((entry=ini_next(ini))){\r
206       if(my_string_case_equal(entry->section,"polyglot")){\r
207           my_quote(tmp1,entry->name,ini_specials);\r
208           my_quote(tmp2,entry->value,ini_specials);\r
209           snprintf(tmp,sizeof(tmp),"%s=%s\n",\r
210                    tmp1,\r
211                    tmp2);\r
212         tmp[sizeof(tmp)-1]='\0';\r
213         fprintf(f,"%s",tmp);\r
214       }\r
215     }\r
216     fprintf(f,"[Engine]\n");\r
217     ini_start_iter(ini);\r
218     while((entry=ini_next(ini))){\r
219       if(my_string_case_equal(entry->section,"engine")){\r
220         my_quote(tmp1,entry->name,ini_specials);\r
221         my_quote(tmp2,entry->value,ini_specials);\r
222         snprintf(tmp,sizeof(tmp),"%s=%s\n",\r
223                      tmp1,\r
224                      tmp2);\r
225         tmp[sizeof(tmp)-1]='\0';\r
226         fprintf(f,"%s",tmp);\r
227       }\r
228     }\r
229     fclose(f);\r
230 }\r
231 \r
232 // welcome_message()\r
233 \r
234 void welcome_message(char *buf){\r
235     if(!DEBUG){\r
236         sprintf(buf,\r
237                 "PolyGlot %s by Fabien Letouzey.\n",\r
238                 Version);\r
239     }else{\r
240         sprintf(buf,\r
241                 "PolyGlot %s by Fabien Letouzey (debug build).\n",\r
242                 Version);\r
243     }\r
244 }\r
245 \r
246 int wb_select(){\r
247     option_t *opt;\r
248     option_start_iter(Option);\r
249     while((opt=option_next(Option))){\r
250         opt->mode&=~XBOARD;\r
251         if(opt->mode & XBSEL){\r
252             opt->mode|=XBOARD; \r
253         }\r
254     }\r
255 }\r
256 \r
257 // main()\r
258 \r
259 int main(int argc, char * argv[]) {\r
260     ini_t ini[1], ini_command[1];\r
261     ini_entry_t *entry;\r
262     char *arg;\r
263     int arg_index;\r
264     bool NoIni;\r
265     option_t *opt;\r
266     char welcome[StringSize];\r
267 \r
268 \r
269     welcome_message(welcome);\r
270  \r
271     printf("%s",welcome);\r
272 \r
273 \r
274     if(argc>=2 && ((my_string_case_equal(argv[1],"help")) || (my_string_case_equal(argv[1],"-help")) || (my_string_case_equal(argv[1],"--help")) ||  (my_string_case_equal(argv[1],"-h")) ||  my_string_case_equal(argv[1],"/?"))){\r
275         printf("%s\n",HelpMessage);\r
276         return EXIT_SUCCESS;\r
277     }\r
278 \r
279    // init\r
280 \r
281     Init = FALSE;\r
282 \r
283     gui_init(GUI);\r
284 \r
285     util_init();\r
286     option_init_pg();\r
287     \r
288     square_init();\r
289     piece_init();\r
290     attack_init();\r
291     \r
292     hash_init();\r
293 \r
294     my_random_init();\r
295 \r
296     ini_init(ini);\r
297     ini_init(ini_command);\r
298 \r
299         // book utilities: do not touch these\r
300     \r
301     if (argc >= 2 && my_string_equal(argv[1],"make-book")) {\r
302         book_make(argc,argv);\r
303         return EXIT_SUCCESS;\r
304     }\r
305     \r
306     if (argc >= 2 && my_string_equal(argv[1],"merge-book")) {\r
307         book_merge(argc,argv);\r
308         return EXIT_SUCCESS;\r
309     }\r
310 \r
311     if (argc >= 2 && my_string_equal(argv[1],"dump-book")) {\r
312         book_dump(argc,argv);\r
313         return EXIT_SUCCESS;\r
314     }\r
315     \r
316     if (argc >= 2 && my_string_equal(argv[1],"info-book")) {\r
317         book_info(argc,argv);\r
318         return EXIT_SUCCESS;\r
319     }\r
320 \r
321         // perft\r
322     \r
323     if (argc >= 2 && my_string_equal(argv[1],"perft")) {\r
324         do_perft(argc,argv);\r
325         return EXIT_SUCCESS;\r
326     }\r
327     \r
328         // What is the config file? This is very hacky right now.\r
329 \r
330         // Do we want a config file at all?\r
331 \r
332     arg_index=0;\r
333     NoIni=FALSE;\r
334     while((arg=argv[arg_index++])){\r
335         if(my_string_equal(arg,"-noini")){\r
336             NoIni=TRUE;\r
337             break;\r
338         }\r
339     }\r
340     arg_shift_left(argv,arg_index-1);\r
341     parse_args(ini_command,argv+1);\r
342     if(NoIni){\r
343         option_set(Option,"SettingsFile","<empty>");\r
344     }\r
345 \r
346         // Ok see if first argument looks like config file\r
347     \r
348     if(argv[1] && !my_string_equal(argv[1],"epd-test") && !(argv[1][0]=='-')){\r
349                 // first argument must be  config file\r
350         if(!NoIni){\r
351             option_set(Option,"SettingsFile",argv[1]);\r
352         }else{\r
353                 // ignore\r
354         }\r
355         arg_shift_left(argv,1);\r
356     }else{\r
357             // Config file is the default.\r
358             // This has already been set above or in "option_init_pg()"\r
359     }\r
360 \r
361 \r
362 \r
363         // if we use a config file: load it!\r
364     \r
365     if(!my_string_equal(option_get_string(Option,"SettingsFile"),"<empty>")){\r
366         if(ini_parse(ini,option_get_string(Option,"SettingsFile"))){\r
367             my_fatal("main(): Can't open config file \"%s\": %s\n",\r
368                    option_get_string(Option,"SettingsFile"),\r
369                    strerror(errno));\r
370         }\r
371     }\r
372 \r
373         // Extract some important options\r
374 \r
375     if((entry=ini_find(ini,"polyglot","EngineCommand"))){\r
376         option_set(Option,entry->name,entry->value);\r
377     }\r
378     if((entry=ini_find(ini,"polyglot","EngineDir"))){\r
379         option_set(Option,entry->name,entry->value);\r
380     }\r
381     if((entry=ini_find(ini,"polyglot","EngineName"))){\r
382         option_set(Option,entry->name,entry->value);\r
383     }\r
384     if((entry=ini_find(ini,"polyglot","Log"))){\r
385         polyglot_set_option(entry->name,entry->value);\r
386     }\r
387     if((entry=ini_find(ini,"polyglot","LogFile"))){\r
388         polyglot_set_option(entry->name,entry->value);\r
389     }\r
390     \r
391         // Concession to WB 4.4.0\r
392         // Treat "polyglot_1st.ini" and "polyglot_2nd.ini" specially\r
393 \r
394     if(option_get_bool(Option,"WbWorkArounds3")){\r
395         const char *SettingsFile=option_get(Option,"SettingsFile");\r
396         if(strstr(SettingsFile,"polyglot_1st.ini")||\r
397            strstr(SettingsFile,"polyglot_2nd.ini")){\r
398             option_set(Option,"SettingsFile","<empty>");\r
399         }\r
400     }\r
401 \r
402         // Look at command line for logging option. It is important\r
403         // to start logging as soon as possible.\r
404 \r
405      if((entry=ini_find(ini_command,"PolyGlot","Log"))){\r
406          option_set(Option,entry->name,entry->value);\r
407     }\r
408     if((entry=ini_find(ini_command,"PolyGlot","LogFile"))){\r
409         option_set(Option,entry->name,entry->value);\r
410     }\r
411     \r
412        // start logging if required\r
413     \r
414     if (option_get_bool(Option,"Log")) {\r
415         my_log_open(option_get_string(Option,"LogFile"));\r
416     }\r
417 \r
418         // log welcome stuff\r
419     \r
420     my_log("%s",welcome);\r
421     my_log("POLYGLOT *** START ***\n");\r
422     if(!my_string_equal(option_get_string(Option,"SettingsFile"),"<empty>")){\r
423         my_log("POLYGLOT INI file \"%s\"\n",option_get_string(Option,"SettingsFile"));\r
424     }\r
425 \r
426 \r
427         // scavenge command line for options necessary to start the engine\r
428 \r
429 \r
430     if((entry=ini_find(ini_command,"PolyGlot","EngineCommand"))){\r
431         option_set(Option,entry->name,entry->value);\r
432     }\r
433     if((entry=ini_find(ini_command,"PolyGlot","EngineDir"))){\r
434         option_set(Option,entry->name,entry->value);\r
435     }\r
436     if((entry=ini_find(ini_command,"PolyGlot","EngineName"))){\r
437         option_set(Option,entry->name,entry->value);\r
438     }\r
439 \r
440     // Make sure that EngineCommand has been set\r
441     if(my_string_case_equal(option_get(Option,"EngineCommand"),"<empty>")){\r
442       my_fatal("main(): EngineCommand not set\n");\r
443     }\r
444 \r
445         // start engine\r
446     \r
447     engine_open(Engine);\r
448 \r
449     if(!engine_active(Engine)){\r
450         my_fatal("main(): Could not start \"%s\"\n",option_get(Option,"EngineCommand"));\r
451     }\r
452 \r
453         // switch to UCI mode if necessary\r
454     \r
455     if (option_get_bool(Option,"UCI")) {\r
456         my_log("POLYGLOT *** Switching to UCI mode ***\n");\r
457     }\r
458 \r
459         // initialize uci parsing and send uci command. \r
460         // Parse options and wait for uciok\r
461     \r
462     // XXX\r
463     uci_open(Uci,Engine);\r
464 \r
465     option_set_default(Option,"EngineName",Uci->name);\r
466 \r
467         // get engine name from engine if not supplied in config file or on\r
468         // the command line\r
469 \r
470     if (my_string_equal(option_get_string(Option,"EngineName"),"<empty>")) {\r
471         option_set(Option,"EngineName",Uci->name);\r
472     }\r
473 \r
474 \r
475         // In the case we have been invoked with NoIni or StandardIni\r
476         // we still have to load a config file.\r
477 \r
478     if(my_string_equal(option_get_string(Option,"SettingsFile"),"<empty>")){\r
479 \r
480             //  construct the name of the ConfigFile from the EngineName\r
481         \r
482         char tmp[StringSize];\r
483         char option_file[StringSize];\r
484         int i;\r
485         snprintf(tmp,sizeof(tmp),"%s.ini",\r
486                  option_get_string(Option,"EngineName"));\r
487         tmp[sizeof(tmp)-1]='\0';\r
488         for(i=0;i<strlen(tmp);i++){\r
489             if(tmp[i]==' '){\r
490                 tmp[i]='_';\r
491             }\r
492         }\r
493         my_path_join(option_file,\r
494                      option_get_string(Option,"SettingsDir"),\r
495                      tmp);\r
496     // Load the config file\r
497         option_set(Option,"SettingsFile",option_file);\r
498 \r
499         my_log("POLYGLOT INI file \"%s\"\n",option_get_string(Option,"SettingsFile"));\r
500         if(ini_parse(ini,option_file)){\r
501             my_log("POLYGLOT Unable to open %s\n",\r
502                    option_get_string(Option,"SettingsFile")); \r
503         }\r
504     }\r
505 \r
506 \r
507     // Parse the command line and merge remaining options.\r
508 \r
509     ini_start_iter(ini_command);\r
510     while((entry=ini_next(ini_command))){\r
511         ini_insert(ini,entry);\r
512     }\r
513 \r
514         // Remind the reader about the options that are now in effect.\r
515 \r
516     my_log("POLYGLOG OPTIONS \n");\r
517     ini_disp(ini);\r
518 \r
519             // extract PG options\r
520     \r
521     ini_start_iter(ini);\r
522     while((entry=ini_next(ini))){\r
523         if(my_string_case_equal(entry->section,"polyglot")){\r
524             opt=option_find(Option,entry->name);\r
525             if(opt && !IS_BUTTON(opt->type)){\r
526                 polyglot_set_option(entry->name,entry->value);\r
527             }\r
528         }\r
529     }\r
530 \r
531         // Cater to our biggest customer:-)\r
532     \r
533     if(option_get_bool(Option,"OnlyWbOptions")){\r
534         wb_select();\r
535     }\r
536 \r
537         // done initializing\r
538     \r
539     Init = TRUE;\r
540     \r
541         // collect engine options from config file(s) and send to engine\r
542     \r
543     ini_start_iter(ini);\r
544     while((entry=ini_next(ini))){\r
545         if(my_string_case_equal(entry->section,"engine")){\r
546                 // also updates value in Uci->option\r
547             uci_send_option(Uci,entry->name,"%s",entry->value);\r
548         }\r
549     }\r
550 \r
551     \r
552     \r
553         // EPD test\r
554     \r
555     if (argv[1] && my_string_equal(argv[1],"epd-test")){\r
556         argc=0;\r
557         while((arg=argv[argc++]));\r
558         epd_test(argc-1,argv);\r
559         return EXIT_SUCCESS;\r
560     }\r
561     \r
562         // Anything that hasn't been parsed yet is a syntax error\r
563         // It seems that XBoard sometimes passes empty strings as arguments\r
564         // to PolyGlot. We ignore these. \r
565 \r
566     argc=1;\r
567     while((arg=argv[argc++])){\r
568         if(!my_string_equal(arg,"")){\r
569             my_fatal("main(): Incorrect use of option: \"%s\"\n",argv[argc-1]);\r
570         }\r
571     }\r
572 \r
573     //    gui_init(GUI);\r
574     mainloop();\r
575     return EXIT_SUCCESS; \r
576 }\r
577 \r
578 // polyglot_set_option()\r
579 \r
580 void polyglot_set_option(const char *name, const char *value){ // this must be cleaned up!\r
581     ini_t ini[1];\r
582     int ret;\r
583     ini_init(ini);\r
584     my_log("POLYGLOT Setting PolyGlot option \"%s=%s\"\n",name,value);\r
585     if(my_string_case_equal(name,"Save")){\r
586         ret=my_mkdir(option_get(Option,"SettingsDir"));\r
587         if(ret){\r
588             my_log("POLYGLOT polyglot_set_option(): %s: %s\n",\r
589                    option_get(Option,"SettingsDir"),\r
590                    strerror(errno));\r
591         }\r
592         make_ini(ini);\r
593         write_ini(option_get(Option,"SettingsFile"),ini);\r
594         return;\r
595     }\r
596 //    if(my_string_equal(option_get(Option,name),value)){\r
597 //        my_log("Not setting PolyGlot option \"%s\" "\r
598 //               "since it already as the correct value.\n",\r
599 //               name);\r
600 //        return;\r
601 //    }\r
602     option_set(Option,name,value);\r
603     if(option_get_bool(Option,"Book")&&(my_string_case_equal(name,"BookFile")||my_string_case_equal(name,"Book"))){\r
604         my_log("POLYGLOT *** SETTING BOOK ***\n");\r
605         my_log("POLYGLOT BOOK \"%s\"\n",option_get_string(Option,"BookFile"));\r
606         book_close();\r
607         book_clear();\r
608         book_open(option_get_string(Option,"BookFile"));\r
609         if(!book_is_open()){\r
610             my_log("POLYGLOT Unable to open book \"%s\"\n",option_get_string(Option,"BookFile"));\r
611         }\r
612     }else if(option_get_bool(Option,"Log")&&(my_string_case_equal(name,"LogFile") ||my_string_case_equal(name,"Log"))){\r
613         my_log("POLYGLOT *** SWITCHING LOGFILE ***\n");\r
614         my_log("POLYGLOT NEW LOGFILE \"%s\"\n",option_get_string(Option,"LogFile"));\r
615         my_log_close();\r
616         my_log_open(option_get_string(Option,"LogFile"));\r
617     }else if(option_get_bool(Option,"UseNice") &&(my_string_case_equal(name,"NiceValue")||my_string_case_equal(name,"UseNice"))){\r
618         my_log("POLYGLOT Adjust Engine Piority\n");\r
619         engine_set_nice_value(Engine,atoi(option_get_string(Option,"NiceValue")));\r
620     }else if(my_string_case_equal(name,"Book") && !option_get_bool(Option,"Book")){\r
621         book_close();\r
622         book_clear();\r
623     }else if(my_string_case_equal(name,"UseNice") && !option_get_bool(Option,"UseNice")){\r
624         my_log("POLYGLOT Adjust Engine Piority\n");\r
625         engine_set_nice_value(Engine,0);\r
626     }else if(my_string_case_equal(name,"Log") && !option_get_bool(Option,"Log")){\r
627         my_log("POLYGLOT QUIT LOGGING\n");\r
628         my_log_close();\r
629     }\r
630 }\r
631 \r
632 \r
633 \r
634 // quit()\r
635 \r
636 void quit() {\r
637     my_log("POLYGLOT *** QUIT ***\n");\r
638     if (Init && !Engine->pipex->quit_pending) {\r
639         stop_search();\r
640         Engine->pipex->quit_pending=TRUE;\r
641         engine_send(Engine,"quit");\r
642         my_log("POLYGLOT Closing engine\n");\r
643         engine_close(Engine);\r
644         \r
645     }\r
646     my_sleep(200);\r
647     my_log("POLYGLOT Calling exit\n");\r
648     exit(EXIT_SUCCESS);\r
649 }\r
650 \r
651 // stop_search()\r
652 \r
653 static void stop_search() {\r
654     \r
655     if (Init && Uci->searching) {\r
656         \r
657         ASSERT(Uci->searching);\r
658         ASSERT(Uci->pending_nb>=1);\r
659         \r
660         my_log("POLYGLOT STOP SEARCH\n");\r
661         \r
662         if (option_get_bool(Option,"SyncStop")) {\r
663             uci_send_stop_sync(Uci);\r
664         } else {\r
665             uci_send_stop(Uci);\r
666         }\r
667     }\r
668 }\r
669 \r
670 \r
671 // end of main.c\r
672 \r