version 1.4w10UCIb20
[polyglot.git] / engine.cpp
index b674272..f5c53c6 100644 (file)
@@ -200,6 +200,18 @@ void engine_close(engine_t * engine) {
 \r
 }\r
 \r
+// engine_get_non_blocking()\r
+\r
+bool engine_get_non_blocking(engine_t * engine, char string[], int size){\r
+    if(io_line_ready(engine->io)){\r
+        engine_get(engine,string,StringSize);\r
+        return true;\r
+    }else{\r
+        string[0]='\0';\r
+        return false;\r
+    }\r
+}\r
+\r
 // engine_get()\r
 \r
 void engine_get(engine_t * engine, char string[], int size) {\r
@@ -330,48 +342,49 @@ IDLE_PRIORITY_CLASS         0x00000040
 \r
 void set_affinity(engine_t *engine, int affin){\r
        if(affin==-1) return;\r
-    SetProcessAffinityMask((engine->pipeEngine).hProcess,affin);\r
+    SetProcessAffinityMask((engine->io).hProcess,affin);\r
 }\r
 \r
 // Eric Mullins!\r
 \r
 void engine_set_nice_value(engine_t *engine, int value){\r
-    SetPriorityClass((engine->pipeEngine).hProcess,\r
+    SetPriorityClass((engine->io).hProcess,\r
                      GetWin32Priority(value));\r
 }\r
 \r
 \r
 void engine_send_queue(engine_t * engine,const char *szFormat, ...) {\r
-  nQueuePtr += vsprintf(szQueueString + nQueuePtr, szFormat, (va_list) (&szFormat + 1));\r
+    nQueuePtr += vsprintf(szQueueString + nQueuePtr, szFormat, (va_list) (&szFormat + 1));\r
 }\r
 \r
 void engine_send(engine_t * engine, const char *szFormat, ...) {\r
     vsprintf(szQueueString + nQueuePtr, szFormat, (va_list) (&szFormat + 1));\r
-    (engine->pipeEngine).LineOutput(szQueueString);\r
+    (engine->io).LineOutput(szQueueString);\r
     my_log("Adapter->Engine: %s\n",szQueueString);\r
     nQueuePtr = 0;\r
 }\r
 \r
 void engine_close(engine_t * engine){\r
     char string[StringSize];\r
-    (engine->pipeEngine).Close();\r
+    (engine->io).Close();\r
         // TODO: Timeout\r
-    while (!engine_eof(Engine)) {\r
-            engine_get(Engine,string,StringSize); \r
-        }\r
-    (engine->pipeEngine).Kill();\r
+    while (!engine_eof(Engine)) { \r
+        engine_get_non_blocking(Engine,string,StringSize);\r
+        Idle();\r
+    }\r
+    (engine->io).Kill();\r
 }\r
 \r
 \r
 void engine_open(engine_t * engine){\r
-   int affinity;\r
+    int affinity;\r
     char *my_dir;\r
     engine->state=0;\r
     if( (my_dir = _getcwd( NULL, 0 )) == NULL )\r
         my_fatal("Can't build path: %s\n",strerror(errno));\r
     SetCurrentDirectory(option_get_string("EngineDir"));\r
-    (engine->pipeEngine).Open(option_get_string("EngineCommand"));\r
-    if((engine->pipeEngine).Active()){\r
+    (engine->io).Open(option_get_string("EngineCommand"));\r
+    if((engine->io).Active()){\r
         engine->state|=ENGINE_ACTIVE;\r
             //play with affinity (bad idea)\r
         affinity=option_get_int("Affinity");\r
@@ -397,13 +410,12 @@ 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->pipeEngine).LineInput(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->pipeEngine.EOF_()){\r
-            my_log("POLYGLOT EOF received from engine\n");\r
+        if(engine->io.EOF_()){\r
             engine->state|=ENGINE_EOF;\r
         }\r
         return false;\r
@@ -411,15 +423,9 @@ bool engine_get_non_blocking(engine_t * engine, char *szLineStr, int size){
 }\r
 \r
 void engine_get(engine_t * engine, char *szLineStr, int size){\r
-    bool data_available;\r
-    if(engine_eof(engine))return;\r
-    while(true){\r
-        data_available=engine_get_non_blocking(engine,szLineStr,size);\r
-        if(!data_available && !engine_eof(engine)){\r
-            Idle();\r
-        }else{\r
-            break;\r
-        }\r
+    (engine->io).LineInput(szLineStr);\r
+    if(engine->io.EOF_()){\r
+        engine->state|=ENGINE_EOF;\r
     }\r
 }\r
 \r