version 1.4.50b
[polyglot.git] / main.c
diff --git a/main.c b/main.c
index aaadc82..830dfa2 100644 (file)
--- a/main.c
+++ b/main.c
@@ -39,7 +39,7 @@
 // constants\r
 \r
 \r
-static const char * const Version = "1.4.46b";\r
+static const char * const Version = "1.4.50b";\r
 static const char * const HelpMessage = "\\r
 SYNTAX\n\\r
 * polyglot [configfile] [-noini] [-ec engine] [-ed enginedirectory] [-en enginename] [-log] [-lf logfile] [-hash value] [-bk book] [-pg <name>=<value>]* [-uci <name>=<value>]*\n\\r
@@ -55,29 +55,12 @@ static const int SearchDepth = 63;
 static const double SearchTime = 3600.0;\r
 static const int StringSize = 4096;\r
 \r
-static const char * const IniIntro=\r
-              "; This ini file is used internally by PolyGlot\n"\r
-              "; to remember the settings for the UCI engine\n"\r
-              "; whose name is \"%s\".\n"\r
-              "\n"\r
-              "; The values for these settings would be typicallly\n"\r
-              "; obtained from the engine settings dialog\n"\r
-              "; in WinBoard/xboard 4.4.0 and higher.\n"\r
-              "\n" \r
-              "; If the value of the option \"Persist\" is false\n"\r
-              "; then the content of this file is ignored.\n"\r
-              "\n"\r
-              "; It is allowed to manually edit this file\n"\r
-              "; and you may safely delete it as well.\n"\r
-              "\n";\r
-\r
 // variables\r
 \r
 static bool Init;\r
 \r
 // prototypes\r
 \r
-static void init_book ();\r
 static void stop_search  ();\r
 \r
 // functions\r
@@ -91,34 +74,108 @@ static void arg_shift_left(char **argv, int index){
     }\r
 }\r
 \r
