* Massachusetts.
*
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
*
* Enhancements Copyright 2005 Alessandro Scotti
*
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 },
{ "pixmap", ArgFilename, (void *) &appData.pixmapDirectory, FALSE, INVALID },
{ "bitmapDirectory", ArgFilename, (void *) &appData.bitmapDirectory, XBOARD, (ArgIniType) "" },
{ "bm", ArgFilename, (void *) &appData.bitmapDirectory, FALSE, INVALID },
+ { "pngDirectory", ArgFilename, (void *) &appData.pngDirectory, XBOARD, (ArgIniType) "" },
+ { "png", ArgFilename, (void *) &appData.pngDirectory, FALSE, INVALID },
{ "soundDirectory", ArgFilename, (void *) &appData.soundDirectory, XBOARD, (ArgIniType) "" },
{ "msLoginDelay", ArgInt, (void *) &appData.msLoginDelay, XBOARD, (ArgIniType) MS_LOGIN_DELAY },
{ "pasteSelection", ArgBoolean, (void *) &appData.pasteSelection, XBOARD, (ArgIniType) FALSE },
{ "td", ArgFloat, (void *) &appData.timeDelay, FALSE, INVALID },
{ "timeControl", ArgString, (void *) &appData.timeControl, TRUE, (ArgIniType) TIME_CONTROL },
{ "tc", ArgString, (void *) &appData.timeControl, FALSE, INVALID },
- { "timeIncrement", ArgFloat, (void *) &appData.timeIncrement, TRUE, INVALID },
+ { "timeIncrement", ArgFloat, (void *) &appData.timeIncrement, FALSE, INVALID },
{ "inc", ArgFloat, (void *) &appData.timeIncrement, FALSE, INVALID },
{ "internetChessServerMode", ArgBoolean, (void *) &appData.icsActive, 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 },
{ "xhighlight", ArgFalse, (void *) &appData.highlightLastMove, FALSE, INVALID },
{ "-highlight", ArgFalse, (void *) &appData.highlightLastMove, FALSE, INVALID },
{ "highlightDragging", ArgBoolean,
- (void *) &appData.highlightDragging, TRUE, INVALID },
+ (void *) &appData.highlightDragging, !XBOARD, (ArgIniType) TRUE },
{ "highdrag", ArgTrue, (void *) &appData.highlightDragging, FALSE, INVALID },
{ "xhighdrag", ArgFalse, (void *) &appData.highlightDragging, FALSE, INVALID },
{ "-highdrag", ArgFalse, (void *) &appData.highlightDragging, FALSE, INVALID },
{ "icsMenu", ArgString, (void *) &icsTextMenuString, TRUE, (ArgIniType) ICS_TEXT_MENU_DEFAULT },
{ "icsNames", ArgString, (void *) &icsNames, TRUE, (ArgIniType) ICS_NAMES },
{ "singleEngineList", ArgBoolean, (void *) &singleList, !XBOARD, (ArgIniType) FALSE },
+ { "recentEngines", ArgInt, (void *) &appData.recentEngines, TRUE, (ArgIniType) 6 },
+ { "recentEngineList", ArgString, (void *) &appData.recentEngineList, TRUE, (ArgIniType) "" },
{ "firstChessProgramNames", ArgString, (void *) &firstChessProgramNames,
TRUE, (ArgIniType) FCP_NAMES },
{ "secondChessProgramNames", ArgString, (void *) &secondChessProgramNames,
{ "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) "" },
{ "keepAlive", ArgInt, (void *) &appData.keepAlive, FALSE, INVALID },
{ "icstype", ArgInt, (void *) &ics_type, FALSE, INVALID },
{ "forceIllegalMoves", ArgTrue, (void *) &appData.forceIllegal, FALSE, INVALID },
- { "showTargetSquares", ArgBoolean, (void *) &appData.markers, TRUE, FALSE },
+ { "showTargetSquares", ArgBoolean, (void *) &appData.markers, TRUE, (ArgIniType) FALSE },
{ "firstPgnName", ArgString, (void *) &appData.pgnName[0], FALSE, (ArgIniType) "" },
{ "fn", ArgString, (void *) &appData.pgnName[0], FALSE, INVALID },
{ "secondPgnName", ArgString, (void *) &appData.pgnName[1], FALSE, (ArgIniType) "" },
{ "stretch", ArgInt, (void *) &appData.stretch, FALSE, (ArgIniType) 1 },
{ "ignoreColors", ArgBoolean, (void *) &appData.ignoreColors, FALSE, FALSE },
{ "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:
// float: casting to int is not harmless, so default cannot be contained in table
appData.timeDelay = TIME_DELAY;
- appData.timeIncrement = TIME_INCREMENT;
+ appData.timeIncrement = -314159;
// some complex, platform-dependent stuff that could not be handled from table
SetDefaultTextAttribs();
/* Parse command line */
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 ||
appData.NrRanks > BOARD_RANKS )
if (appData.icsActive || appData.noChessProgram) {
chessProgram = FALSE; /* not local chess program mode */
}
+ if(appData.timeIncrement == -314159) { // new storage mechanism of (mps,inc) in use and no -inc on command line
+ if(appData.movesPerSession <= 0) { // new encoding of incremental mode
+ appData.timeIncrement = -appData.movesPerSession/1000.;
+ } else appData.timeIncrement = -1;
+ }
+ if(appData.movesPerSession <= 0) appData.movesPerSession = MOVES_PER_SESSION; // mps <= 0 is invalid in any case
/* Open startup dialog if needed */
if ((!appData.noChessProgram && !chessProgram && !appData.icsActive) ||
FILE *f;
ArgDescriptor *ad;
char dir[MSG_SIZ], buf[MSG_SIZ];
+ int mps = appData.movesPerSession;
if (!MainWindowUp()) return;
// [HGM] in WB we have to copy sound names to appData first
ExportSounds();
+ if(appData.timeIncrement >= 0) appData.movesPerSession = -1000*appData.timeIncrement; // kludge to store mps & inc as one
+
for (ad = argDescriptors; ad->argName != NULL; ad++) {
if (!ad->save) continue;
switch (ad->argType) {
}
}
fclose(f);
+ appData.movesPerSession = mps;
}
Boolean