Use 'isready' after 'ucinewgame'
[uci2wb.git] / UCI2WB.c
index 58f4ab2..7251f5d 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -348,7 +348,7 @@ HandleEngineOutput()
            if(!strcasecmp(name, "Threads")) { strcpy(threadOpt, name); continue; }\r
            if(!strcasecmp(name, "Ponder") || !strcasecmp(name, "USI_Ponder")) { strcpy(canPonder, name); continue; }\r
            if(!strcasecmp(name, "Hash") || !strcasecmp(name, "USI_Hash") || !strcasecmp(name, "hashsize")) {\r
-               memory = oldMem = atoi(val); hasHash = 1\r
+               memory = oldMem = atoi(val); hasHash = max\r
                strcpy(hashOpt, name);\r
                continue;\r
            }\r
@@ -398,7 +398,7 @@ HandleEngineOutput()
            if(!*varList) strcpy(varList, sc=='s' ? ",shogi,5x5+5_shogi" : VARIANTS); // without clue guess liberally\r
            printf("feature variants=\"%s\"\n", varList+1); // from UCI_Variant combo and/or UCI_Chess960 check options\r
            if(*egts) printf("feature egt=\"%s\"\n", egts+1);\r
-           printf("feature smp=1 memory=%d done=1\n", hasHash);\r
+           printf("feature smp=1 memory=%d done=1\n", hasHash > 0);\r
            if(unit == 2) { unit = 1; EPRINT((f, "# setoption usemillisec true\n")) }\r
            fflush(stdout); return; // done with options\r
        }\r
@@ -541,7 +541,12 @@ GUI2Engine()
     }\r
 }\r
 \r
-\r
+void\r
+IsReady ()\r
+{\r
+    EPRINT((f, "# isready\n")) fflush(toE);\r
+    HandleEngineOutput(); // wait for readyok\r
+}\r
 \r
 void\r
 DoCommand ()\r
@@ -560,10 +565,9 @@ DoCommand ()
            oldMem = memory;\r
            // we can set other options here\r
            if(varOpt && strstr(varList, ",normal")) EPRINT((f, "# setoption name UCI_Variant value chess\n"))\r
-           EPRINT((f, "# isready\n")) fflush(toE);\r
-           HandleEngineOutput(); // wait for readyok\r
+           IsReady();\r
            if(sc == 'x') { if(newGame) EPRINT((f, "# setoption newgame\n")) } else // optional in UCCI\r
-           EPRINT((f, "# u%cinewgame\n", sc)) fflush(toE);\r
+               { EPRINT((f, "# u%cinewgame\n", sc)) fflush(toE); if(sc != 's') IsReady(); } // avoid isready in USI\r
        }\r
         else if(!strcmp(command, "e")) { strcpy(move[moveNr++], type); stm ^= WHITE|BLACK; return; }\r
        else if(!strcmp(command, "option")) {\r
@@ -623,7 +627,7 @@ DoCommand ()
        else if(!strcmp(command, "force"))  computer = NONE;\r
        else if(!strcmp(command, "go"))     computer = stm;\r
        else if(!strcmp(command, "ping"))   { /* static int done; if(!done) pause = 1, fprintf(toE, "isready\n"), fflush(toE), printf("# send isready\n"), fflush(stdout), Sync(PAUSE); done = 1;*/ printf("po%s", line+2); }\r
-       else if(!strcmp(command, "memory")) sscanf(line, "memory %d", &memory);\r
+       else if(!strcmp(command, "memory")) { sscanf(line, "memory %d", &memory); if(memory > hasHash) memory = hasHash; }\r
        else if(!strcmp(command, "cores")&& !!*threadOpt) { sscanf(line, "cores %d", &cores); EPRINT((f, "# setoption %s%s %s%d\n", nameWord, threadOpt, valueWord, cores)) }\r
        else if(!strcmp(command, "egtpath")){\r
            sscanf(line+8, "%s %[^\n]", type, command);\r