int junk;
Boolean singleList;
char *homeDir;
+char *firstEngineLine;
+char *secondEngineLine;
+char *icsNick;
void EnsureOnScreen(int *x, int *y, int minX, int minY);
char StringGet(void *getClosure);
void SaveBoardSize(FILE *f, char *name, void *addr);
void PrintCommPortSettings(FILE *f, char *name);
void GetWindowCoords();
-int MySearchPath(char *installDir, char *name, char *fullname);
-int MyGetFullPathName(char *name, char *fullname);
int MainWindowUp();
void PopUpStartupDialog();
typedef char GetFunc(void *getClosure);
ArgDescriptor argDescriptors[] = {
/* positional arguments */
+ { "opt", ArgSettingsFilename, (void *) NULL, FALSE, INVALID },
+ { "loadPositionFile", ArgFilename, (void *) &appData.loadPositionFile, FALSE, INVALID },
+ { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, INVALID },
+ { "is", ArgString, (void *) &icsNick, FALSE, INVALID },
{ "loadGameFile", ArgFilename, (void *) &appData.loadGameFile, FALSE, INVALID },
{ "", ArgNone, NULL, FALSE, INVALID },
/* keyword arguments */
{ "secondChessProgram", ArgFilename, (void *) &appData.secondChessProgram,
FALSE, (ArgIniType) SECOND_CHESS_PROGRAM },
{ "scp", ArgFilename, (void *) &appData.secondChessProgram, FALSE, INVALID },
+ { "fe", ArgString, (void *) &firstEngineLine, FALSE, "" },
+ { "se", ArgString, (void *) &secondEngineLine, FALSE, "" },
{ "firstPlaysBlack", ArgBoolean, (void *) &appData.firstPlaysBlack, FALSE, FALSE },
{ "fb", ArgTrue, (void *) &appData.firstPlaysBlack, FALSE, FALSE },
{ "xfb", ArgFalse, (void *) &appData.firstPlaysBlack, FALSE, INVALID },
{ "ics", ArgTrue, (void *) &appData.icsActive, FALSE, (ArgIniType) FALSE },
{ "xics", ArgFalse, (void *) &appData.icsActive, FALSE, INVALID },
{ "-ics", ArgFalse, (void *) &appData.icsActive, FALSE, INVALID },
+ { "is", ArgString, (void *) &icsNick, FALSE, "" },
{ "internetChessServerHost", ArgString, (void *) &appData.icsHost, FALSE, (ArgIniType) "" },
{ "icshost", ArgString, (void *) &appData.icsHost, FALSE, INVALID },
{ "internetChessServerPort", ArgString, (void *) &appData.icsPort, FALSE, (ArgIniType) ICS_PORT },
{ "fUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "firstUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "secondIsUCI", ArgBoolean, (void *) &appData.secondIsUCI, FALSE, (ArgIniType) FALSE },
+ { "secondUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "sUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "fUCCI", ArgTwo, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "sUCCI", ArgTwo, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "fUSI", ArgTwo, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "sUSI", ArgTwo, (void *) &appData.secondIsUCI, FALSE, INVALID },
- { "secondUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "firstHasOwnBookUCI", ArgBoolean, (void *) &appData.firstHasOwnBookUCI, FALSE, (ArgIniType) TRUE },
{ "fNoOwnBookUCI", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID },
{ "firstXBook", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID },
{ "syncAfterRound", ArgBoolean, (void *) &appData.roundSync, FALSE, (ArgIniType) FALSE },
{ "syncAfterCycle", ArgBoolean, (void *) &appData.cycleSync, FALSE, (ArgIniType) TRUE },
{ "seedBase", ArgInt, (void *) &appData.seedBase, FALSE, (ArgIniType) 1 },
+ { "pgnNumberTag", ArgBoolean, (void *) &appData.numberTag, TRUE, (ArgIniType) FALSE },
{ "afterGame", ArgString, (void *) &appData.afterGame, FALSE, INVALID },
{ "afterTourney", ArgString, (void *) &appData.afterTourney, FALSE, INVALID },
{ "smpCores", ArgInt, (void *) &appData.smpCores, TRUE, (ArgIniType) 1 },
{ "egtFormats", ArgString, (void *) &appData.egtFormats, TRUE, (ArgIniType) "" },
{ "niceEngines", ArgInt, (void *) &appData.niceEngines, TRUE, INVALID },
- { "firstLogo", ArgFilename, (void *) &appData.firstLogo, FALSE, INVALID },
- { "secondLogo", ArgFilename, (void *) &appData.secondLogo, FALSE, INVALID },
+ { "logoSize", ArgInt, (void *) &appData.logoSize, XBOARD, INVALID },
+ { "logoDir", ArgFilename, (void *) &appData.logoDir, XBOARD, (ArgIniType) "." },
+ { "firstLogo", ArgFilename, (void *) &appData.firstLogo, FALSE, (ArgIniType) "" },
+ { "secondLogo", ArgFilename, (void *) &appData.secondLogo, FALSE, (ArgIniType) "" },
{ "autoLogo", ArgBoolean, (void *) &appData.autoLogo, TRUE, INVALID },
{ "firstOptions", ArgString, (void *) &appData.firstOptions, FALSE, (ArgIniType) "" },
{ "secondOptions", ArgString, (void *) &appData.secondOptions, FALSE, (ArgIniType) "" },
{ "findMirrorImage", ArgBoolean, (void *) &appData.findMirror, FALSE, FALSE },
{ "viewer", ArgTrue, (void *) &appData.viewer, FALSE, FALSE },
{ "viewerOptions", ArgString, (void *) &appData.viewerOptions, TRUE, (ArgIniType) "-ncp -engineOutputUp false -saveSettingsOnExit false" },
+ { "tourneyOptions", ArgString, (void *) &appData.tourneyOptions, TRUE, (ArgIniType) "-ncp -mm -saveSettingsOnExit false" },
+ { "autoCopyPV", ArgBoolean, (void *) &appData.autoCopyPV, TRUE, FALSE },
+ { "topLevel", ArgBoolean, (void *) &appData.topLevel, XBOARD, (ArgIniType) TOPLEVEL },
+ { "dialogColor", ArgString, (void *) &appData.dialogColor, XBOARD, (ArgIniType) "" },
+ { "buttonColor", ArgString, (void *) &appData.buttonColor, XBOARD, (ArgIniType) "" },
#if ZIPPY
{ "zippyTalk", ArgBoolean, (void *) &appData.zippyTalk, FALSE, (ArgIniType) ZIPPY_TALK },
/* [HGM] options for broadcasting and time odds */
{ "chatBoxes", ArgString, (void *) &appData.chatBoxes, !XBOARD, (ArgIniType) NULL },
{ "serverMoves", ArgString, (void *) &appData.serverMovesName, FALSE, (ArgIniType) NULL },
+ { "serverFile", ArgString, (void *) &appData.serverFileName, FALSE, (ArgIniType) NULL },
{ "suppressLoadMoves", ArgBoolean, (void *) &appData.suppressLoadMoves, FALSE, (ArgIniType) FALSE },
{ "serverPause", ArgInt, (void *) &appData.serverPause, FALSE, (ArgIniType) 15 },
{ "firstTimeOdds", ArgInt, (void *) &appData.firstTimeOdds, FALSE, (ArgIniType) 1 },
{ "keepLineBreaksICS", ArgBoolean, (void *) &appData.noJoin, TRUE, INVALID },
{ "wrapContinuationSequence", ArgString, (void *) &appData.wrapContSeq, FALSE, INVALID },
{ "useInternalWrap", ArgTrue, (void *) &appData.useInternalWrap, FALSE, INVALID }, /* noJoin usurps this if set */
+ { "openCommand", ArgString, (void *) &appData.sysOpen, FALSE, "xdg-open" },
// [HGM] placement: put all window layouts last in ini file, but man X,Y before all others
- { "minX", ArgZ, (void *) &minX, FALSE, INVALID }, // [HGM] placement: to make suer auxialary windows can be placed
+ { "minX", ArgZ, (void *) &minX, FALSE, INVALID }, // [HGM] placement: to make sure auxiliary windows can be placed
{ "minY", ArgZ, (void *) &minY, FALSE, INVALID },
{ "winWidth", ArgInt, (void *) &wpMain.width, TRUE, INVALID }, // [HGM] placement: dummies to remember right & bottom
{ "winHeight", ArgInt, (void *) &wpMain.height, TRUE, INVALID }, // for attaching auxiliary windows to them
{ "icsY", ArgY, (void *) &wpConsole.y, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "icsW", ArgInt, (void *) &wpConsole.width, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "icsH", ArgInt, (void *) &wpConsole.height, TRUE, (ArgIniType) CW_USEDEFAULT },
- { "analysisX", ArgX, (void *) &junk, FALSE, INVALID }, // [HGM] placement: analysis window no longer exists
- { "analysisY", ArgY, (void *) &junk, FALSE, INVALID }, // provided for compatibility with old ini files
- { "analysisW", ArgInt, (void *) &junk, FALSE, INVALID },
- { "analysisH", ArgInt, (void *) &junk, FALSE, INVALID },
{ "commentX", ArgX, (void *) &wpComment.x, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "commentY", ArgY, (void *) &wpComment.y, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "commentW", ArgInt, (void *) &wpComment.width, TRUE, (ArgIniType) CW_USEDEFAULT },
char buf[MSG_SIZ];
int len;
- len = snprintf(buf,MSG_SIZ, "%s %s", msg, badArg);
+ len = snprintf(buf, MSG_SIZ, msg, badArg);
if( (len >= MSG_SIZ) && appData.debugMode )
fprintf(debugFP, "ExitArgError: buffer truncated. Input: msg=%s badArg=%s\n", msg, badArg);
{
char *p = s;
if(*p == '-' || *p == '+') p++;
- while(*p) if(!isdigit(*p++)) ExitArgError(_("Bad integer value"), s, TRUE);
+ while(*p) if(!isdigit(*p++)) ExitArgError(_("Bad integer value %s"), s, TRUE);
return atoi(s);
}
char *q;
int i, octval;
char ch;
- int posarg = 0;
+ int posarg = 4; // default is game file
ch = get(cl);
for (;;) {
+ int posflag = 0;
while (ch == ' ' || ch == '\n' || ch == '\t') ch = get(cl);
if (ch == NULLCHAR) break;
if (ch == ';') {
for (ad = argDescriptors; ad->argName != NULL; ad++)
if (strcmp(ad->argName, argName + 1) == 0) break;
if (ad->argName == NULL) {
- ExitArgError(_("Unrecognized argument"), argName, get != &FileGet); // [HGM] make unknown argument non-fatal
+ ExitArgError(_("Unrecognized argument %s"), argName, get != &FileGet); // [HGM] make unknown argument non-fatal
while (ch != '\n' && ch != NULLCHAR) ch = get(cl); // but skip rest of line it is on
continue; // so that when it is in a settings file, it is the only setting that will be purged from it
}
} else {
/* Positional argument */
ad = &argDescriptors[posarg++];
+ posflag++;
strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0]));
}
while (ch == ' ' || ch == '=' || ch == ':' || ch == '\t') ch = get(cl);
if (ch == NULLCHAR || ch == '\n') {
- ExitArgError(_("No value provided for argument"), argName, TRUE);
+ ExitArgError(_("No value provided for argument %s"), argName, TRUE);
}
q = argValue;
if (ch == '{') {
ch = get(cl);
switch (ch) {
case NULLCHAR:
- ExitArgError(_("Incomplete \\ escape in value for"), argName, TRUE);
+ ExitArgError(_("Incomplete \\ escape in value for %s"), argName, TRUE);
break;
case 'n':
*q++ = '\n';
}
}
} else {
- while (ch != ' ' && ch != NULLCHAR && ch != '\t' && ch != '\n') {
+ while ((ch != ' ' || posflag) && ch != NULLCHAR && ch != '\t' && ch != '\n') { // space allowed in positional arg
*q++ = ch;
ch = get(cl);
}
}
*q = NULLCHAR;
+ if(posflag) { // positional argument: the argName was implied, and per default set as -lgf
+ int len = strlen(argValue) - 4; // start of filename extension
+ if(len < 0) len = 0;
+ if(!strcasecmp(argValue + len, ".trn")) {
+ ad = &argDescriptors[2]; // correct implied type to -tf
+ appData.tourney = TRUE; // let it parse -tourneyOptions later
+ } else if(!strcasecmp(argValue + len, ".fen") || !strcasecmp(argValue + len, ".epd")) {
+ ad = &argDescriptors[1]; // correct implied type to -lpf
+ appData.viewer = TRUE;
+ } else if(!strcasecmp(argValue + len, ".ini") || !strcasecmp(argValue + len, ".xop")) {
+ ad = &argDescriptors[0]; // correct implied type to -opt
+ } else if(GetEngineLine(argValue, 11)) {
+ ad = &argDescriptors[3]; // correct implied type to -is
+ } else { // keep default -lgf, but let it imply viewer mode as well
+ appData.viewer = TRUE;
+ }
+ strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0]));
+ }
+
switch (ad->argType) {
case ArgInt:
*(int *) ad->argLoc = ValidateInt(argValue);
} else {
if (ad->argLoc != NULL) {
} else {
- ExitArgError(_("Failed to open indirection file"), argValue, TRUE);
+ ExitArgError(_("Failed to open indirection file %s"), argValue, TRUE);
}
}
}
*(Boolean *) ad->argLoc = FALSE;
break;
default:
- ExitArgError(_("Unrecognized boolean argument value"), argValue, TRUE);
+ ExitArgError(_("Unrecognized boolean argument value %s"), argValue, TRUE);
break;
}
break;
break;
case ArgNone:
- ExitArgError(_("Unrecognized argument"), argValue, TRUE);
+ ExitArgError(_("Unrecognized argument %s"), argValue, TRUE);
break;
case ArgTwo:
case ArgTrue:
ParseArgs(StringGet, &lpCmdLine);
if(appData.viewer && appData.viewerOptions[0]) ParseArgsFromString(appData.viewerOptions);
+ if(appData.tourney && appData.tourneyOptions[0]) ParseArgsFromString(appData.tourneyOptions);
+ chessProgram = GetEngineLine(firstEngineLine, 0) || GetEngineLine(secondEngineLine, 1);
+ appData.icsActive = GetEngineLine(icsNick, 10);
/* [HGM] make sure board size is acceptable */
if(appData.NrFiles > BOARD_FILES ||