X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=UCI2WB.c;h=9f1ad06c419ed64bdb109368c51d1d7b362fd1df;hb=768046d29eff91d4afbcea23dcb2a623a6a747c9;hp=3baeebabfacc1c25d1afd7db1675c8ed077d1bb5;hpb=7c6bcf50f2a3430e48c3b1e6ef076208f55cf94c;p=uci2wb.git diff --git a/UCI2WB.c b/UCI2WB.c index 3baeeba..9f1ad06 100644 --- a/UCI2WB.c +++ b/UCI2WB.c @@ -1,4 +1,13 @@ -/************************* UCI2WB by H.G.Muller ****************************/ +/****************************************************************************/ +/* UCI2WB by H.G.Muller */ +/* */ +/* UCI2WB is an adapter to run engines that communicate in various dialects */ +/* of the Universal Chess Interface in a GUI that supports XBoard protocol */ +/* (CECP). It supports UCI (when used for Xiangqi: the 'Cyclone dialect'), */ +/* as well as USI and UCCI when used with the flags -s or -x, respectively. */ +/* This version of UCI2WB is released under the GNU General Public License, */ +/* of which you should have received a copy together with this file. */ +/****************************************************************************/ #define VERSION "2.0" @@ -148,7 +157,7 @@ void StopPonder(int pondering) { if(!pondering) return; - pause = 2; + pause = 1; fprintf(toE, "stop\n"); fflush(toE); DPRINT("# stop\n"); // note: 'pondering' remains set until engine acknowledges 'stop' with 'bestmove' Sync(PAUSE); // wait for engine to acknowledge 'stop' with 'bestmove'. } @@ -236,7 +245,7 @@ Engine2GUI() DPRINT("# engine said: %s", line), fflush(stdout); if(sscanf(line, "%s", command) != 1) continue; if(!strcmp(command, "bestmove")) { - if(pause) { pondering = pause = 0; Sync(WAKEUP); continue; } // bestmove was reply to ponder miss or analysis result; ignore. + if(pause == 1) { pondering = pause = 0; Sync(WAKEUP); continue; } // bestmove was reply to ponder miss or analysis result; ignore. else if(pondering) { pondering = 0; printf("%d 0 0 0 UCI violation! Engine moves during ponder\n", lastDepth+1); continue; } // ignore ponder search // move was a move to be played if(p = strstr(line+8, " draw")) *p = 0, printf("offer draw\n"); // UCCI @@ -258,6 +267,7 @@ Engine2GUI() } else move[moveNr][0] = 0; Move4GUI(line+9); printf("move %s\n", line+9); // send move to GUI + if(pause) { pause = 0; Sync(WAKEUP); } // release commands that came in during think if(lastScore == 100001 && iniPos[0] != 'f') { printf("%s {mate}\n", stm == BLACK ? "1-0" : "0-1"); computer = NONE; } } else if(!strcmp(command, "info")) { @@ -378,7 +388,7 @@ GUI2Engine() } fprintf(toE, "\n"); DPRINT("\n"); // code for searchmoves goes here - } else StartSearch(""); + } else { pause = 2; StartSearch(""); fflush(stdout); fflush(toE); Sync(PAUSE); } // block input during thinking } nomove: fflush(toE); fflush(stdout); @@ -392,10 +402,10 @@ GUI2Engine() oldMem = memory; // we can set other options here if(sc == 'x') { if(newGame) fprintf(toE, "setoption newgame\n"); } else // optional in UCCI - fprintf(toE, "u%cinewgame\n", sc); fflush(toE); pause = 1; // wait for option settings to take effect fprintf(toE, "isready\n"); fflush(toE); Sync(PAUSE); // wait for readyok + fprintf(toE, "u%cinewgame\n", sc); fflush(toE); } else if(!strcmp(command, "usermove")) { sscanf(line, "usermove %s", command); // strips off linefeed @@ -407,6 +417,7 @@ GUI2Engine() char *draw = drawOffer ? " draw" : ""; drawOffer = 0; pondering = 0; moveNr++; startTime = GetTickCount(); // clock starts running now fprintf(toE, "ponderhit%s\n", draw); DPRINT("# ponderhit%s\n", draw); + fflush(toE); fflush(stdout); pause = 2; Sync(PAUSE); // block input during thinking goto nomove; } StopPonder(1); @@ -486,7 +497,7 @@ GUI2Engine() else if(!strcmp(command, "nopost")) post = 0; else if(!strcmp(command, "easy") && !!*canPonder) ponder = 0, StopPonder(pondering), fprintf(toE, "setoption %s%s %sfalse\n", nameWord, canPonder, valueWord); else if(!strcmp(command, "hard") && !!*canPonder) ponder = 1, fprintf(toE, "setoption %s%s %strue\n", nameWord, canPonder, valueWord), StartPonder(); - 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("pong %s", line+5); } + 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); } else if(!strcmp(command, "memory")) sscanf(line, "memory %d", &memory); else if(!strcmp(command, "cores")&& !!*threadOpt) sscanf(line, "cores %d", &cores), fprintf(toE, "setoption %s%s %s%d\n", nameWord, threadOpt, valueWord, cores); else if(!strcmp(command, "sd")) sscanf(line, "sd %d", &depth);