+// parse_args()\r
+\r
+static void parse_args(ini_t *ini, char **argv){\r
+    int arg_index;\r
+    char *arg;\r
+    arg_index=0;\r
+    while((arg=argv[arg_index])){\r
+        if(my_string_equal(arg,"-ec") && argv[arg_index+1]){\r
+            ini_insert_ex(ini,"PolyGlot","EngineCommand",argv[arg_index+1]);\r
+            arg_shift_left(argv,arg_index);\r
+            arg_shift_left(argv,arg_index);\r
+            continue;\r
+        }if(my_string_equal(arg,"-ed") && argv[arg_index+1]){\r
+            ini_insert_ex(ini,"PolyGlot","EngineDir",argv[arg_index+1]);\r
+            arg_shift_left(argv,arg_index);\r
+            arg_shift_left(argv,arg_index);\r
+            continue;\r
+        }\r
+        if(my_string_equal(arg,"-en") && argv[arg_index+1]){\r
+            ini_insert_ex(ini,"PolyGlot","EngineName",argv[arg_index+1]);\r
+            arg_shift_left(argv,arg_index);\r
+            arg_shift_left(argv,arg_index);\r
+            continue;\r
+        }\r
+        if(my_string_equal(arg,"-log") &&\r
+           argv[arg_index+1] &&\r
+           IS_BOOL(argv[arg_index+1])){\r
+            ini_insert_ex(ini,\r
+                          "PolyGlot",\r
+                          "Log",\r
+                          TO_BOOL(argv[arg_index+1])?"true":"false");\r
+            arg_shift_left(argv,arg_index);\r
+            arg_shift_left(argv,arg_index);\r
+            continue;\r
+        }\r
+        if(my_string_equal(arg,"-lf") && argv[arg_index+1]){\r
+            ini_insert_ex(ini,"PolyGlot","LogFile",argv[arg_index+1]);\r
+            arg_shift_left(argv,arg_index);\r
+            arg_shift_left(argv,arg_index);\r
+            continue;\r
+        }\r
+        if(my_string_equal(arg,"-wb") &&\r
+           argv[arg_index+1]&&\r
+           IS_BOOL(argv[arg_index+1])){\r
+               ini_insert_ex(ini,"PolyGlot",\r
+                             "OnlyWbOptions",\r
+                             TO_BOOL(argv[arg_index+1])?"true":"false");\r
+               arg_shift_left(argv,arg_index);\r
+               arg_shift_left(argv,arg_index);\r
+               continue;\r
+        }\r
+        if((my_string_equal(arg,"-pg")||my_string_equal(arg,"-uci")) &&\r
+           argv[arg_index+1]){\r
+            int ret;\r
+            char section[StringSize];\r
+            char name[StringSize];\r
+            char value[StringSize];\r
+            ret=ini_line_parse(argv[arg_index+1],section,name,value);\r
+            if(ret==NAME_VALUE){\r
+                if(my_string_equal(arg,"-pg")){\r
+                    ini_insert_ex(ini,"PolyGlot",name,value);\r
+                }else{\r
+                    ini_insert_ex(ini,"Engine",name,value);\r
+                }\r
+            }\r
+            arg_shift_left(argv,arg_index);\r
+            arg_shift_left(argv,arg_index);\r
+            continue;\r
+        }\r
+        arg_index++;\r
+    }\r
+}\r
+\r
 \r
 // make_ini()\r
 \r
 static void make_ini(ini_t *ini){\r
     option_t *opt;\r
-    char tmp[StringSize];\r
-    ini_insert_ex(ini,"polyglot",\r
-                 "EngineName",\r
-                 option_get_string(Option,"EngineName"));\r
     ini_insert_ex(ini,"polyglot",\r
                  "EngineCommand",\r
-                 option_get_string(Option,"EngineCommand"));\r
+                 option_get(Option,"EngineCommand"));\r
     ini_insert_ex(ini,"polyglot",\r
                  "EngineDir",\r
-                 option_get_string(Option,"EngineDir"));\r
+                 option_get(Option,"EngineDir"));\r
     option_start_iter(Option);\r
     while((opt=option_next(Option))){\r
-        if(!my_string_equal(opt->value,opt->default_)&&\r
-           !IS_BUTTON(opt->type) &&\r
-           (opt->mode & XBOARD)){\r
-         ini_insert_ex(ini,"polyglot",opt->name,opt->value);\r
+        if(my_string_case_equal(opt->name,"SettingsFile")) continue;\r
+        if(my_string_case_equal(opt->name,"EngineCommand")) continue;\r
+        if(my_string_case_equal(opt->name,"EngineDir")) continue;\r
+        if(!my_string_equal(opt->value,opt->default_)&& !IS_BUTTON(opt->type))\r
+        {\r
+            ini_insert_ex(ini,"polyglot",opt->name,opt->value);\r
         }\r
     }\r
     option_start_iter(Uci->option);\r
     while((opt=option_next(Uci->option))){\r
+        if(!strncmp(opt->name,"UCI_",4) &&\r
+            !my_string_case_equal(opt->name,"UCI_LimitStrength") &&\r
+            !my_string_case_equal(opt->name,"UCI_Elo"))continue;\r
         if(!my_string_equal(opt->value,opt->default_)&&\r
            !IS_BUTTON(opt->type)){\r
-         ini_insert_ex(ini,"engine",opt->name,opt->value);\r
+            ini_insert_ex(ini,"engine",opt->name,opt->value);\r
         }\r
     }\r
 }\r
