version 1.4.46b
authorH.G. Muller <h.g.muller@hccnet.nl>
Thu, 9 Jun 2011 08:07:15 +0000 (10:07 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Thu, 9 Jun 2011 08:07:15 +0000 (10:07 +0200)
16 files changed:
ChangeLog
README
config.h
configure
configure.ac
main.c
option.c
option.h
polyglot.man
polyglot.pod
polyglot.spec
uci.c
uci2uci.c
util.c
util.h
xboard2uci.c

index 78b1791..203101c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+=========1.4.46b================\r
+- The default persistence directory on Windows is now _PG. The names of the engine specific ini files are mangled so as not to contain spaces. \r
+- PG now tries to guess if a string option is really a file or a path (like in the Arena GUI). \r
 =========1.4.45b================\r
 - The engine specific config files (<myname>.ini) are now stored in a separate directory. $HOME/.polyglot on Linux and "./Polyglot Settings" on Windows. \r
 - The engine specific config files are now complete config files. So they can be used in a stand alone fashion.\r
diff --git a/README b/README
index 677348e..499acf1 100644 (file)
--- a/README
+++ b/README
@@ -32,8 +32,7 @@ SYNOPSIS
        polyglot perft [-fen fen] [-max-depth depth]
 
 DESCRIPTION
-       PolyGlot as adapter and book engine
-
+   PolyGlot as adapter and book engine
        PolyGlot is a "UCI adapter".  It connects a GUI interface (such as
        XBoard, Winboard, Arena or Chessbase) to a UCI chess engine.
 
@@ -64,8 +63,7 @@ DESCRIPTION
        NOTE: Not all options are exported, only those that make sense in the
        given mode.
 
-       Book making utilities
-
+   Book making utilities
        PolyGlot supports the "PolyGlot opening book format". This is the
        defacto standard non-proprietary opening book format. It is fully
        documented here
@@ -111,14 +109,12 @@ DESCRIPTION
        Due to the possibility of transpositions this is not a fool proof
        method.
 
-       Epd test mode
-
+   Epd test mode
        In epd test mode, PolyGlot will search positions in an epd file and
        record the number of times the right best move was found.  The
        arguments specify when to stop the search in any given position.
 
-       Perft counts
-
+   Perft counts
        A perft count is the number of legal move sequence in a given position
        up to a given depth. PolyGlot can perform such perft counts. It is
        however much slower than other more dedicated programs.
@@ -161,8 +157,7 @@ OPTIONS
 
        When invoked as
 
-       polyglot make-book
-
+   polyglot make-book
        PolyGlot supports the following options
 
        -pgn (default: "book.pgn")
@@ -195,8 +190,7 @@ OPTIONS
 
        When invoked as
 
-       polyglot merge-book
-
+   polyglot merge-book
        PolyGlot supports the following options
 
        -in1
@@ -214,8 +208,7 @@ OPTIONS
 
        When invoked as
 
-       polyglot dump-book
-
+   polyglot dump-book
        PolyGlot supports the following options
 
        -bin (default: book.bin)
@@ -229,8 +222,7 @@ OPTIONS
 
        When invoked as
 
-       polyglot info-book
-
+   polyglot info-book
        PolyGlot supports the following options
 
        -bin (default: book.bin)
@@ -242,8 +234,7 @@ OPTIONS
 
        When invoked as
 
-       polyglot epd-test
-
+   polyglot epd-test
        (possibly with a config file as first argument) PolyGlot supports
        besides the generic options described above the following additional
        options.
@@ -269,8 +260,7 @@ OPTIONS
 
        When invoked as
 
-       polyglot perft
-
+   polyglot perft
        PolyGlot supports the following options
 
        -fen (default: starting position)
@@ -298,8 +288,7 @@ CONFIG FILE FORMAT
        comment characters # or ; in option values (such as for NalimovPath),
        enclose the value in quotes.
 
-       [PolyGlot] section
-
+   [PolyGlot] section
        This section is used by PolyGlot only.  The engine is unaware of these
        options.  The list of available options is detailed below.
 
@@ -399,9 +388,9 @@ CONFIG FILE FORMAT
            Select moves according to their weights in the book. If false the
            move with the highest weight is selected.
 
-       BookRandom (default: true)
-           Select moves according to their weights in the book. If false the
-           move with the highest weight is selected.
+       BookLearn (default: false)
+           Store learning information in the book (which must be writable).
+           Currently no engine actually uses this information.
 
        BookDepth (default: 256)
            Stop using the book after this number of moves.
@@ -441,8 +430,7 @@ CONFIG FILE FORMAT
        Windows)
            The directory where the PersistFile is stored.
 
