version 1.4b26
authorH.G. Muller <h.g.muller@hccnet.nl>
Thu, 9 Jun 2011 07:51:04 +0000 (09:51 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Thu, 9 Jun 2011 07:51:04 +0000 (09:51 +0200)
12 files changed:
ChangeLog
config.h
configure
configure.ac
engine.cpp
gui.cpp
io.cpp
main.cpp
mainloop.cpp
pipe.cpp
pipe.h
polyglot.spec

index 1ce2f42..dc5959b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+=========1.4b26===========\r
+- Contraction of version number.\r
+- Log if SetProcessAffinityMask is not available (suggested by E.M.).\r
+- pipe.cpp : Make PipeStruct a proper class with private/public members.\r
+- Check for EOF in GUI input.\r
+- pipe.cpp : delay reporting EOF until buffer is empty.\r
+- Messages from the Engine to PG were not logged in the windows version.\r
 =========1.4w10UCIb24===========\r
 - Portability fixes for WIN9X (Eric Mullins).\r
 - Portability fixes for MSVC++ (Eric Mullins).\r
index 17b64ef..e00a8b5 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.4w10UCIb24"
+#define PACKAGE_STRING "polyglot 1.4b26"
 
 /* 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.4w10UCIb24"
+#define PACKAGE_VERSION "1.4b26"
 
 /* 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.4w10UCIb24"
+#define VERSION "1.4b26"
 
 /* Define like PROTOTYPES; this can be used by system headers. */
 #define __PROTOTYPES 1
index 16d6bb9..752001a 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.4w10UCIb24.
+# Generated by GNU Autoconf 2.61 for polyglot 1.4b26.
 #
 # 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.4w10UCIb24'
-PACKAGE_STRING='polyglot 1.4w10UCIb24'
+PACKAGE_VERSION='1.4b26'
+PACKAGE_STRING='polyglot 1.4b26'
 PACKAGE_BUGREPORT='michel.vandenbergh@uhasselt.be'
 
 ac_unique_file="mainloop.cpp"
@@ -1216,7 +1216,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.4w10UCIb24 to adapt to many kinds of systems.
+\`configure' configures polyglot 1.4b26 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1282,7 +1282,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of polyglot 1.4w10UCIb24:";;
+     short | recursive ) echo "Configuration of polyglot 1.4b26:";;
    esac
   cat <<\_ACEOF
 
@@ -1368,7 +1368,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-polyglot configure 1.4w10UCIb24
+polyglot configure 1.4b26
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1382,7 +1382,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.4w10UCIb24, which was
+It was created by polyglot $as_me 1.4b26, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2072,7 +2072,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='polyglot'
- VERSION='1.4w10UCIb24'
+ VERSION='1.4b26'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -7344,7 +7344,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.4w10UCIb24, which was
+This file was extended by polyglot $as_me 1.4b26, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -7397,7 +7397,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-polyglot config.status 1.4w10UCIb24
+polyglot config.status 1.4b26
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index 3e195b8..9cabff7 100644 (file)
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.61)
-AC_INIT([polyglot], [1.4w10UCIb24], [michel.vandenbergh@uhasselt.be])
+AC_INIT([polyglot], [1.4b26], [michel.vandenbergh@uhasselt.be])
 AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR([mainloop.cpp])
 AC_CONFIG_HEADER([config.h])
index b6c0f4b..f86f0fb 100644 (file)
@@ -323,14 +323,18 @@ engine_t Engine[1];
 \r
 void set_affinity(engine_t *engine, int affin){\r
        if(affin==-1) return;\r
-    {   typedef void (WINAPI *SPAM)(HANDLE, int);\r
-       SPAM pSPAM;\r
-\r
-       pSPAM = (SPAM) GetProcAddress(\r
-           GetModuleHandle(TEXT("kernel32.dll")), \r
-           "SetProcessAffinityMask");\r
-       if(NULL != pSPAM) // [HGM] avoid crash on Win95 by first checking if API call exists\r
-           pSPAM((engine->io).hProcess,affin);\r
+\r
+    typedef void (WINAPI *SPAM)(HANDLE, int);\r
+    SPAM pSPAM;\r
+    pSPAM = (SPAM) GetProcAddress(\r
+        GetModuleHandle(TEXT("kernel32.dll")), \r
+        "SetProcessAffinityMask");\r
+    if(NULL != pSPAM){\r
+            // [HGM] avoid crash on Win95 by first checking if API call exists\r
+        my_log("POLYGLOT Setting process affinity to %d\n",affin);\r
+        pSPAM((engine->io).hProcess,affin);\r
+    }else{\r
+        my_log("POLYGLOT API call \"SetProcessAffinityMask\" not available\n");\r
     }\r
 }\r
 \r
@@ -371,9 +375,8 @@ void engine_close(engine_t * engine){
     char string[StringSize];\r
     (engine->io).Close();\r
         // TODO: Timeout\r
-    while (!engine_eof(Engine)) { \r
-        engine_get_non_blocking(Engine,string,StringSize);\r
-        Idle();\r
+    while (!engine_eof(engine)) { \r
+      engine_get(Engine,string,StringSize);\r
     }\r
     (engine->io).Kill();\r
 }\r
@@ -412,13 +415,14 @@ bool engine_eof(engine_t *engine){
 \r
 bool engine_get_non_blocking(engine_t * engine, char *szLineStr, int size){\r
     if(engine_eof(engine)){ return false;}\r
-       if ((engine->io).GetBuffer(szLineStr)) {\r
+    if ((engine->io).GetBuffer(szLineStr)) {\r
         my_log("Engine->Adapter: %s\n",szLineStr);\r
         return true;\r
     } else {\r
         szLineStr[0]='\0';\r
         if(engine->io.EOF_()){\r
             engine->state|=ENGINE_EOF;\r
+           my_log("POLYGLOT *** EOF from Engine ***\n");\r
         }\r
         return false;\r
     }\r
@@ -427,7 +431,10 @@ bool engine_get_non_blocking(engine_t * engine, char *szLineStr, int size){
 void engine_get(engine_t * engine, char *szLineStr, int size){\r
     (engine->io).LineInput(szLineStr);\r
     if(engine->io.EOF_()){\r
-        engine->state|=ENGINE_EOF;\r
+      engine->state|=ENGINE_EOF;\r
+      my_log("POLYGLOT *** EOF from Engine ***\n");\r
+    }else{\r
+      my_log("Engine->Adapter: %s\n",szLineStr);\r
     }\r
 }\r
 \r
diff --git a/gui.cpp b/gui.cpp
index dac260f..71d0cc0 100644 (file)
--- a/gui.cpp
+++ b/gui.cpp
@@ -68,7 +68,11 @@ bool gui_get_non_blocking(gui_t * gui, char string[], int size) {
        return false;
    }
 #else
-   if ((gui->io).GetBuffer(string)) {
+   if((gui->io).EOF_()){
+        my_log("POLYGLOT *** EOF from GUI ***\n");
+        quit();
+        return true; // we never get here
+   }else if ((gui->io).GetBuffer(string)) {
        my_log("GUI->Adapter: %s\n", string);
        return true;
    } else {
@@ -83,6 +87,10 @@ bool gui_get_non_blocking(gui_t * gui, char string[], int size) {
 void gui_get(gui_t * gui, char string[], int size) {
     bool data_available;
 #ifdef _WIN32
+    if((gui->io).EOF_()){
+        my_log("POLYGLOT *** EOF from GUI ***\n");
+        quit();
+    }
     (gui->io).LineInput(string);
     my_log("GUI->Adapter: %s\n", string);
 #else
diff --git a/io.cpp b/io.cpp
index 7246e89..b53d94c 100644 (file)
--- a/io.cpp
+++ b/io.cpp
-#ifndef _WIN32\r
-\r
-// io.cpp\r
-\r
-// includes\r
-\r
-#include <cerrno>\r
-#include <cstdarg>\r
-#include <cstdio>\r
-#include <cstdlib>\r
-#include <cstring>\r
-\r
-#include <sys/types.h>\r
-#include <unistd.h>\r
-\r
-#include "io.h"\r
-#include "util.h"\r
-\r
-// constants\r
-\r
-static const bool UseDebug = false;\r
-static const bool UseCR = false;\r
-\r
-static const int StringSize = 4096;\r
-\r
-static const char LF = '\n';\r
-static const char CR = '\r';\r
-\r
-// prototypes\r
-\r
-static int  my_read  (int fd, char string[], int size);\r
-static void my_write (int fd, const char string[], int size);\r
-\r
-// functions\r
-\r
-// io_is_ok()\r
-\r
-bool io_is_ok(const io_t * io) {\r
-\r
-   if (io == NULL) return false;\r
-\r
-   if (io->name == NULL) return false;\r
-\r
-   if (io->in_eof != true && io->in_eof != false) return false;\r
-\r
-   if (io->in_size < 0 || io->in_size > BufferSize) return false;\r
-   if (io->out_size < 0 || io->out_size > BufferSize) return false;\r
-\r
-   return true;\r
-}\r
-\r
-// io_init()\r
-\r
-void io_init(io_t * io) {\r
-\r
-   ASSERT(io!=NULL);\r
-\r
-   io->in_eof = false;\r
-\r
-   io->in_size = 0;\r
-   io->out_size = 0;\r
-\r
-   ASSERT(io_is_ok(io));\r
-}\r
-\r
-// io_close()\r
-\r
-void io_close(io_t * io) {\r
-\r
-   ASSERT(io_is_ok(io));\r
-\r
-   ASSERT(io->out_fd>=0);\r
-\r
-   my_log("> %s EOF\n",io->name);\r
-\r
-   if (close(io->out_fd) == -1) {\r
-      my_fatal("io_close(): close(): %s\n",strerror(errno));\r
-   }\r
-\r
-   io->out_fd = -1;\r
-}\r
-\r
-// io_get_update()\r
-\r
-void io_get_update(io_t * io) {\r
-\r
-   int pos, size;\r
-   int n;\r
-\r
-   ASSERT(io_is_ok(io));\r
-\r
-   ASSERT(io->in_fd>=0);\r
-   ASSERT(!io->in_eof);\r
-\r
-   // init\r
-\r
-   pos = io->in_size;\r
-\r
-   size = BufferSize - pos;\r
-   if (size <= 0) my_fatal("io_get_update(): buffer overflow\n");\r
-\r
-   // read as many data as possible\r
-   n = my_read(io->in_fd,&io->in_buffer[pos],size);\r
-   if (UseDebug) my_log("POLYGLOT read %d byte%s from %s\n",n,(n>1)?"s":"",io->name);\r
-\r
-   if (n > 0) { // at least one character was read\r
-\r
-      // update buffer size\r
-\r
-      ASSERT(n>=1&&n<=size);\r
-\r
-      io->in_size += n;\r
-      ASSERT(io->in_size>=0&&io->in_size<=BufferSize);\r
-\r
-   } else { // EOF\r
-\r
-      ASSERT(n==0);\r
-\r
-      io->in_eof = true;\r
-   }\r
-}\r
-\r
-// io_line_ready()\r
-\r
-bool io_line_ready(const io_t * io) {\r
-\r
-   ASSERT(io_is_ok(io));\r
-\r
-   if (io->in_eof) return true;\r
-\r
-   if (memchr(io->in_buffer,LF,io->in_size) != NULL) return true; // buffer contains LF\r
-\r
-   return false;\r
-}\r
-\r
-// io_get_line()\r
-\r
-bool io_get_line(io_t * io, char string[], int size) {\r
-\r
-   int src, dst;\r
-   int c;\r
-\r
-   ASSERT(io_is_ok(io));\r
-   ASSERT(string!=NULL);\r
-   ASSERT(size>=256);\r
-\r
-   src = 0;\r
-   dst = 0;\r
-\r
-   while (true) {\r
-\r
-      // test for end of buffer\r
-\r
-      if (src >= io->in_size) {\r
-         if (io->in_eof) {\r
-            my_log("%s->Adapter: EOF\n",io->name);\r
-            return false;\r
-         } else {\r
-            my_fatal("io_get_line(): no EOL in buffer\n");\r
-         }\r
-      }\r
-\r
-      // test for end of string\r
-\r
-      if (dst >= size) my_fatal("io_get_line(): buffer overflow\n");\r
-\r
-      // copy the next character\r
-\r
-      c = io->in_buffer[src++];\r
-\r
-      if (c == LF) { // LF => line complete\r
-         string[dst] = '\0';\r
-         break;\r
-      } else if (c != CR) { // skip CRs\r
-         string[dst++] = c;\r
-      }\r
-   }\r
-\r
-   // shift the buffer\r
-\r
-   ASSERT(src>0);\r
-\r
-   io->in_size -= src;\r
-   ASSERT(io->in_size>=0);\r
-\r
-   if (io->in_size > 0) memmove(&io->in_buffer[0],&io->in_buffer[src],io->in_size);\r
-\r
-   // return\r
-\r
-   my_log("%s->Adapter: %s\n",io->name,string);\r
-\r
-   return true;\r
-}\r
-\r
-// io_send()\r
-\r
-void io_send(io_t * io, const char format[], ...) {\r
-\r
-   va_list arg_list;\r
-   char string[StringSize];\r
-   int len;\r
-\r
-   ASSERT(io_is_ok(io));\r
-   ASSERT(format!=NULL);\r
-\r
-   ASSERT(io->out_fd>=0);\r
-\r
-   // format\r
-\r
-   va_start(arg_list,format);\r
-   vsprintf(string,format,arg_list);\r
-   va_end(arg_list);\r
-\r
-   // append string to buffer\r
-\r
-   len = strlen(string);\r
-   if (io->out_size + len > BufferSize-2) my_fatal("io_send(): buffer overflow\n");\r
-\r
-   memcpy(&io->out_buffer[io->out_size],string,len);\r
-   io->out_size += len;\r
-\r
-   ASSERT(io->out_size>=0&&io->out_size<=BufferSize-2);\r
-\r
-   // log\r
-\r
-   io->out_buffer[io->out_size] = '\0';\r
-   my_log("Adapter->%s: %s\n",io->name,io->out_buffer);\r
-//     my_log("> %f %s %s\n",now_real(),io->name,io->out_buffer);\r
-   // append EOL to buffer\r
-\r
-   if (UseCR) io->out_buffer[io->out_size++] = CR;\r
-   io->out_buffer[io->out_size++] = LF;\r
-\r
-   ASSERT(io->out_size>=0&&io->out_size<=BufferSize);\r
-\r
-   // flush buffer\r
-\r
-   if (UseDebug) my_log("POLYGLOT writing %d byte%s to %s\n",io->out_size,(io->out_size>1)?"s":"",io->name);\r
-   my_write(io->out_fd,io->out_buffer,io->out_size);\r
-\r
-   io->out_size = 0;\r
-}\r
-\r
-// io_send_queue()\r
-\r
-void io_send_queue(io_t * io, const char format[], ...) {\r
-\r
-   va_list arg_list;\r
-   char string[StringSize];\r
-   int len;\r
-\r
-   ASSERT(io_is_ok(io));\r
-   ASSERT(format!=NULL);\r
-\r
-   ASSERT(io->out_fd>=0);\r
-\r
-   // format\r
-\r
-   va_start(arg_list,format);\r
-   vsprintf(string,format,arg_list);\r
-   va_end(arg_list);\r
-\r
-   // append string to buffer\r
-\r
-   len = strlen(string);\r
-   if (io->out_size + len > BufferSize-2) my_fatal("io_send_queue(): buffer overflow\n");\r
-\r
-   memcpy(&io->out_buffer[io->out_size],string,len);\r
-   io->out_size += len;\r
-\r
-   ASSERT(io->out_size>=0&&io->out_size<=BufferSize-2);\r
-}\r
-\r
-// my_read()\r
-\r
-static int my_read(int fd, char string[], int size) {\r
-\r
-   int n;\r
-\r
-   ASSERT(fd>=0);\r
-   ASSERT(string!=NULL);\r
-   ASSERT(size>0);\r
-\r
-   do {\r
-      n = read(fd,string,size);\r
-   } while (n == -1 && errno == EINTR);\r
-\r
-   if (n == -1) my_fatal("my_read(): read(): %s\n",strerror(errno));\r
-\r
-   ASSERT(n>=0);\r
-\r
-   return n;\r
-}\r
-\r
-// my_write()\r
-\r
-static void my_write(int fd, const char string[], int size) {\r
-\r
-   int n;\r
-\r
-   ASSERT(fd>=0);\r
-   ASSERT(string!=NULL);\r
-   ASSERT(size>0);\r
-\r
-   do {\r
-\r
-      n = write(fd,string,size);\r
-\r
-      // if (n == -1 && errno != EINTR && errno != EPIPE) my_fatal("my_write(): write(): %s\n",strerror(errno));\r
-\r
-      if (n == -1) {\r
-         if (false) {\r
-         } else if (errno == EINTR) {\r
-            n = 0; // nothing has been written\r
-         } else if (errno == EPIPE) {\r
-            n = size; // pretend everything has been written\r
-         } else {\r
-            my_fatal("my_write(): write(): %s\n",strerror(errno));\r
-         }\r
-      }\r
-\r
-      ASSERT(n>=0);\r
-\r
-      string += n;\r
-      size -= n;\r
-\r
-   } while (size > 0);\r
-\r
-   ASSERT(size==0);\r
-}\r
-\r
-// end of io.cpp\r
-\r
-#endif\r
+#ifndef _WIN32
+
+// io.cpp
+
+// includes
+
+#include <cerrno>
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "io.h"
+#include "util.h"
+
+// constants
+
+static const bool UseDebug = false;
+static const bool UseCR = false;
+
+static const int StringSize = 4096;
+
+static const char LF = '\n';
+static const char CR = '\r';
+
+// prototypes
+
+static int  my_read  (int fd, char string[], int size);
+static void my_write (int fd, const char string[], int size);
+
+// functions
+
+// io_is_ok()
+
+bool io_is_ok(const io_t * io) {
+
+   if (io == NULL) return false;
+
+   if (io->name == NULL) return false;
+
+   if (io->in_eof != true && io->in_eof != false) return false;
+
+   if (io->in_size < 0 || io->in_size > BufferSize) return false;
+   if (io->out_size < 0 || io->out_size > BufferSize) return false;
+
+   return true;
+}
+
+// io_init()
+
+void io_init(io_t * io) {
+
+   ASSERT(io!=NULL);
+
+   io->in_eof = false;
+
+   io->in_size = 0;
+   io->out_size = 0;
+
+   ASSERT(io_is_ok(io));
+}
+
+// io_close()
+
+void io_close(io_t * io) {
+
+   ASSERT(io_is_ok(io));
+
+   ASSERT(io->out_fd>=0);
+
+   my_log("Adapter>Engine: EOF\n",io->name);
+
+   if (close(io->out_fd) == -1) {
+      my_fatal("io_close(): close(): %s\n",strerror(errno));
+   }
+
+   io->out_fd = -1;
+}
+
+// io_get_update()
+
+void io_get_update(io_t * io) {
+
+   int pos, size;
+   int n;
+
+   ASSERT(io_is_ok(io));
+
+   ASSERT(io->in_fd>=0);
+   ASSERT(!io->in_eof);
+
+   // init
+
+   pos = io->in_size;
+
+   size = BufferSize - pos;
+   if (size <= 0) my_fatal("io_get_update(): buffer overflow\n");
+
+   // read as many data as possible
+   n = my_read(io->in_fd,&io->in_buffer[pos],size);
+   if (UseDebug) my_log("POLYGLOT read %d byte%s from %s\n",n,(n>1)?"s":"",io->name);
+
+   if (n > 0) { // at least one character was read
+
+      // update buffer size
+
+      ASSERT(n>=1&&n<=size);
+
+      io->in_size += n;
+      ASSERT(io->in_size>=0&&io->in_size<=BufferSize);
+
+   } else { // EOF
+
+      ASSERT(n==0);
+
+      io->in_eof = true;
+   }
+}
+
+// io_line_ready()
+
+bool io_line_ready(const io_t * io) {
+
+   ASSERT(io_is_ok(io));
+
+   if (io->in_eof) return true;
+
+   if (memchr(io->in_buffer,LF,io->in_size) != NULL) return true; // buffer contains LF
+
+   return false;
+}
+
+// io_get_line()
+
+bool io_get_line(io_t * io, char string[], int size) {
+
+   int src, dst;
+   int c;
+
+   ASSERT(io_is_ok(io));
+   ASSERT(string!=NULL);
+   ASSERT(size>=256);
+
+   src = 0;
+   dst = 0;
+
+   while (true) {
+
+      // test for end of buffer
+
+      if (src >= io->in_size) {
+         if (io->in_eof) {
+            my_log("%s->Adapter: EOF\n",io->name);
+            return false;
+         } else {
+            my_fatal("io_get_line(): no EOL in buffer\n");
+         }
+      }
+
+      // test for end of string
+
+      if (dst >= size) my_fatal("io_get_line(): buffer overflow\n");
+
+      // copy the next character
+
+      c = io->in_buffer[src++];
+
+      if (c == LF) { // LF => line complete
+         string[dst] = '\0';
+         break;
+      } else if (c != CR) { // skip CRs
+         string[dst++] = c;
+      }
+   }
+
+   // shift the buffer
+
+   ASSERT(src>0);
+
+   io->in_size -= src;
+   ASSERT(io->in_size>=0);
+
+   if (io->in_size > 0) memmove(&io->in_buffer[0],&io->in_buffer[src],io->in_size);
+
+   // return
+
+   my_log("%s->Adapter: %s\n",io->name,string);
+
+   return true;
+}
+
+// io_send()
+
+void io_send(io_t * io, const char format[], ...) {
+
+   va_list arg_list;
+   char string[StringSize];
+   int len;
+
+   ASSERT(io_is_ok(io));
+   ASSERT(format!=NULL);
+
+   ASSERT(io->out_fd>=0);
+
+   // format
+
+   va_start(arg_list,format);
+   vsprintf(string,format,arg_list);
+   va_end(arg_list);
+
+   // append string to buffer
+
+   len = strlen(string);
+   if (io->out_size + len > BufferSize-2) my_fatal("io_send(): buffer overflow\n");
+
+   memcpy(&io->out_buffer[io->out_size],string,len);
+   io->out_size += len;
+
+   ASSERT(io->out_size>=0&&io->out_size<=BufferSize-2);
+
+   // log
+
+   io->out_buffer[io->out_size] = '\0';
+   my_log("Adapter->%s: %s\n",io->name,io->out_buffer);
+//     my_log("> %f %s %s\n",now_real(),io->name,io->out_buffer);
+   // append EOL to buffer
+
+   if (UseCR) io->out_buffer[io->out_size++] = CR;
+   io->out_buffer[io->out_size++] = LF;
+
+   ASSERT(io->out_size>=0&&io->out_size<=BufferSize);
+
+   // flush buffer
+
+   if (UseDebug) my_log("POLYGLOT writing %d byte%s to %s\n",io->out_size,(io->out_size>1)?"s":"",io->name);
+   my_write(io->out_fd,io->out_buffer,io->out_size);
+
+   io->out_size = 0;
+}
+
+// io_send_queue()
+
+void io_send_queue(io_t * io, const char format[], ...) {
+
+   va_list arg_list;
+   char string[StringSize];
+   int len;
+
+   ASSERT(io_is_ok(io));
+   ASSERT(format!=NULL);
+
+   ASSERT(io->out_fd>=0);
+
+   // format
+
+   va_start(arg_list,format);
+   vsprintf(string,format,arg_list);
+   va_end(arg_list);
+
+   // append string to buffer
+
+   len = strlen(string);
+   if (io->out_size + len > BufferSize-2) my_fatal("io_send_queue(): buffer overflow\n");
+
+   memcpy(&io->out_buffer[io->out_size],string,len);
+   io->out_size += len;
+
+   ASSERT(io->out_size>=0&&io->out_size<=BufferSize-2);
+}
+
+// my_read()
+
+static int my_read(int fd, char string[], int size) {
+
+   int n;
+
+   ASSERT(fd>=0);
+   ASSERT(string!=NULL);
+   ASSERT(size>0);
+
+   do {
+      n = read(fd,string,size);
+   } while (n == -1 && errno == EINTR);
+
+   if (n == -1) my_fatal("my_read(): read(): %s\n",strerror(errno));
+
+   ASSERT(n>=0);
+
+   return n;
+}
+
+// my_write()
+
+static void my_write(int fd, const char string[], int size) {
+
+   int n;
+
+   ASSERT(fd>=0);
+   ASSERT(string!=NULL);
+   ASSERT(size>0);
+
+   do {
+
+      n = write(fd,string,size);
+
+      // if (n == -1 && errno != EINTR && errno != EPIPE) my_fatal("my_write(): write(): %s\n",strerror(errno));
+
+      if (n == -1) {
+         if (false) {
+         } else if (errno == EINTR) {
+            n = 0; // nothing has been written
+         } else if (errno == EPIPE) {
+            n = size; // pretend everything has been written
+         } else {
+            my_fatal("my_write(): write(): %s\n",strerror(errno));
+         }
+      }
+
+      ASSERT(n>=0);
+
+      string += n;
+      size -= n;
+
+   } while (size > 0);
+
+   ASSERT(size==0);
+}
+
+// end of io.cpp
+
+#endif
index a54aefe..4bd2fbb 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -35,7 +35,7 @@
 // constants\r
 \r
 \r
-static const char * const Version = "1.4W10UCIb24";\r
+static const char * const Version = "1.4b26";\r
 static const char * const HelpMessage = "\\r
 SYNTAX\n\\r
 * polyglot [configfile]\n\\r
index ffef0c9..0bb378c 100644 (file)
@@ -84,7 +84,12 @@ void mainloop() {
         }\r
         mainloop_wait_for_event();\r
     }\r
-    my_log("POLYGLOT *** EOF file received from engine ***\n");\r
+    my_log("POLYGLOT *** Mainloop has ended ***\n");\r
+    // This should be handled better.\r
+    engine_close(Engine);\r
+    my_log("POLYGLOT Calling exit\n");\r
+    exit(EXIT_SUCCESS);\r
+\r
 }\r
 \r
 \r
index 48f0c72..170da4a 100644 (file)
--- a/pipe.cpp
+++ b/pipe.cpp
@@ -6,7 +6,7 @@
 
 DWORD WINAPI ThreadProc(LPVOID lpParam){ 
     PipeStruct *p=(PipeStruct *) lpParam;
-    while(!p->EOF_()){
+    while(!p->EOF_input()){
         if(p->nReadEnd<LINE_INPUT_MAX_CHAR-1){
             p->ReadInput();
         }else{
@@ -123,7 +123,7 @@ void PipeStruct::Kill(void) const {
        CloseHandle(hProcess);
 }
 
-bool PipeStruct::EOF_(void){   // EOF is defined
+bool PipeStruct::EOF_input(void){   // EOF is defined
     int ret;
     EnterCriticalSection(&CriticalSection);
     ret=state&PIPE_EOF;
@@ -131,7 +131,7 @@ bool PipeStruct::EOF_(void){   // EOF is defined
     return ret;
 }
 
-void PipeStruct::set_EOF_(void){
+void PipeStruct::set_EOF_input(void){
     EnterCriticalSection(&CriticalSection);
     state|=PIPE_EOF;
     LeaveCriticalSection(&CriticalSection);
@@ -159,7 +159,7 @@ int PipeStruct::ReadData(void){
         // This just means we have read less than we could have. 
     ret=fgets(lpReadBuffer,LINE_INPUT_MAX_CHAR-nReadEnd,fpInput);
     if(!ret){
-        set_EOF_();
+        set_EOF_input();
         lpReadBuffer[0]='\0';
         return 0;
     }
@@ -176,7 +176,7 @@ void PipeStruct::ReadInput(void) {
       // would block during the blocking read
   ret=ReadData();
   EnterCriticalSection(&CriticalSection);
-  if(!EOF_()){
+  if(!EOF_input()){
       if(ret+nReadEnd>=LINE_INPUT_MAX_CHAR){
           my_fatal("PipeStruct::ReadInput(): Internal error: buffer overflow\n");
       }
@@ -192,11 +192,25 @@ void PipeStruct::ReadInput(void) {
       }
   }
   LeaveCriticalSection(&CriticalSection);
-  if(EOF_() || bSetEvent){
+  if(EOF_input() || bSetEvent){
       SetEvent(hEvent);
   }
 }
 
+bool PipeStruct::EOF_(void){
+  int ret;
+  EnterCriticalSection(&CriticalSection);
+  if(lpFeedEnd != NULL){
+    ret=FALSE;
+  }else if(EOF_input()){
+    ret=TRUE;
+  }else{
+    ret=FALSE;
+  }
+  LeaveCriticalSection(&CriticalSection);
+  return ret;
+}
+
 bool PipeStruct::GetBuffer(char *szLineStr) {
   int nFeedEnd;
   int ret;
@@ -221,8 +235,10 @@ bool PipeStruct::GetBuffer(char *szLineStr) {
   return ret;
 }
 
+
+
 void PipeStruct::LineInput(char *szLineStr) {
-    while(!EOF_()){
+  while(!EOF_()){
         if (GetBuffer(szLineStr)) {
             break;
         }else{
diff --git a/pipe.h b/pipe.h
index ad01c18..d24ed8c 100644 (file)
--- a/pipe.h
+++ b/pipe.h
@@ -21,13 +21,23 @@ const int LINE_INPUT_MAX_CHAR = 40960;
 
 // types
 
-struct PipeStruct {
-
+class  PipeStruct {
+  friend DWORD WINAPI ThreadProc(LPVOID lpParam);
+ public:
+    HANDLE hProcess;
+    HANDLE hEvent;
+    bool GetBuffer(char *szLineStr);
+    void LineInput(char *szLineStr);
+    void LineOutput(const char *szLineStr) const;
+    void Open(const char *szExecFile = NULL);
+    void Close(void) const;
+    void Kill(void) const;
+    bool Active(void);
+    bool EOF_(void);
+ private:
     HANDLE hInput, hOutput;
     FILE *fpInput;
-    HANDLE hProcess;
     HANDLE hThread;
-    HANDLE hEvent;
     BOOL bConsole;
     BOOL bPipe;
 
@@ -39,18 +49,11 @@ struct PipeStruct {
     char lpBuffer[LINE_INPUT_MAX_CHAR];
     char lpReadBuffer[LINE_INPUT_MAX_CHAR];
 
-    void Open(const char *szExecFile = NULL);
-    void Close(void) const;
-    void Kill(void) const;
-    bool EOF_(void);
-    void set_EOF_(void);
-    bool Active(void);
+    bool EOF_input(void);
+    void set_EOF_input(void);
     void set_Active(void);
     void ReadInput(void);
     int ReadData(void);
-    bool GetBuffer(char *szLineStr);
-    void LineInput(char *szLineStr);
-    void LineOutput(const char *szLineStr) const;
 
 };
 
index 851557d..04cb5f1 100644 (file)
@@ -1,6 +1,6 @@
 Summary: A Winboard protocol to UCI protocol adapter
 Name: polyglot
-Version: 1.4w10UCIb24
+Version: 1.4b26
 Release: 1
 License: GPL
 Group: Amusement/Games