@@ -128,27 +185,32 @@ static void make_ini(ini_t *ini){
 \r
 static void write_ini(const char *filename,\r
                         ini_t *ini){\r
+    const char *quote;\r
     ini_entry_t *entry;\r
     char tmp[StringSize];\r
     FILE *f;\r
     time_t t=time(NULL);\r
     f=fopen(filename,"w");\r
     if(!f){\r
-      // alas this does nothing....\r
       gui_send(GUI,"tellusererror write_ini(): %s: %s.",filename,strerror(errno));\r
-      // but at least we log the error\r
       my_log("POLYGLOT write_ini(): %s: %s.\n",filename,strerror(errno));\r
       return;\r
     }\r
-    fprintf(f,"; %s\n",ctime(&t));\r
-    fprintf(f,IniIntro,option_get_string(Option,"EngineName"));\r
+    fprintf(f,"; Created: %s\n",ctime(&t));\r
     fprintf(f,"[PolyGlot]\n");\r
     ini_start_iter(ini);\r
     while((entry=ini_next(ini))){\r
       if(my_string_case_equal(entry->section,"polyglot")){\r
-       snprintf(tmp,sizeof(tmp),"%s=%s\n",\r
-                entry->name,\r
-                entry->value);\r
+          if(strchr(entry->value,';')|| strchr(entry->value,'#')|| strchr(entry->value,'"')){\r
+              quote="\"";\r
+          }else{\r
+              quote="";\r
+          }\r
+          snprintf(tmp,sizeof(tmp),"%s=%s%s%s\n",\r
+                   entry->name,\r
+                   quote,\r
+                   entry->value,\r
+                   quote);\r
        tmp[sizeof(tmp)-1]='\0';\r
        fprintf(f,"%s",tmp);\r
       }\r
@@ -156,10 +218,17 @@ static void write_ini(const char *filename,
     fprintf(f,"[Engine]\n");\r
     ini_start_iter(ini);\r
     while((entry=ini_next(ini))){\r
-      if(my_string_case_equal(entry->section,"engine")){\r
-       snprintf(tmp,sizeof(tmp),"%s=%s\n",\r
-                entry->name,\r
-                entry->value);\r
+        if(my_string_case_equal(entry->section,"engine")){\r
+            if(strchr(entry->value,';')|| strchr(entry->value,'#')|| strchr(entry->value,'"')){\r
+                quote="\"";\r
+            }else{\r
+                quote="";\r
+            }\r
+            snprintf(tmp,sizeof(tmp),"%s=%s%s%s\n",\r
+                     entry->name,\r
+                     quote,\r
+                     entry->value,\r
+                     quote);\r
        tmp[sizeof(tmp)-1]='\0';\r
        fprintf(f,"%s",tmp);\r
       }\r
@@ -167,22 +236,47 @@ static void write_ini(const char *filename,
     fclose(f);\r
 }\r
 \r
+// welcome_message()\r
+\r
+void welcome_message(char *buf){\r
+    if(!DEBUG){\r
+        sprintf(buf,\r
+                "PolyGlot %s by Fabien Letouzey.\n",\r
+                Version);\r
+    }else{\r
+        sprintf(buf,\r
+                "PolyGlot %s by Fabien Letouzey (debug build).\n",\r
+                Version);\r
+    }\r
+}\r
+\r
+int wb_select(){\r
+    option_t *opt;\r
+    option_start_iter(Option);\r
+    while((opt=option_next(Option))){\r
+        opt->mode&=~XBOARD;\r
+        if(opt->mode & XBSEL){\r
+            opt->mode|=XBOARD; \r
+        }\r
+    }\r
+}\r
 \r
 // main()\r
 \r
 int main(int argc, char * argv[]) {\r
-    ini_t ini[1],ini_save[1];\r
+    ini_t ini[1], ini_command[1];\r
     ini_entry_t *entry;\r
     char *arg;\r
     int arg_index;\r
-    bool NoIni, Persist;\r
-    char persist_path[StringSize];\r
+    bool NoIni;\r
+    option_t *opt;\r
+    char welcome[StringSize];\r
+\r
+\r
+    welcome_message(welcome);\r
  \r
-    if(!DEBUG){\r
-        printf("PolyGlot %s by Fabien Letouzey.\n",Version);\r
-    }else{\r
-        printf("PolyGlot %s by Fabien Letouzey (debug build).\n",Version);\r
-    }\r
+    printf("%s",welcome);\r
+\r
 \r
     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
         printf("%s\n",HelpMessage);\r
@@ -205,9 +299,9 @@ int main(int argc, char * argv[]) {
     my_random_init();\r
 \r
     ini_init(ini);\r
-    ini_init(ini_save);\r
+    ini_init(ini_command);\r
 \r
-        // book utilities\r
+        // book utilities: do not touch these\r
     \r
     if (argc >= 2 && my_string_equal(argv[1],"make-book")) {\r
         book_make(argc,argv);\r
@@ -235,9 +329,6 @@ int main(int argc, char * argv[]) {
         do_perft(argc,argv);\r
         return EXIT_SUCCESS;\r
     }\r
-\r
-        // TODO: If logging is enabled on the command line turn it on NOW\r
-        // and do not allow it to be overridden later. \r
     \r
         // What is the config file? This is very hacky right now.\r
 \r
@@ -252,8 +343,9 @@ int main(int argc, char * argv[]) {
         }\r
     }\r
     arg_shift_left(argv,arg_index-1);\r
+    parse_args(ini_command,argv+1);\r
     if(NoIni){\r
-        option_set(Option,"OptionFile","<empty>");\r
+        option_set(Option,"SettingsFile","<empty>");\r
     }\r
 \r
         // Ok see if first argument looks like config file\r
@@ -261,7 +353,7 @@ int main(int argc, char * argv[]) {
     if(argv[1] && !my_string_equal(argv[1],"epd-test") && !(argv[1][0]=='-')){\r
                 // first argument must be  config file\r
         if(!NoIni){\r
-            option_set(Option,"OptionFile",argv[1]);\r
+            option_set(Option,"SettingsFile",argv[1]);\r
         }else{\r
                 // ignore\r
         }\r
@@ -270,33 +362,59 @@ int main(int argc, char * argv[]) {
             // Config file is the default.\r
             // This has already been set above or in "option_init_pg()"\r
     }\r
-    \r
+\r
+\r
 \r
         // if we use a config file: load it!\r
     \r
-    if(!my_string_equal(option_get_string(Option,"OptionFile"),"<empty>")){\r
-        if(ini_parse(ini,option_get_string(Option,"OptionFile"))){\r
+    if(!my_string_equal(option_get_string(Option,"SettingsFile"),"<empty>")){\r
+        if(ini_parse(ini,option_get_string(Option,"SettingsFile"))){\r
             my_fatal("main(): Can't open file \"%s\": %s\n",\r
-                   option_get_string(Option,"OptionFile"),\r
+                   option_get_string(Option,"SettingsFile"),\r
                    strerror(errno));\r
         }\r
     }\r
-        // remind the reader of what options are in effect\r
 \r
-    my_log("POLYGLOG Options from ini file\n");\r
-    ini_disp(ini);\r
+        // Extract some important options\r
 \r
-        // extract PG options\r
+    if((entry=ini_find(ini,"polyglot","EngineCommand"))){\r
+        option_set(Option,entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini,"polyglot","EngineDir"))){\r
+        option_set(Option,entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini,"polyglot","EngineName"))){\r
+        option_set(Option,entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini,"polyglot","Log"))){\r
+        polyglot_set_option(entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini,"polyglot","LogFile"))){\r
+        polyglot_set_option(entry->name,entry->value);\r
+    }\r
     \r
-    ini_start_iter(ini);\r
-    while((entry=ini_next(ini))){\r
-        if(my_string_case_equal(entry->section,"polyglot")){\r
-            option_set(Option,entry->name,entry->value);\r
-            option_set_default(Option,entry->name,entry->value);\r
+        // Concession to WB 4.4.0\r
+        // Treat "polyglot_1st.ini" and "polyglot_2nd.ini" specially\r
+\r
+    if(option_get_bool(Option,"WbWorkArounds3")){\r
+        const char *SettingsFile=option_get(Option,"SettingsFile");\r
+        if(strstr(SettingsFile,"polyglot_1st.ini")||\r
+           strstr(SettingsFile,"polyglot_2nd.ini")){\r
+            option_set(Option,"SettingsFile","<empty>");\r
         }\r
     }\r
 \r
-        // start logging if required\r
+        // Look at command line for logging option. It is important\r
+        // to start logging as soon as possible.\r
+\r
+     if((entry=ini_find(ini_command,"PolyGlot","Log"))){\r
+         option_set(Option,entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini_command,"PolyGlot","LogFile"))){\r
+        option_set(Option,entry->name,entry->value);\r
+    }\r
+    \r
+       // start logging if required\r
     \r
     if (option_get_bool(Option,"Log")) {\r
         my_log_open(option_get_string(Option,"LogFile"));\r
@@ -304,41 +422,24 @@ int main(int argc, char * argv[]) {
 \r
         // log welcome stuff\r
     \r
-    if(!DEBUG){\r
-        my_log("PolyGlot %s by Fabien Letouzey\n",Version);\r
-    }else{\r
-        my_log("PolyGlot %s by Fabien Letouzey (debug build)\n",Version);\r
-    }    \r
+    my_log("%s",welcome);\r
     my_log("POLYGLOT *** START ***\n");\r
-    my_log("POLYGLOT INI file \"%s\"\n",option_get_string(Option,"OptionFile"));\r
+    if(!my_string_equal(option_get_string(Option,"SettingsFile"),"<empty>")){\r
+        my_log("POLYGLOT INI file \"%s\"\n",option_get_string(Option,"SettingsFile"));\r
+    }\r
 \r
-        // open book (presumably this should go else where)\r
-    \r
-    init_book();\r
 \r
         // scavenge command line for options necessary to start the engine\r
-    \r
-    arg_index=1;\r
-    while((arg=argv[arg_index])){\r
-        if(my_string_equal(arg,"-ec") && argv[arg_index+1]){\r
-            option_set(Option,"EngineCommand",argv[arg_index+1]);\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        if(my_string_equal(arg,"-ed") && argv[arg_index+1]){\r
-            option_set(Option,"EngineDir",argv[arg_index+1]);\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        if(my_string_equal(arg,"-en") && argv[arg_index+1]){\r
-            option_set(Option,"EngineName",argv[arg_index+1]);\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        arg_index++;\r
+\r
+\r
+    if((entry=ini_find(ini_command,"PolyGlot","EngineCommand"))){\r
+        option_set(Option,entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini_command,"PolyGlot","EngineDir"))){\r
+        option_set(Option,entry->name,entry->value);\r
+    }\r
+    if((entry=ini_find(ini_command,"PolyGlot","EngineName"))){\r
+        option_set(Option,entry->name,entry->value);\r
     }\r
 \r
         // start engine\r
@@ -359,130 +460,76 @@ int main(int argc, char * argv[]) {
     \r
     uci_open(Uci,Engine);\r
 \r
-        // get engine name from engine if not supplied in config file\r
-    \r
+    option_set_default(Option,"EngineName",Uci->name);\r
+\r
+        // get engine name from engine if not supplied in config file or on\r
+        // the command line\r
+\r
     if (my_string_equal(option_get_string(Option,"EngineName"),"<empty>")) {\r
         option_set(Option,"EngineName",Uci->name);\r
     }\r
 \r
-        // what is the name of the persist file?\r
 \r
-    if(my_string_equal(option_get_string(Option,"PersistFile"),"<empty>")){\r
+        // In the case we have been invoked with NoIni or StandardIni\r
+        // we still have to load a config file.\r
+\r
+    if(my_string_equal(option_get_string(Option,"SettingsFile"),"<empty>")){\r
+\r
+            //  construct the name of the ConfigFile from the EngineName\r
+        \r
         char tmp[StringSize];\r
-       int i;\r
+        char option_file[StringSize];\r
+        int i;\r
         snprintf(tmp,sizeof(tmp),"%s.ini",\r
                  option_get_string(Option,"EngineName"));\r
         tmp[sizeof(tmp)-1]='\0';\r
-       for(i=0;i<strlen(tmp);i++){\r
-         if(tmp[i]==' '){\r
-           tmp[i]='_';\r
-         }\r
-       }\r
-        option_set(Option,"PersistFile",tmp);\r
+        for(i=0;i<strlen(tmp);i++){\r
+            if(tmp[i]==' '){\r
+                tmp[i]='_';\r
+            }\r
+        }\r
+        my_path_join(option_file,\r
+                     option_get_string(Option,"SettingsDir"),\r
+                     tmp);\r
+    // Load the config file\r
+        option_set(Option,"SettingsFile",option_file);\r
+\r
+        my_log("POLYGLOT INI file \"%s\"\n",option_get_string(Option,"SettingsFile"));\r
+        if(ini_parse(ini,option_file)){\r
+            my_log("POLYGLOT Unable to open %s\n",\r
+                   option_get_string(Option,"SettingsFile")); \r
+        }\r
     }\r
 \r
-    // Load the persist file\r
 \r
-    my_path_join(persist_path,\r
-                 option_get_string(Option,"PersistDir"),\r
-                 option_get_string(Option,"PersistFile"));\r
+    // Parse the command line and merge remaining options.\r
 \r
-    my_log("POLYGLOT PersistFile=%s\n",persist_path);   \r
-    if(ini_parse(ini_save,persist_path)){\r
-      my_log("POLYGLOT Unable to open PersistFile\n"); \r
+    ini_start_iter(ini_command);\r
+    while((entry=ini_next(ini_command))){\r
+        ini_insert(ini,entry);\r
     }\r
 \r
-    // Do we want to use the persist file?\r
-\r
-    entry=ini_find(ini_save,"polyglot","Persist");\r
-    if(!entry){\r
-      Persist=option_get_bool(Option,"Persist");\r
-    }else{\r
-      Persist=(my_string_case_equal(entry->value,"false") || \r
-              my_string_equal(entry->value,"0"))?FALSE:TRUE;\r
-    }\r
-\r
-    // if "Persist" now happens to be false, forget about the\r
-    // persist file    \r
-\r
-    if(!Persist){\r
-      my_log("POLYGLOT Ignoring PersistFile");\r
-      ini_clear(ini_save);\r
-    }\r
+        // Remind the reader about the options that are now in effect.\r
 \r
-    option_set(Option,"Persist",Persist?"true":"false");\r
-\r
-    // parse the command line and merge remaining options\r
+    my_log("POLYGLOG OPTIONS \n");\r
+    ini_disp(ini);\r
 \r
-    arg_index=1;\r
-    while((arg=argv[arg_index])){\r
-        if(my_string_equal(arg,"-log")){\r
-            ini_insert_ex(ini_save,"PolyGlot","Log","true");\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        if(my_string_equal(arg,"-lf") && argv[arg_index+1]){\r
-            ini_insert_ex(ini_save,"PolyGlot","LogFile",argv[arg_index+1]);\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        if(my_string_equal(arg,"-hash") && argv[arg_index+1]){\r
-            ini_insert_ex(ini_save,"Engine","Hash",argv[arg_index+1]);\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        if(my_string_equal(arg,"-bk") && argv[arg_index+1]){\r
-            ini_insert_ex(ini_save,"PolyGlot","Book","true");\r
-            ini_insert_ex(ini_save,"PolyGlot","BookFile",argv[arg_index+1]);\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
-        }\r
-        if((my_string_equal(arg,"-pg")||my_string_equal(arg,"-uci")) &&\r
-           argv[arg_index]){\r
-            int ret;\r
-            char section[StringSize];\r
-            char name[StringSize];\r
-            char value[StringSize];\r
-            ret=ini_line_parse(argv[arg_index++],section,name,value);\r
-            if(ret==NAME_VALUE){\r
-                if(my_string_equal(arg,"-pg")){\r
-                    ini_insert_ex(ini_save,"PolyGlot",name,value);\r
-                }else{\r
-                    ini_insert_ex(ini_save,"Engine",name,value);\r
-                }\r
+            // extract PG options\r
+    \r
+    ini_start_iter(ini);\r
+    while((entry=ini_next(ini))){\r
+        if(my_string_case_equal(entry->section,"polyglot")){\r
+            opt=option_find(Option,entry->name);\r
+            if(opt && !IS_BUTTON(opt->type)){\r
+                polyglot_set_option(entry->name,entry->value);\r
             }\r
-            arg_shift_left(argv,arg_index);\r
-            arg_shift_left(argv,arg_index);\r
-            continue;\r
         }\r
-        arg_index++;\r
     }\r
 \r
-        // remind the reader once again about options\r
-\r
-    my_log("POLYGLOG Options from PersistFile and command line\n");\r
-    ini_disp(ini_save);\r
-\r
-        // Extract PG options; this time do not set the default.\r
-        // polyglot_set_option() performs the necessary actions such\r
-        // as opening the log file/opening book etcetera.\r
-        // Ignore EngineName, EngineCommand and EngineDir\r
-        // as these are really meant as comments.\r
+        // Cater to our biggest customer:-)\r
     \r
-    ini_start_iter(ini_save);\r
-    while((entry=ini_next(ini_save))){\r
-        if(my_string_case_equal(entry->section,"polyglot")){\r
-           if(my_string_case_equal(entry->value,"EngineName")) \r
-              continue;\r
-           if(my_string_case_equal(entry->value,"EngineCommand")) \r
-              continue;\r
-           if(my_string_case_equal(entry->value,"EngineDir")) \r
-              continue;\r
-            polyglot_set_option(entry->name,entry->value);\r
-        }\r
+    if(option_get_bool(Option,"OnlyWbOptions")){\r
+        wb_select();\r
     }\r
 \r
         // done initializing\r
@@ -496,8 +543,6 @@ int main(int argc, char * argv[]) {
         if(my_string_case_equal(entry->section,"engine")){\r
                 // also updates value in Uci->option\r
             uci_send_option(Uci,entry->name,"%s",entry->value);\r
-                // since this comes from the ini file, also update default\r
-            option_set_default(Uci->option,entry->name,entry->value);\r
                 // this is inherited, it probably does not work correctly\r
            if(my_string_case_equal(entry->name,"MultiPV") &&\r
               atoi(entry->value)>1){\r
@@ -505,19 +550,8 @@ int main(int argc, char * argv[]) {
            }\r
         }\r
     }\r
-    ini_start_iter(ini_save);\r
-    while((entry=ini_next(ini_save))){\r
-        if(my_string_case_equal(entry->section,"engine")){\r
-                // also updates value in Uci->option\r
-            uci_send_option(Uci,entry->name,"%s",entry->value);\r
-                // this is inherited, it probably does not work correctly\r
-            if(my_string_case_equal(entry->name,"MultiPV") &&\r
-               atoi(entry->value)>1){\r
-                Uci->multipv_mode=TRUE;\r
-            }\r
-        }\r
-    }\r
-   \r
+\r
+    \r
     \r
         // EPD test\r
     \r
@@ -529,12 +563,16 @@ int main(int argc, char * argv[]) {
     }\r
     \r
         // Anything that hasn't been parsed yet is a syntax error\r
+        // It seems that XBoard sometimes passes empty strings as arguments\r
+        // to PolyGlot. We ignore these. \r
 \r
-    if(argv[1]){\r
-        my_fatal("main(): Unknown option: %s\n",argv[1]);\r
+    argc=1;\r
+    while((arg=argv[argc++])){\r
+        if(!my_string_equal(arg,"")){\r
+            my_fatal("main(): Option: \"%s\" not found\n",argv[argc-1]);\r
+        }\r
     }\r
 \r
-\r
     gui_init(GUI);\r
     mainloop();\r
     return EXIT_SUCCESS; \r
@@ -543,24 +581,27 @@ int main(int argc, char * argv[]) {
 // polyglot_set_option()\r
 \r
 void polyglot_set_option(const char *name, const char *value){ // this must be cleaned up!\r
-    option_t *opt;\r
+    ini_t ini[1];\r
+    int ret;\r
+    ini_init(ini);\r
     my_log("POLYGLOT Setting PolyGlot option %s=\"%s\"\n",name,value);\r
-    if(my_string_case_equal(name,"Defaults")){\r
-      option_start_iter(Uci->option);\r
-      while((opt=option_next(Uci->option))){\r
-       if(!IS_BUTTON(opt->type)){\r
-       // also sets opt->value\r
-         uci_send_option(Uci,opt->name,opt->default_);\r
-       }\r
-      }\r
-      option_start_iter(Option);\r
-      while((opt=option_next(Option))){\r
-       if(!IS_BUTTON(opt->type)){\r
-         polyglot_set_option(opt->name,opt->default_);\r
-       }\r
-      }\r
-      xboard2uci_send_options();\r
-    }\r
+    if(my_string_case_equal(name,"Save")){\r
+        ret=my_mkdir(option_get(Option,"SettingsDir"));\r
+        if(ret){\r
+            my_log("POLYGLOT polyglot_set_option(): %s: %s\n",\r
+                   option_get(Option,"SettingsDir"),\r
+                   strerror(errno));\r
+        }\r
+        make_ini(ini);\r
+        write_ini(option_get(Option,"SettingsFile"),ini);\r
+        return;\r
+    }\r
+//    if(my_string_equal(option_get(Option,name),value)){\r
+//        my_log("Not setting PolyGlot option \"%s\" "\r
+//               "since it already as the correct value.\n",\r
+//               name);\r
+//        return;\r
+//    }\r
     option_set(Option,name,value);\r
     if(option_get_bool(Option,"Book")&&(my_string_case_equal(name,"BookFile")||my_string_case_equal(name,"Book"))){\r
         my_log("POLYGLOT *** SETTING BOOK ***\n");\r
@@ -573,7 +614,7 @@ void polyglot_set_option(const char *name, const char *value){ // this must be c
         }\r
     }else if(option_get_bool(Option,"Log")&&(my_string_case_equal(name,"LogFile") ||my_string_case_equal(name,"Log"))){\r
         my_log("POLYGLOT *** SWITCHING LOGFILE ***\n");\r
-        my_log("POLYGLOT LOGFILE \"%s\"\n",option_get_string(Option,"LogFile"));\r
+        my_log("POLYGLOT NEW LOGFILE \"%s\"\n",option_get_string(Option,"LogFile"));\r
         my_log_close();\r
         my_log_open(option_get_string(Option,"LogFile"));\r
     }else if(option_get_bool(Option,"UseNice") &&(my_string_case_equal(name,"NiceValue")||my_string_case_equal(name,"UseNice"))){\r
@@ -592,32 +633,11 @@ void polyglot_set_option(const char *name, const char *value){ // this must be c
 }\r
 \r
 \r
-// init_book()\r
-\r
-static void init_book(){\r
-    book_clear();\r
-    if (option_get_bool(Option,"Book")){\r
-        my_log("POLYGLOT *** SETTING BOOK ***\n");\r
-        my_log("POLYGLOT BOOK \"%s\"\n",option_get_string(Option,"BookFile"));\r
-        book_open(option_get_string(Option,"BookFile"));\r
-        if(!book_is_open()){\r
-            my_log("POLYGLOT Unable to open book \"%s\"\n",\r
-                   option_get_string(Option,"BookFile"));\r
-        }\r
-    }\r
-}\r
-\r
 \r
 // quit()\r
 \r
 void quit() {\r
 \r
-    ini_t ini[1];\r
-    char persist_path[StringSize];\r
-    int ret;\r
-\r
-    ini_init(ini);\r
-\r
     my_log("POLYGLOT *** QUIT ***\n");\r
     \r
     if (Init) {\r
@@ -628,34 +648,7 @@ void quit() {
         engine_close(Engine);\r
         \r
     }\r
-    ret=my_mkdir(option_get(Option,"PersistDir"));\r
-    if(ret){\r
-      my_log("POLYGLOT quit(): %s: %s\n",option_get(Option,"PersistDir"),strerror(errno));\r
-    }\r
-    // PersistFile can be named "<empty>" in case of a crash before the\r
-    // engine is started. \r
-    if(!my_string_case_equal(option_get(Option,"PersistFile"),\r
-                            "<empty>")){\r
-      // Persistence should only work in XBOARD mode.\r
-      // In UCI mode the GUI is responsible for remembering options.\r
-      if(!option_get_bool(Option,"UCI")){\r
-       my_path_join(persist_path,\r
-                    option_get(Option,"PersistDir"),\r
-                    option_get(Option,"PersistFile"));\r
-       make_ini(ini);\r
-       if(option_get_bool(Option,"Persist")){\r
-         write_ini(persist_path,ini);\r
-       }else if(!my_string_case_equal(option_get_default(Option,"Persist"),\r
-                                      option_get_string(Option,"Persist"))){\r
-         // Hack\r
-         ini_insert_ex(ini,"polyglot","Persist","false");\r
-         write_ini(persist_path,ini);\r
-       }else{\r
-         write_ini(persist_path,ini);\r
-       }\r
        my_log("POLYGLOT Calling exit\n");\r
-      }\r
-    }\r
     exit(EXIT_SUCCESS);\r
 }\r
 \r
@@ -679,5 +672,5 @@ static void stop_search() {
 }\r
 \r
 \r
-// end of main.cpp\r
+// end of main.c\r
 \r