-       Work arounds
-
+   Work arounds
        Work arounds are identical to options except that they should be used
        only when necessary.  Their purpose is to try to hide problems with
        various software (not just engines).
@@ -500,8 +488,7 @@ CONFIG FILE FORMAT
            With this work around PG will send info lines at depth >=2. This
            may or may not improve the display.
 
-       [Engine] section
-
+   [Engine] section
        This section contains engine UCI options.  PolyGlot does not understand
        them, but sends the information to the engine at startup (converted to
        UCI form).  You can add any UCI option that makes sense to the engine
@@ -580,4 +567,4 @@ SEE ALSO
 
 
 
-                                  2009-09-04                       POLYGLOT(6)
+                                  2009-09-05                       POLYGLOT(6)
index 0daec99..bd86e86 100644 (file)
--- a/config.h
+++ b/config.h
 #define PACKAGE_NAME "polyglot"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "polyglot 1.4.45b"
+#define PACKAGE_STRING "polyglot 1.4.46b"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "polyglot"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "1.4.45b"
+#define PACKAGE_VERSION "1.4.46b"
 
 /* Define to 1 if the C compiler supports function prototypes. */
 #define PROTOTYPES 1
 #define TIME_WITH_SYS_TIME 1
 
 /* Version number of package */
-#define VERSION "1.4.45b"
+#define VERSION "1.4.46b"
 
 /* Define like PROTOTYPES; this can be used by system headers. */
 #define __PROTOTYPES 1
index 7cb6c80..d03e34c 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for polyglot 1.4.45b.
+# Generated by GNU Autoconf 2.61 for polyglot 1.4.46b.
 #
 # Report bugs to <michel.vandenbergh@uhasselt.be>.
 #
@@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='polyglot'
 PACKAGE_TARNAME='polyglot'
-PACKAGE_VERSION='1.4.45b'
-PACKAGE_STRING='polyglot 1.4.45b'
+PACKAGE_VERSION='1.4.46b'
+PACKAGE_STRING='polyglot 1.4.46b'
 PACKAGE_BUGREPORT='michel.vandenbergh@uhasselt.be'
 
 ac_unique_file="mainloop.c"
