X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=14f482927423d01ca4594b4059239e20e93274cc;hb=96e7288ce19bb9b0e681e737c3113047a6475078;hp=3d65707c465d20d4395990dd58feb178b47130fd;hpb=c99186b3e9c3ae75efda00a0a08285c70fbeb9b4;p=xboard.git diff --git a/backend.c b/backend.c index 3d65707..14f4829 100644 --- a/backend.c +++ b/backend.c @@ -876,7 +876,8 @@ extern Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick; static char resetOptions[] = "-reuse -firstIsUCI false -firstHasOwnBookUCI true -firstTimeOdds 1 " "-firstInitString \"" INIT_STRING "\" -firstComputerString \"" COMPUTER_STRING "\" " - "-firstOptions \"\" -firstNPS -1 -fn \"\""; + "-firstFeatures \"\" -firstLogo \"\" -firstAccumulateTC 1 " + "-firstOptions \"\" -firstNPS -1 -fn \"\" -firstScoreAbs false"; void FloatToFront(char **list, char *engineLine) @@ -897,6 +898,8 @@ FloatToFront(char **list, char *engineLine) ASSIGN(*list, tidy+1); } +char *insert, *wbOptions; // point in ChessProgramNames were we should insert new engine + void Load (ChessProgramState *cps, int i) { @@ -904,7 +907,8 @@ Load (ChessProgramState *cps, int i) if(engineLine && engineLine[0]) { // an engine was selected from the combo box snprintf(buf, MSG_SIZ, "-fcp %s", engineLine); SwapEngines(i); // kludge to parse -f* / -first* like it is -s* / -second* - ParseArgsFromString(resetOptions); appData.fenOverride[0] = NULL; appData.pvSAN[0] = FALSE; + ParseArgsFromString(resetOptions); appData.pvSAN[0] = FALSE; + FREE(appData.fenOverride[0]); appData.fenOverride[0] = NULL; appData.firstProtocolVersion = PROTOVER; ParseArgsFromString(buf); SwapEngines(i); @@ -915,20 +919,20 @@ Load (ChessProgramState *cps, int i) p = engineName; while(q = strchr(p, SLASH)) p = q+1; if(*p== NULLCHAR) { DisplayError(_("You did not specify the engine executable"), 0); return; } - if(engineDir[0] != NULLCHAR) - appData.directory[i] = engineDir; - else if(p != engineName) { // derive directory from engine path, when not given + if(engineDir[0] != NULLCHAR) { + ASSIGN(appData.directory[i], engineDir); + } else if(p != engineName) { // derive directory from engine path, when not given p[-1] = 0; - appData.directory[i] = strdup(engineName); + ASSIGN(appData.directory[i], engineName); p[-1] = SLASH; if(SLASH == '/' && p - engineName > 1) *(p -= 2) = '.'; // for XBoard use ./exeName as command after split! - } else appData.directory[i] = "."; + } else { ASSIGN(appData.directory[i], "."); } if(params[0]) { if(strchr(p, ' ') && !strchr(p, '"')) snprintf(buf2, MSG_SIZ, "\"%s\"", p), p = buf2; // quote if it contains spaces snprintf(command, MSG_SIZ, "%s %s", p, params); p = command; } - appData.chessProgram[i] = strdup(p); + ASSIGN(appData.chessProgram[i], p); appData.isUCI[i] = isUCI; appData.protocolVersion[i] = v1 ? 1 : PROTOVER; appData.hasOwnBookUCI[i] = hasBook; @@ -950,8 +954,10 @@ Load (ChessProgramState *cps, int i) isUCI ? (isUCI == TRUE ? " -fUCI" : gameInfo.variant == VariantShogi ? " -fUSI" : " -fUCCI") : "", storeVariant ? " -variant " : "", storeVariant ? VariantName(gameInfo.variant) : ""); + if(wbOptions && wbOptions[0]) snprintf(buf+strlen(buf)-1, MSG_SIZ-strlen(buf), " %s\n", wbOptions); firstChessProgramNames = malloc(len = strlen(q) + strlen(buf) + 1); - snprintf(firstChessProgramNames, len, "%s%s", q, buf); + if(insert != q) insert[-1] = NULLCHAR; + snprintf(firstChessProgramNames, len, "%s\n%s%s", q, buf, insert); if(q) free(q); FloatToFront(&appData.recentEngineList, buf); } @@ -10026,6 +10032,7 @@ NamesToList (char *names, char **engineList, char **engineMnemonic, char *group) { char buf[MSG_SIZ], *p, *q; int i=1, header, skip, all = !strcmp(group, "all"), depth = 0; + insert = names; // afterwards, this global will point just after last retrieved engine line or group end in the 'names' skip = !all && group[0]; // if group requested, we start in skip mode for(;*names && depth >= 0 && i < MAXENGINES-1; names = p) { p = names; q = buf; header = 0; @@ -10033,7 +10040,7 @@ NamesToList (char *names, char **engineList, char **engineMnemonic, char *group) *q = 0; if(*p == '\n') p++; if(buf[0] == '#') { - if(strstr(buf, "# end") == buf) { depth--; continue; } // leave group, and suppress printing label + if(strstr(buf, "# end") == buf) { if(!--depth) insert = p; continue; } // leave group, and suppress printing label depth++; // we must be entering a new group if(all) continue; // suppress printing group headers when complete list requested header = 1; @@ -10042,7 +10049,7 @@ NamesToList (char *names, char **engineList, char **engineMnemonic, char *group) if(depth != header && !all || skip) continue; // skip contents of group (but print first-level header) if(engineList[i]) free(engineList[i]); engineList[i] = strdup(buf); - if(buf[0] != '#') TidyProgramName(engineList[i], "localhost", buf); // group headers not tidied + if(buf[0] != '#') insert = p, TidyProgramName(engineList[i], "localhost", buf); // group headers not tidied if(engineMnemonic[i]) free(engineMnemonic[i]); if((q = strstr(engineList[i]+2, "variant")) && q[-2]== ' ' && (q[-1]=='/' || q[-1]=='-') && (q[7]==' ' || q[7]=='=')) { strcat(buf, " ("); @@ -10077,6 +10084,13 @@ SwapEngines (int n) SWAP(pgnName, p) SWAP(pvSAN, h) SWAP(engOptions, p) + SWAP(engInitString, p) + SWAP(computerString, p) + SWAP(features, p) + SWAP(fenOverride, p) + SWAP(NPS, h) + SWAP(accumulateTC, h) + SWAP(host, p) } int