X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=674b14a05b6db07cf313682e5f18ef8d1a447d1c;hb=b80a07a436b0211145c915a7d79bf7c41ae891e4;hp=1df8adbe1e1c62387cc70978af16cfde8e86b1d7;hpb=f00b56b34a1d43c6cc3e7489fdde4f284d776420;p=xboard.git diff --git a/backend.c b/backend.c index 1df8adb..674b14a 100644 --- a/backend.c +++ b/backend.c @@ -2,9 +2,12 @@ * backend.c -- Common back end for X and Windows NT versions of * * Copyright 1991 by Digital Equipment Corporation, Maynard, - * Massachusetts. Enhancements Copyright - * 1992-2001,2002,2003,2004,2005,2006,2007,2008,2009 Free Software - * Foundation, Inc. + * Massachusetts. + * + * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, + * 2007, 2008, 2009 Free Software Foundation, Inc. + * + * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: @@ -2108,6 +2111,7 @@ read_from_ics(isr, closure, data, count, error) if(buf_len >= 5 && buf[buf_len-5]=='\n' && buf[buf_len-4]=='\\' && buf[buf_len-3]==' ' && buf[buf_len-2]==' ' && buf[buf_len-1]==' ') buf_len -= 5; // [HGM] ICS: join continuation line of Lasker 2.2.3 server with previous + buf[buf_len++] = ' '; // replace by space (assumes ICS does not break lines within word) } buf[buf_len] = NULLCHAR; @@ -3821,7 +3825,7 @@ ParseBoard12(string) #endif } - if (moveNum > 0 && !gotPremove) { + if (moveNum > 0 && !gotPremove && !appData.noGUI) { /* If move comes from a remote source, animate it. If it isn't remote, it will have already been animated. */ if (!pausing && !ics_user_moved && prevMove == moveNum - 1) { @@ -3851,7 +3855,7 @@ ParseBoard12(string) /* Display opponents and material strengths */ if (gameInfo.variant != VariantBughouse && - gameInfo.variant != VariantCrazyhouse) { + gameInfo.variant != VariantCrazyhouse && !appData.noGUI) { if (tinyLayout || smallLayout) { if(gameInfo.variant == VariantNormal) sprintf(str, "%s(%d) %s(%d) {%d %d}", @@ -3879,7 +3883,7 @@ ParseBoard12(string) /* Display the board */ - if (!pausing) { + if (!pausing && !appData.noGUI) { if (appData.premove) if (!gotPremove || @@ -5203,7 +5207,13 @@ if(appData.debugMode) fprintf(debugFP, "moveType 1 = %d, promochar = %x\n", move /* [HGM] convert drag-and-drop piece drops to standard form */ if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) { moveType = WhiteOnMove(currentMove) ? WhiteDrop : BlackDrop; - fromX = boards[currentMove][fromY][fromX]; + if(appData.debugMode) fprintf(debugFP, "Drop move %d, curr=%d, x=%d,y=%d, p=%d\n", + moveType, currentMove, fromX, fromY, boards[currentMove][fromY][fromX]); +// fromX = boards[currentMove][fromY][fromX]; + // holdings might not be sent yet in ICS play; we have to figure out which piece belongs here + if(fromX == 0) fromY = BOARD_HEIGHT-1 - fromY; // black holdings upside-down + fromX = fromX ? WhitePawn : BlackPawn; // first piece type in selected holdings + while(PieceToChar(fromX) == '.' || PieceToNumber(fromX) != fromY && fromX != (int) EmptySquare) fromX++; fromY = DROP_RANK; } @@ -5635,12 +5645,12 @@ FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book h if(appData.autoKibitz && !appData.icsEngineAnalyze ) { /* [HGM] kibitz: send most-recent PV info to ICS */ char buf[3*MSG_SIZ]; - sprintf(buf, "kibitz !!! %+.2f/%d (%.2f sec, %.0f nodes, %1.0f knps) PV=%s\n", + sprintf(buf, "kibitz !!! %+.2f/%d (%.2f sec, %u nodes, %1.0f knps) PV=%s\n", programStats.score / 100., programStats.depth, programStats.time / 100., - u64ToDouble(programStats.nodes), - u64ToDouble(programStats.nodes) / (10*abs(programStats.time) + 1.), + (unsigned int)programStats.nodes, + (unsigned int)programStats.nodes / (10*abs(programStats.time) + 1.), programStats.movelist); SendToICS(buf); } @@ -6114,6 +6124,10 @@ FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book h cps->useSigint = FALSE; cps->useSigterm = FALSE; } + if (strncmp(message, "feature ", 8) == 0) { // [HGM] moved forward to pre-empt non-compliant commands + ParseFeatures(message+8, cps); + return; // [HGM] This return was missing, causing option features to be recognized as non-compliant commands! + } /* [HGM] Allow engine to set up a position. Don't ask me why one would * want this, I was asked to put it in, and obliged. @@ -6218,9 +6232,6 @@ FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book h return; } } - if (strncmp(message, "feature ", 8) == 0) { - ParseFeatures(message+8, cps); - } if (sscanf(message, "pong %d", &cps->lastPong) == 1) { return; } @@ -9593,8 +9604,10 @@ SaveGamePGN(f) linelen += numlen; /* Get move */ - strcpy(move_buffer, parseList[i]); // [HGM] pgn: print move via buffer, so it can be edited + strcpy(move_buffer, SavePart(parseList[i])); // [HGM] pgn: print move via buffer, so it can be edited movelen = strlen(move_buffer); /* [HGM] pgn: line-break point before move */ +#if 0 + // SavePart already does this! if( i >= 0 && appData.saveExtendedInfoInPGN && pvInfoList[i].depth > 0 ) { int p = movelen - 1; if(move_buffer[p] == ' ') p--; @@ -9603,7 +9616,7 @@ SaveGamePGN(f) if(p && move_buffer[p-1] == ' ') move_buffer[movelen=p-1] = 0; } } - +#endif /* Print move */ blank = linelen > 0 && movelen > 0; if (linelen + (blank ? 1 : 0) + movelen > PGN_MAX_LINE) { @@ -12373,9 +12386,27 @@ ParseOption(Option *opt, ChessProgramState *cps) opt->min = min; opt->max = max; opt->type = Spin; - } else if(p = strstr(opt->name, " -string ")) { + } else if((p = strstr(opt->name, " -slider "))) { + // for now -slider is a synonym for -spin, to already provide compatibility with future polyglots + if((n = sscanf(p, " -slider %d %d %d", &def, &min, &max)) < 3 ) return FALSE; + if(max < min) max = min; // enforce consistency + if(def < min) def = min; + if(def > max) def = max; + opt->value = def; + opt->min = min; + opt->max = max; + opt->type = Spin; // Slider; + } else if((p = strstr(opt->name, " -string "))) { opt->textValue = p+9; opt->type = TextBox; + } else if((p = strstr(opt->name, " -file "))) { + // for now -file is a synonym for -string, to already provide compatibility with future polyglots + opt->textValue = p+7; + opt->type = TextBox; // FileName; + } else if((p = strstr(opt->name, " -path "))) { + // for now -file is a synonym for -string, to already provide compatibility with future polyglots + opt->textValue = p+7; + opt->type = TextBox; // PathName; } else if(p = strstr(opt->name, " -check ")) { if(sscanf(p, " -check %d", &def) < 1) return FALSE; opt->value = (def != 0); @@ -12383,6 +12414,7 @@ ParseOption(Option *opt, ChessProgramState *cps) } else if(p = strstr(opt->name, " -combo ")) { opt->textValue = (char*) (&cps->comboList[cps->comboCnt]); // cheat with pointer type cps->comboList[cps->comboCnt++] = q = p+8; // holds possible choices + if(*q == '*') cps->comboList[cps->comboCnt-1]++; opt->value = n = 0; while(q = StrStr(q, " /// ")) { n++; *q = 0; // count choices, and null-terminate each of them