@@ -1207,7 +1207,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures polyglot 1.4.45b to adapt to many kinds of systems.
+\`configure' configures polyglot 1.4.46b to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1273,7 +1273,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of polyglot 1.4.45b:";;
+     short | recursive ) echo "Configuration of polyglot 1.4.46b:";;
    esac
   cat <<\_ACEOF
 
@@ -1357,7 +1357,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-polyglot configure 1.4.45b
+polyglot configure 1.4.46b
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1371,7 +1371,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by polyglot $as_me 1.4.45b, which was
+It was created by polyglot $as_me 1.4.46b, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2061,7 +2061,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='polyglot'
- VERSION='1.4.45b'
+ VERSION='1.4.46b'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -6848,7 +6848,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by polyglot $as_me 1.4.45b, which was
+This file was extended by polyglot $as_me 1.4.46b, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6901,7 +6901,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-polyglot config.status 1.4.45b
+polyglot config.status 1.4.46b
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index abf3ace..7386c1a 100644 (file)
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.61)
-AC_INIT([polyglot], [1.4.45b], [michel.vandenbergh@uhasselt.be])
+AC_INIT([polyglot], [1.4.46b], [michel.vandenbergh@uhasselt.be])
 AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR([mainloop.c])
 AC_CONFIG_HEADER([config.h])
diff --git a/main.c b/main.c
index 8d2724b..aaadc82 100644 (file)
--- a/main.c
+++ b/main.c
@@ -39,7 +39,7 @@
 // constants\r
 \r
 \r
-static const char * const Version = "1.4.45b";\r
+static const char * const Version = "1.4.46b";\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
@@ -64,6 +64,9 @@ static const char * const IniIntro=
               "; 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
@@ -88,58 +91,42 @@ static void arg_shift_left(char **argv, int index){
     }\r
 }\r
 \r
-// write_ini()\r
 \r
-static void write_ini(const char *filename,\r
-                      option_list_t *pg_options,\r
-                      option_list_t *uci_options){\r
+// make_ini()\r
+\r
+static void make_ini(ini_t *ini){\r
     option_t *opt;\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,"[PolyGlot]\n");\r
-    fprintf(f,"EngineName=%s\n",\r
-           option_get_string(Option,"EngineName"));\r
-    fprintf(f,"EngineCommand=%s\n",\r
-           option_get_string(Option,"EngineCommand"));\r
-    fprintf(f,"EngineDir=%s\n",\r
-           option_get_string(Option,"EngineDir"));\r
-    option_start_iter(pg_options);\r
-    while((opt=option_next(pg_options))){\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
+    ini_insert_ex(ini,"polyglot",\r
+                 "EngineDir",\r
+                 option_get_string(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) &&\r
+           !IS_BUTTON(opt->type) &&\r
            (opt->mode & XBOARD)){\r
-            snprintf(tmp,sizeof(tmp),"%s=%s\n",opt->name,opt->value);\r
-            tmp[sizeof(tmp)-1]='\0';\r
-            fprintf(f,"%s",tmp);\r
+         ini_insert_ex(ini,"polyglot",opt->name,opt->value);\r
         }\r
     }\r
-    fprintf(f,"[Engine]\n");\r
-    option_start_iter(uci_options);\r
-    while((opt=option_next(uci_options))){\r
+    option_start_iter(Uci->option);\r
+    while((opt=option_next(Uci->option))){\r
         if(!my_string_equal(opt->value,opt->default_)&&\r
-           !IS_BUTTON(opt)){\r
-            snprintf(tmp,sizeof(tmp),"%s=%s\n",opt->name,opt->value);\r
-            tmp[sizeof(tmp)-1]='\0';\r
-            fprintf(f,"%s",tmp);\r
+           !IS_BUTTON(opt->type)){\r
+         ini_insert_ex(ini,"engine",opt->name,opt->value);\r
         }\r
     }\r
-    fclose(f);\r
 }\r
 \r
-// write_ini_ex()\r
 \r
-static void write_ini_ex(const char *filename,\r
+// write_ini()\r
+\r
+static void write_ini(const char *filename,\r
                         ini_t *ini){\r
     ini_entry_t *entry;\r
     char tmp[StringSize];\r
@@ -156,12 +143,6 @@ static void write_ini_ex(const char *filename,
     fprintf(f,"; %s\n",ctime(&t));\r
     fprintf(f,IniIntro,option_get_string(Option,"EngineName"));\r
     fprintf(f,"[PolyGlot]\n");\r
-    fprintf(f,"EngineName=%s\n",\r
-           option_get_string(Option,"EngineName"));\r
-    fprintf(f,"EngineCommand=%s\n",\r
-           option_get_string(Option,"EngineCommand"));\r
-    fprintf(f,"EngineDir=%s\n",\r
-           option_get_string(Option,"EngineDir"));\r
     ini_start_iter(ini);\r
     while((entry=ini_next(ini))){\r
       if(my_string_case_equal(entry->section,"polyglot")){\r
@@ -388,9 +369,15 @@ int main(int argc, char * argv[]) {
 \r
     if(my_string_equal(option_get_string(Option,"PersistFile"),"<empty>")){\r
         char tmp[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
     }\r
 \r
@@ -561,14 +548,14 @@ void polyglot_set_option(const char *name, const char *value){ // this must be c
     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)){\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)){\r
+       if(!IS_BUTTON(opt->type)){\r
          polyglot_set_option(opt->name,opt->default_);\r
        }\r
       }\r
@@ -625,11 +612,11 @@ static void init_book(){
 \r
 void quit() {\r
 \r
-    ini_t empty[1];\r
+    ini_t ini[1];\r
     char persist_path[StringSize];\r
     int ret;\r
 \r
-    ini_init(empty);\r
+    ini_init(ini);\r
 \r
     my_log("POLYGLOT *** QUIT ***\n");\r
     \r
@@ -649,21 +636,25 @@ void quit() {
     // engine is started. \r
     if(!my_string_case_equal(option_get(Option,"PersistFile"),\r
                             "<empty>")){\r
-      my_path_join(persist_path,\r
-                 option_get(Option,"PersistDir"),\r
-                 option_get(Option,"PersistFile"));\r
-      if(option_get_bool(Option,"Persist")){\r
-        write_ini(persist_path,\r
-                  Option,Uci->option);\r
-      }else if(!my_string_case_equal(option_get_default(Option,"Persist"),\r
-                                    option_get_string(Option,"Persist"))){\r
-       // Hack\r
-       ini_insert_ex(empty,"PolyGlot","Persist","false");\r
-       write_ini_ex(persist_path,empty);\r
-      }else{\r
-       write_ini_ex(persist_path,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
-      my_log("POLYGLOT Calling exit\n");\r
     }\r
     exit(EXIT_SUCCESS);\r
 }\r
index ec0dc48..0052fe3 100644 (file)
--- a/option.c
+++ b/option.c
@@ -21,20 +21,20 @@ static const int  StringSize = 4096;
 option_list_t Option[1];\r
 \r
 option_t DefaultOptions[] = {    \r
-    { "OptionFile",       "string","0","0",     "polyglot.ini", NULL,0,NNB,  PG}, \r
+    { "OptionFile",       "file","0","0",     "polyglot.ini", NULL,0,NNB,  PG}, \r
 \r
    // options\r
 \r
-    { "Persist",      "check","0","0",      "true"      , NULL,0,NNB,  PG|XBOARD},\r
-    { "PersistFile",  "string","0","0",     "<empty>"   , NULL,0,NNB,  PG},\r
-    { "PersistDir",   "string","0","0",     "<empty>"   , NULL,0,NNB,  PG},\r
+    { "Persist",          "check","0","0",      "true"      , NULL,0,NNB,  PG|XBOARD},\r
+    { "PersistFile",      "file","0","0",     "<empty>"   , NULL,0,NNB,  PG},\r
+    { "PersistDir",       "path","0","0",     "<empty>"   , NULL,0,NNB,  PG},\r
     \r
     { "EngineName",       "string","0","0",     "<empty>"   , NULL,0,NNB,  PG}, \r
-    { "EngineDir",        "string","0","0",     "."         , NULL,0,NNB,  PG}, \r
+    { "EngineDir",        "path","0","0",     "."         , NULL,0,NNB,  PG}, \r
     { "EngineCommand",    "string","0","0",     "<empty>"   , NULL,0,NNB,  PG}, \r
 \r
     { "Log",              "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD|UCI}, \r
-    { "LogFile",          "string","0","0",     "polyglot.log", NULL,0,NNB,  PG|XBOARD|UCI}, \r
+    { "LogFile",          "file","0","0",     "polyglot.log", NULL,0,NNB,  PG|XBOARD|UCI}, \r
 \r
     { "UCI",              "check","0","0",      "false"     , NULL,0,NNB,  PG}, \r
 \r
@@ -50,7 +50,7 @@ option_t DefaultOptions[] = {
     { "MateScore",        "spin","0","100000",  "10000"     , NULL,0,NNB,  PG|XBOARD}, \r
 \r
     { "Book",             "check","0","0",      "false"     , NULL,0,NNB,  PG|XBOARD|UCI}, \r
-    { "BookFile",         "string","0","0",     "book.bin"  , NULL,0,NNB,  PG|XBOARD|UCI}, \r
+    { "BookFile",         "file","0","0",     "book.bin"  , NULL,0,NNB,  PG|XBOARD|UCI}, \r
 \r
     { "BookRandom",       "check","0","0",      "true"      , NULL,0,NNB,  PG|XBOARD|UCI}, \r
     { "BookDepth",        "spin","0","256",     "256"       , NULL,0,NNB,  PG|XBOARD}, \r
@@ -128,7 +128,7 @@ void option_init_pg() {
     snprintf(PersistDir,sizeof(PersistDir),"%s/.polyglot",home_dir);\r
     PersistDir[sizeof(PersistDir)-1]='\0';\r
 #else\r
-    sprintf(PersistDir,".\\Polyglot Settings");\r
+    sprintf(PersistDir,".\\_PG");\r
 #endif\r
     option_set(Option,"PersistDir",PersistDir);\r
     option_set_default(Option,"PersistDir",PersistDir);\r
index aa3190c..17468ba 100644 (file)
--- a/option.h
+++ b/option.h
 #define PG       (1<<2)\r
 #define OptionNb 256\r
 \r
-#define IS_BUTTON(opt) (my_string_case_equal(opt->type,"button") ||      \\r
-                        my_string_case_equal(opt->type,"save")   ||      \\r
-                        my_string_case_equal(opt->type,"reset"))         \\r
+#define IS_BUTTON(str) (my_string_case_equal(str,"button") ||      \\r
+                        my_string_case_equal(str,"save")   ||      \\r
+                        my_string_case_equal(str,"reset"))         \\r
 \r
-#define IS_SPIN(opt)   (my_string_case_equal(opt->type,"spin") ||        \\r
-                        my_string_case_equal(opt->type,"slider"))        \\r
+#define IS_SPIN(str)   (my_string_case_equal(str,"spin") ||        \\r
+                        my_string_case_equal(str,"slider"))        \\r
+\r
+#define IS_STRING(str) (my_string_case_equal(str,"string") ||      \\r
+                        my_string_case_equal(str,"path")   ||      \\r
+                        my_string_case_equal(str,"file"))          \\r
 \r
 // types\r
 \r
index 39f08b8..ded75ff 100644 (file)
@@ -1,15 +1,7 @@
-.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05)
+.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.05)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
-.de Sh \" Subsection heading
-.br
-.if t .Sp
-.ne 5
-.PP
-\fB\\$1\fR
-.PP
-..
 .de Sp \" Vertical space (when we can't use .PP)
 .if t .sp .5v
 .if n .sp
@@ -53,7 +45,7 @@
 .el       .ds Aq '
 .\"
 .\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
 .\" entries marked with X<> in POD.  Of course, you'll have to process the
 .\" output yourself in some meaningful fashion.
 .ie \nF \{\
 .\" ========================================================================
 .\"
 .IX Title "POLYGLOT 6"
-.TH POLYGLOT 6 "2009-09-04" "" ""
+.TH POLYGLOT 6 "2009-09-05" "" ""
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
@@ -160,7 +152,7 @@ polyglot [configfile] epd-test [engineoptions] [\-epd inputfile] [\-min\-depth d
 polyglot perft [\-fen fen] [\-max\-depth depth]
 .SH "DESCRIPTION"
 .IX Header "DESCRIPTION"
-.Sh "PolyGlot as adapter and book engine"
+.SS "PolyGlot as adapter and book engine"
 .IX Subsection "PolyGlot as adapter and book engine"
 PolyGlot is a \*(L"\s-1UCI\s0 adapter\*(R".  It connects a \s-1GUI\s0 interface (such as
 XBoard, Winboard, Arena or Chessbase) to a \s-1UCI\s0 chess engine.
@@ -191,7 +183,7 @@ by \*(L"Polyglot\*(R". This makes it easy to filter them in the \s-1GUI\s0.
 .PP
 \&\s-1NOTE:\s0 Not all options are exported, only those that make sense in the
 given mode.
-.Sh "Book making utilities"
+.SS "Book making utilities"
 .IX Subsection "Book making utilities"
 PolyGlot supports the \*(L"PolyGlot opening book format\*(R". This is the
 defacto standard non-proprietary opening book format. It is fully documented
@@ -236,12 +228,12 @@ it is difficult to identify the latter. If invoked with \*(L"\-exact\*(R" the
 utility info-book will attempt to count the isolated positions which
 require a player to make a non-book move when a book move is available.
 Due to the possibility of transpositions this is not a fool proof method.
-.Sh "Epd test mode"
+.SS "Epd test mode"
 .IX Subsection "Epd test mode"
 In epd test mode, PolyGlot will search positions in an epd file and
 record the number of times the right best move was found.  The
 arguments specify when to stop the search in any given position.
-.Sh "Perft counts"
+.SS "Perft counts"
 .IX Subsection "Perft counts"
 A perft count is the number of legal move sequence in a given position
 up to a given depth. PolyGlot can perform such perft counts. It
@@ -290,7 +282,7 @@ This is an alias for \-pg \*(L"LogFile=<value>\*(R".
 This is an alias for \-pg \*(L"Book=true\*(R" \-pg \*(L"BookFile=<value>\*(R".
 .PP
 When invoked as
-.Sh "polyglot make-book"
+.SS "polyglot make-book"
 .IX Subsection "polyglot make-book"
 PolyGlot supports the following options
 .ie n .IP "\fB\-pgn\fR (default: ""book.pgn"")" 4
@@ -325,7 +317,7 @@ equal probability.
 .PP
 When invoked
 as
-.Sh "polyglot merge-book"
+.SS "polyglot merge-book"
 .IX Subsection "polyglot merge-book"
 PolyGlot supports the following options
 .IP "\fB\-in1\fR" 4
@@ -344,7 +336,7 @@ moves and weights from \*(L"in1\*(R" will be retained in \*(L"out\*(R".
 .PP
 When invoked
 as
-.Sh "polyglot dump-book"
+.SS "polyglot dump-book"
 .IX Subsection "polyglot dump-book"
 PolyGlot supports the following options
 .IP "\fB\-bin\fR (default: book.bin)" 4
@@ -359,7 +351,7 @@ The name of the output file.
 .PP
 When invoked
 as
-.Sh "polyglot info-book"
+.SS "polyglot info-book"
 .IX Subsection "polyglot info-book"
 PolyGlot supports the following options
 .IP "\fB\-bin\fR (default: book.bin)" 4
@@ -371,7 +363,7 @@ Attempt to count the provably unreachable positions among the isolated ones.
 Note that this takes a very long time.
 .PP
 When invoked as
-.Sh "polyglot epd-test"
+.SS "polyglot epd-test"
 .IX Subsection "polyglot epd-test"
 (possibly with a config file as first argument) PolyGlot supports
 besides the generic options described above the following additional
@@ -396,7 +388,7 @@ Minimal search depth when the search is stopped using \*(L"\-depth\-delta\*(R".
 Minimal search time when the search is stopped using \*(L"\-depth\-delta\*(R".
 .PP
 When invoked as
-.Sh "polyglot perft"
+.SS "polyglot perft"
 .IX Subsection "polyglot perft"
 PolyGlot supports the following
 options
@@ -427,7 +419,7 @@ By default initial and final white space is stripped from option
 values. If you want to avoid this, or if you want use one of
 the comment characters # or ; in option values (such as for NalimovPath), 
 enclose the value in quotes.
-.Sh "[PolyGlot] section"
+.SS "[PolyGlot] section"
 .IX Subsection "[PolyGlot] section"
 This section is used by PolyGlot only.  The engine is unaware of these
 options.  The list of available options is detailed below.
@@ -527,10 +519,10 @@ does not matter.
 .IX Item "BookRandom (default: true)"
 Select moves according to their weights in the book. If false the move
 with the highest weight is selected.
-.IP "\fBBookRandom\fR (default: true)" 4
-.IX Item "BookRandom (default: true)"
-Select moves according to their weights in the book. If false the move
-with the highest weight is selected.
+.IP "\fBBookLearn\fR (default: false)" 4
+.IX Item "BookLearn (default: false)"
+Store learning information in the book (which must be writable). Currently
+no engine actually uses this information.
 .IP "\fBBookDepth\fR (default: 256)" 4
 .IX Item "BookDepth (default: 256)"
 Stop using the book after this number of moves.
@@ -567,7 +559,7 @@ file, or delete it to restore the default options.
 .el .IP "\fBPersistDir\fR (default: \f(CW$HOME\fR/.polyglot on Linux; ``.\ePolyglot Settings'' on Windows)" 4
 .IX Item "PersistDir (default: $HOME/.polyglot on Linux; .Polyglot Settings on Windows)"
 The directory where the PersistFile is stored.
-.Sh "Work arounds"
+.SS "Work arounds"
 .IX Subsection "Work arounds"
 Work arounds are identical to options except that they should be used
 only when necessary.  Their purpose is to try to hide problems with
@@ -622,7 +614,7 @@ Engines that send options with \*(L"Draw\*(R" in their name are Rybka and \s-1HI
 Old version of Winboard clear the engine output window at depth 1. With this
 work around \s-1PG\s0 will send info lines at depth >=2. This may or may not improve
 the display.
-.Sh "[Engine] section"
+.SS "[Engine] section"
 .IX Subsection "[Engine] section"
 This section contains engine \s-1UCI\s0 options.  PolyGlot does not
 understand them, but sends the information to the engine at startup
index 67c10d0..a7c60d7 100644 (file)
@@ -481,10 +481,10 @@ does not matter.
 Select moves according to their weights in the book. If false the move
 with the highest weight is selected. 
 
-=item B<BookRandom> (default: true)
+=item B<BookLearn> (default: false)
 
-Select moves according to their weights in the book. If false the move
-with the highest weight is selected. 
+Store learning information in the book (which must be writable). Currently
+no engine actually uses this information. 
 
 =item B<BookDepth> (default: 256)
 
index ca3c1df..f3c173f 100644 (file)
@@ -1,6 +1,6 @@
 Summary: A Winboard protocol to UCI protocol adapter
 Name: polyglot
-Version: 1.4.45b
+Version: 1.4.46b
 Release: 1
 License: GPL
 Group: Amusement/Games
diff --git a/uci.c b/uci.c
index 574c288..9326ec7 100644 (file)
--- a/uci.c
+++ b/uci.c
@@ -58,6 +58,29 @@ static int  mate_score     (int dist);
 \r
 // functions\r
 \r
+\r
+// uci_adapt_UCI3()\r
+\r
+static void apply_UCI3_heuristics(option_t *opt){\r
+  if(option_get_int(Option,"UCIVersion")>2){\r
+    return;\r
+  }\r
+  if(!my_string_equal(opt->type,"string")){\r
+    return;\r
+  }\r
+  if(!strncmp(opt->name,"UCI_",4)){\r
+    return;\r
+  }\r
+  if(my_string_case_contains(opt->name,"file")){\r
+    my_string_set(&opt->type,"file");\r
+    return;\r
+  }\r
+  if(my_string_case_contains(opt->name,"path")){\r
+    my_string_set(&opt->type,"path");\r
+    return;\r
+  }\r
+}\r
+\r
 // uci_set_threads()\r
 \r
 void uci_set_threads(uci_t * uci, int n) {\r
@@ -271,7 +294,7 @@ bool uci_send_option(uci_t * uci, const char option[], const char format[], ...)
    opt=option_find(uci->option,option);\r
    if(opt){\r
        found=TRUE;\r
-       if(!IS_BUTTON(opt)){\r
+       if(!IS_BUTTON(opt->type)){\r
            if(!my_string_equal(opt->value,value)){\r
                engine_send(uci->engine,"setoption name %s value %s",\r
                            opt->name,value);\r
@@ -805,6 +828,8 @@ static void parse_option(uci_t * uci, const char string[]) {
    }\r
 \r
    parse_close(parse);\r
+\r
+   apply_UCI3_heuristics(opt);\r
    option_insert(uci->option,opt);\r
    option_free(opt);\r
 \r
index f7cb63e..c9341bb 100644 (file)
--- a/uci2uci.c
+++ b/uci2uci.c
@@ -33,6 +33,26 @@ static int SavedMove=MoveNone;
 
 static void send_uci_options();
 
+
+// normalize_type()
+
+static void normalize_type(char *dst, const char* src){
+  if(option_get_int(Option,"UCIVersion") <=2){
+    if(IS_STRING(src)){
+      strcpy(dst,"string");
+      return;
+    }else if(IS_SPIN(src)){
+      strcpy(dst,"spin");
+    }else if(IS_BUTTON(src)){
+      strcpy(dst,"button");
+    }else{
+      strcpy(dst,src);
+    }
+  }else{
+    strcpy(dst,src);
+  }
+}
+
 // parse_position()
 
 static void parse_position(const char string[]) {
@@ -119,6 +139,7 @@ static void send_book_move(int move){
 
 static void format_uci_option_line(char * option_line,option_t *opt){
     char option_string[StringSize];
+    char type[StringSize];
     int j;
     strcpy(option_line,"");
         // buffer overflow alert
@@ -128,17 +149,18 @@ static void format_uci_option_line(char * option_line,option_t *opt){
     }
     sprintf(option_string," %s",opt->name);
     strcat(option_line,option_string);
-    sprintf(option_string," type %s",opt->type);
+    normalize_type(type,opt->type);
+    sprintf(option_string," type %s",type);
     strcat(option_line,option_string);
-    if(!IS_BUTTON(opt)){
-        sprintf(option_string," default %s",opt->default_);
+    if(!IS_BUTTON(opt->type)){
+        sprintf(option_string," default %s",opt->value);
         strcat(option_line,option_string);
     }
-    if(IS_SPIN(opt)){
+    if(IS_SPIN(opt->type)){
         sprintf(option_string," min %s",opt->min);
         strcat(option_line,option_string);
     }
-    if(IS_SPIN(opt)){
+    if(IS_SPIN(opt->type)){
         sprintf(option_string," max %s",opt->max);
         strcat(option_line,option_string);
     }
diff --git a/util.c b/util.c
index a5af117..32413ab 100644 (file)
--- a/util.c
+++ b/util.c
@@ -316,6 +316,44 @@ bool my_string_case_equal(const char string_1[], const char string_2[]) {
    return FALSE;\r
 }\r
 \r
+// my_strtolower()\r
+\r
+void my_string_tolower(char *dst, const char *src){\r
+  int c;\r
+  ASSERT(src!=NULL);\r
+  ASSERT(dst!=NULL);\r
+  while((c=*(src++))){\r
+    *dst=tolower(c);\r
+    dst++;\r
+  }\r
+  *(dst++)='\0';\r
+}\r
+\r
+// my_string_case_contains()\r
+\r
+const char* my_string_case_contains(const char string_1[], const char string_2[]){\r
+   \r
+   char tmp1[StringSize];\r
+   char tmp2[StringSize];\r
+   char *where;\r
+\r
+\r
+   ASSERT(string_1!=NULL);\r
+   ASSERT(string_2!=NULL);\r
+\r
+   my_string_tolower(tmp1,string_1);\r
+   my_string_tolower(tmp2,string_2);\r
+\r
+   where=strstr(tmp1,tmp2);\r
+   if(where){\r
+      return string_1+(where-tmp1);\r
+   }\r
+   return NULL;\r
+\r
+  \r
+}\r
+\r
+\r
 // my_strdup()\r
 \r
 char * my_strdup(const char string[]) {\r
@@ -355,6 +393,8 @@ void my_string_set(const char * * variable, const char string[]) {
    *variable = my_strdup(string);\r
 }\r
 \r
+// now_real()\r
+\r
 double now_real() {\r
 #ifndef _WIN32\r
    struct timeval tv[1];\r
diff --git a/util.h b/util.h
index a571ec8..4eee73a 100644 (file)
--- a/util.h
+++ b/util.h
@@ -152,6 +152,12 @@ extern bool   my_string_empty       (const char string[]);
 extern bool   my_string_whitespace  (const char string[]);\r
 extern bool   my_string_equal       (const char string_1[], const char string_2[]);\r
 extern bool   my_string_case_equal  (const char string_1[], const char string_2[]);\r
+extern const char* my_string_case_contains(const char haystack[], \r
+                                          const char needle[]);\r
+\r
+\r
+extern bool   my_string_to_lower    (char dst[], const char src[]);\r
+\r
 extern char * my_strdup             (const char string[]);\r
 \r
 extern void   my_string_clear       (const char * * variable);\r
index 2097de9..e490906 100644 (file)
@@ -774,7 +774,7 @@ void format_xboard_option_line(char * option_line, option_t *opt){
     strcat(option_line,option_string);\r
     sprintf(option_string," -%s",opt->type);\r
     strcat(option_line,option_string);\r
-    if(!IS_BUTTON(opt) && strcmp(opt->type,"combo")){\r
+    if(!IS_BUTTON(opt->type) && strcmp(opt->type,"combo")){\r
         if(strcmp(opt->type,"check")){\r
             sprintf(option_string," %s",opt->value);\r
         }else{\r
@@ -785,11 +785,11 @@ void format_xboard_option_line(char * option_line, option_t *opt){
         }\r
         strcat(option_line,option_string);\r
     }\r
-    if(IS_SPIN(opt)){\r
+    if(IS_SPIN(opt->type)){\r
         sprintf(option_string," %s",opt->min);\r
             strcat(option_line,option_string);\r
     }\r
-    if(IS_SPIN(opt)){\r
+    if(IS_SPIN(opt->type)){\r
         sprintf(option_string," %s",opt->max);\r
         strcat(option_line,option_string);\r
     }\r