X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=args.h;h=f23f1ab0f5cdc6308122cdcb227d263f06654363;hb=HEAD;hp=e85deb4f3269f58f17a0b3413ee21346cd5fd1f3;hpb=32bbe66c5718d2187e62550c058ffd1632b2f3e6;p=xboard.git diff --git a/args.h b/args.h index e85deb4..f23f1ab 100644 --- a/args.h +++ b/args.h @@ -2,10 +2,10 @@ * args.c -- Option parsing and saving for X and Windows versions of XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, - * Massachusetts. + * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * @@ -49,18 +49,18 @@ * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ - ** See the file ChangeLog for a revision history. + ** See the file ChangeLog for a revision history. */ // Note: this file is not a normal header, but contains executable code // for #inclusion in winboard.c and xboard.c, rather than separate compilation, -// so that it can make use of the proper context of #defined symbols and +// so that it can make use of the proper context of #defined symbols and // declarations in those files. typedef enum { - ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone, + ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone, ArgColor, ArgAttribs, ArgFilename, ArgBoardSize, ArgFont, ArgCommSettings, - ArgSettingsFilename, + ArgSettingsFilename, ArgBackupSettingsFile, ArgTwo, ArgInstall, ArgMaster, ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window } ArgType; @@ -100,8 +100,18 @@ typedef struct { } IcsTextMenuEntry; IcsTextMenuEntry icsTextMenuEntry[ICS_TEXT_MENU_SIZE]; +char dataDir[MSG_SIZ] = DATADIR; int junk; +int saveDate; +int dateStamp; +Boolean singleList; +Boolean autoClose; +char *homeDir; +char *firstEngineLine; +char *secondEngineLine; +char *icsNick; +char *theme; void EnsureOnScreen(int *x, int *y, int minX, int minY); char StringGet(void *getClosure); @@ -121,15 +131,13 @@ void SaveColor(FILE *f, ArgDescriptor *ad); 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); void ParseArgs(GetFunc get, void *cl); // [HGM] this is an exact duplicate of something in winboard.c. Move to backend.c? -char *defaultTextAttribs[] = +char *defaultTextAttribs[] = { COLOR_SHOUT, COLOR_SSHOUT, COLOR_CHANNEL1, COLOR_CHANNEL, COLOR_KIBITZ, COLOR_TELL, COLOR_CHALLENGE, COLOR_REQUEST, COLOR_SEEK, COLOR_NORMAL, @@ -138,9 +146,16 @@ char *defaultTextAttribs[] = 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 */ + { "saveDate", ArgInt, (void *) &saveDate, TRUE, 0 }, + { "date", ArgInt, (void *) &dateStamp, FALSE, 0 }, + { "autoClose", ArgTrue, (void *) &autoClose, FALSE, FALSE }, JAWS_ARGS { "whitePieceColor", ArgColor, (void *) 0, TRUE, (ArgIniType) WHITE_PIECE_COLOR }, { "wpc", ArgColor, (void *) 0, FALSE, INVALID }, @@ -156,8 +171,8 @@ ArgDescriptor argDescriptors[] = { { "phc", ArgColor, (void *) 5, FALSE, INVALID }, { "movesPerSession", ArgInt, (void *) &appData.movesPerSession, TRUE, (ArgIniType) MOVES_PER_SESSION }, { "mps", ArgInt, (void *) &appData.movesPerSession, FALSE, INVALID }, - { "initString", ArgString, (void *) &appData.initString, FALSE, INVALID }, - { "firstInitString", ArgString, (void *) &appData.initString, FALSE, (ArgIniType) INIT_STRING }, + { "initString", ArgString, (void *) &appData.firstInitString, FALSE, INVALID }, + { "firstInitString", ArgString, (void *) &appData.firstInitString, FALSE, (ArgIniType) INIT_STRING }, { "secondInitString", ArgString, (void *) &appData.secondInitString, FALSE, (ArgIniType) INIT_STRING }, { "firstComputerString", ArgString, (void *) &appData.firstComputerString, FALSE, (ArgIniType) COMPUTER_STRING }, @@ -169,6 +184,8 @@ ArgDescriptor argDescriptors[] = { { "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 }, @@ -185,6 +202,9 @@ ArgDescriptor argDescriptors[] = { { "fd", ArgFilename, (void *) &appData.firstDirectory, FALSE, INVALID }, { "secondDirectory", ArgFilename, (void *) &appData.secondDirectory, FALSE, (ArgIniType) SECOND_DIRECTORY }, { "sd", ArgFilename, (void *) &appData.secondDirectory, FALSE, INVALID }, + { "variations", ArgBoolean, (void *) &appData.variations, TRUE, (ArgIniType) FALSE }, + { "appendPV", ArgBoolean, (void *) &appData.autoExtend, TRUE, (ArgIniType) FALSE }, + { "theme", ArgString, (void *) &theme, FALSE, (ArgIniType) "" }, /* some options only used by the XBoard front end, and ignored in WinBoard */ /* Their saving is controlled by XBOARD, which in WinBoard is defined as FALSE */ @@ -201,28 +221,33 @@ ArgDescriptor argDescriptors[] = { { "xtitle", ArgFalse, (void *) &appData.titleInWindow, FALSE, INVALID }, { "flashCount", ArgInt, (void *) &appData.flashCount, XBOARD, INVALID }, // let X handle this { "flashRate", ArgInt, (void *) &appData.flashRate, XBOARD, (ArgIniType) FLASH_RATE }, - { "pixmapDirectory", ArgFilename, (void *) &appData.pixmapDirectory, XBOARD, (ArgIniType) "" }, - { "pixmap", ArgFilename, (void *) &appData.pixmapDirectory, FALSE, INVALID }, - { "bitmapDirectory", ArgFilename, (void *) &appData.bitmapDirectory, XBOARD, (ArgIniType) "" }, - { "bm", ArgFilename, (void *) &appData.bitmapDirectory, FALSE, INVALID }, + { "pieceImageDirectory", ArgFilename, (void *) &appData.pieceDirectory, TRUE, (ArgIniType) "" }, + { "pid", ArgFilename, (void *) &appData.pieceDirectory, FALSE, INVALID }, + { "trueColors", ArgBoolean, (void *) &appData.trueColors, XBOARD, (ArgIniType) (2*!XBOARD) }, + { "jewelled", ArgInt, (void *) &appData.jewelled, FALSE, (ArgIniType) -1 }, + { "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 }, { "dropMenu", ArgBoolean, (void *) &appData.dropMenu, TRUE, (ArgIniType) FALSE }, + { "pieceMenu", ArgBoolean, (void *) &appData.pieceMenu, TRUE, (ArgIniType) TRUE }, + { "sweepPromotions", ArgBoolean, (void *) &appData.sweepSelect, TRUE, (ArgIniType) FALSE }, + { "monoMouse", ArgBoolean, (void *) &appData.monoMouse, XBOARD, (ArgIniType) FALSE }, { "remoteShell", ArgFilename, (void *) &appData.remoteShell, FALSE, (ArgIniType) REMOTE_SHELL }, { "rsh", ArgFilename, (void *) &appData.remoteShell, FALSE, INVALID }, - { "remoteUser", ArgString, (void *) &appData.remoteUser, FALSE, INVALID }, + { "remoteUser", ArgString, (void *) &appData.remoteUser, FALSE, (ArgIniType) "" }, { "ruser", ArgString, (void *) &appData.remoteUser, FALSE, INVALID }, { "timeDelay", ArgFloat, (void *) &appData.timeDelay, TRUE, INVALID }, { "td", ArgFloat, (void *) &appData.timeDelay, FALSE, INVALID }, { "timeControl", ArgString, (void *) &appData.timeControl, TRUE, (ArgIniType) TIME_CONTROL }, { "tc", ArgString, (void *) &appData.timeControl, FALSE, INVALID }, - { "timeIncrement", ArgInt, (void *) &appData.timeIncrement, TRUE, (ArgIniType) TIME_INCREMENT }, - { "inc", ArgInt, (void *) &appData.timeIncrement, FALSE, 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 }, @@ -238,12 +263,13 @@ ArgDescriptor argDescriptors[] = { { "xtelnet", ArgFalse, (void *) &appData.useTelnet, FALSE, INVALID }, { "-telnet", ArgFalse, (void *) &appData.useTelnet, FALSE, INVALID }, { "telnetProgram", ArgFilename, (void *) &appData.telnetProgram, FALSE, (ArgIniType) TELNET_PROGRAM }, - { "internetChessserverHelper", ArgFilename, (void *) &appData.icsHelper, + { "internetChessserverHelper", ArgFilename, (void *) &appData.icsHelper, FALSE, INVALID }, // for XB { "icshelper", ArgFilename, (void *) &appData.icsHelper, FALSE, (ArgIniType) "" }, { "seekGraph", ArgBoolean, (void *) &appData.seekGraph, TRUE, (ArgIniType) FALSE }, { "sg", ArgTrue, (void *) &appData.seekGraph, FALSE, INVALID }, { "autoRefresh", ArgBoolean, (void *) &appData.autoRefresh, TRUE, (ArgIniType) FALSE }, + { "autoBox", ArgBoolean, (void *) &appData.autoBox, XBOARD, (ArgIniType) TRUE }, { "gateway", ArgString, (void *) &appData.gateway, FALSE, (ArgIniType) "" }, { "loadGameFile", ArgFilename, (void *) &appData.loadGameFile, FALSE, (ArgIniType) "" }, { "lgf", ArgFilename, (void *) &appData.loadGameFile, FALSE, INVALID }, @@ -255,10 +281,12 @@ ArgDescriptor argDescriptors[] = { { "autosave", ArgTrue, (void *) &appData.autoSaveGames, FALSE, INVALID }, { "xautosave", ArgFalse, (void *) &appData.autoSaveGames, FALSE, INVALID }, { "-autosave", ArgFalse, (void *) &appData.autoSaveGames, FALSE, INVALID }, + { "onlyOwnGames", ArgBoolean, (void *) &appData.onlyOwn, TRUE, (ArgIniType) FALSE }, { "loadPositionFile", ArgFilename, (void *) &appData.loadPositionFile, FALSE, (ArgIniType) "" }, { "lpf", ArgFilename, (void *) &appData.loadPositionFile, FALSE, INVALID }, { "loadPositionIndex", ArgInt, (void *) &appData.loadPositionIndex, FALSE, (ArgIniType) 1 }, { "lpi", ArgInt, (void *) &appData.loadPositionIndex, FALSE, INVALID }, + { "positionDir", ArgFilename, (void *) &appData.positionDir, FALSE, (ArgIniType) "" }, { "savePositionFile", ArgFilename, (void *) &appData.savePositionFile, FALSE, (ArgIniType) "" }, { "spf", ArgFilename, (void *) &appData.savePositionFile, FALSE, INVALID }, { "matchMode", ArgBoolean, (void *) &appData.matchMode, FALSE, (ArgIniType) FALSE }, @@ -307,16 +335,17 @@ ArgDescriptor argDescriptors[] = { { "popup", ArgTrue, (void *) &appData.popupMoveErrors, FALSE, INVALID }, { "xpopup", ArgFalse, (void *) &appData.popupMoveErrors, FALSE, INVALID }, { "-popup", ArgFalse, (void *) &appData.popupMoveErrors, FALSE, INVALID }, - { "popUpErrors", ArgBoolean, (void *) &appData.popupMoveErrors, + { "popUpErrors", ArgBoolean, (void *) &appData.popupMoveErrors, FALSE, INVALID }, /* only so that old WinBoard.ini files from betas can be read */ { "clockFont", ArgFont, (void *) CLOCK_FONT, TRUE, INVALID }, - { "messageFont", ArgFont, (void *) MESSAGE_FONT, !XBOARD, INVALID }, - { "font", ArgFont, (void *) MESSAGE_FONT, XBOARD, INVALID }, + { "messageFont", ArgFont, (void *) MESSAGE_FONT, TRUE, INVALID }, + { "font", ArgFont, (void *) MESSAGE_FONT, FALSE, INVALID }, /* only so that old .xboardrc files will parse. -font does not work from the command line because it is captured by the X libraries. */ { "coordFont", ArgFont, (void *) COORD_FONT, TRUE, INVALID }, { "tagsFont", ArgFont, (void *) EDITTAGS_FONT, TRUE, INVALID }, { "commentFont", ArgFont, (void *) COMMENT_FONT, TRUE, INVALID }, { "icsFont", ArgFont, (void *) CONSOLE_FONT, TRUE, INVALID }, { "moveHistoryFont", ArgFont, (void *) MOVEHISTORY_FONT, TRUE, INVALID }, /* [AS] */ + { "gameListFont", ArgFont, (void *) GAMELIST_FONT, TRUE, INVALID }, /* [HGM] */ { "boardSize", ArgBoardSize, (void *) &boardSize, TRUE, (ArgIniType) -1 }, /* must come after all fonts */ { "size", ArgBoardSize, (void *) &boardSize, FALSE, INVALID }, @@ -338,6 +367,7 @@ ArgDescriptor argDescriptors[] = { { "autocomm", ArgTrue, (void *) &appData.autoComment, FALSE, INVALID }, { "xautocomm", ArgFalse, (void *) &appData.autoComment, FALSE, INVALID }, { "-autocomm", ArgFalse, (void *) &appData.autoComment, FALSE, INVALID }, + { "autoCreateLogon", ArgBoolean, (void *) &appData.autoCreateLogon, TRUE, (ArgIniType) FALSE }, { "autoObserve", ArgBoolean, (void *) &appData.autoObserve, TRUE, (ArgIniType) FALSE }, { "autobs", ArgTrue, (void *) &appData.autoObserve, FALSE, INVALID }, { "xautobs", ArgFalse, (void *) &appData.autoObserve, FALSE, INVALID }, @@ -416,7 +446,7 @@ ArgDescriptor argDescriptors[] = { { "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 }, @@ -448,11 +478,13 @@ ArgDescriptor argDescriptors[] = { { "soundSeek", ArgFilename, (void *) &appData.soundSeek, TRUE, (ArgIniType) "" }, { "soundMove", ArgFilename, (void *) &appData.soundMove, TRUE, (ArgIniType) "" }, { "soundBell", ArgFilename, (void *) &appData.soundBell, TRUE, (ArgIniType) SOUND_BELL }, + { "soundRoar", ArgFilename, (void *) &appData.soundRoar, TRUE, (ArgIniType) "" }, { "soundIcsWin", ArgFilename, (void *) &appData.soundIcsWin, TRUE, (ArgIniType) "" }, { "soundIcsLoss", ArgFilename, (void *) &appData.soundIcsLoss, TRUE, (ArgIniType) "" }, { "soundIcsDraw", ArgFilename, (void *) &appData.soundIcsDraw, TRUE, (ArgIniType) "" }, { "soundIcsUnfinished", ArgFilename, (void *) &appData.soundIcsUnfinished, TRUE, (ArgIniType) "" }, { "soundIcsAlarm", ArgFilename, (void *) &appData.soundIcsAlarm, TRUE, (ArgIniType) "" }, + { "disguisePromotedPieces", ArgBoolean, (void *) &appData.disguise, TRUE, (ArgIniType) TRUE }, { "reuseFirst", ArgBoolean, (void *) &appData.reuseFirst, FALSE, (ArgIniType) TRUE }, { "reuse", ArgTrue, (void *) &appData.reuseFirst, FALSE, INVALID }, { "xreuse", ArgFalse, (void *) &appData.reuseFirst, FALSE, INVALID }, @@ -466,7 +498,10 @@ ArgDescriptor argDescriptors[] = { { "comPortSettings", ArgCommSettings, (void *) /*&dcb*/ 0, TRUE, INVALID }, { "settingsFile", ArgSettingsFilename, (void *) &settingsFileName, FALSE, (ArgIniType) SETTINGS_FILE }, { "ini", ArgSettingsFilename, (void *) &settingsFileName, FALSE, INVALID }, + { "at", ArgSettingsFilename, (void *) NULL, FALSE, INVALID }, + { "opt", ArgSettingsFilename, (void *) NULL, FALSE, INVALID }, { "saveSettingsFile", ArgFilename, (void *) &settingsFileName, FALSE, INVALID }, + { "backupSettingsFile", ArgBackupSettingsFile, (void *) &settingsFileName, FALSE, INVALID }, { "saveSettingsOnExit", ArgBoolean, (void *) &saveSettingsOnExit, TRUE, (ArgIniType) TRUE }, { "chessProgram", ArgBoolean, (void *) &chessProgram, FALSE, (ArgIniType) FALSE }, { "cp", ArgTrue, (void *) &chessProgram, FALSE, INVALID }, @@ -474,10 +509,17 @@ ArgDescriptor argDescriptors[] = { { "-cp", ArgFalse, (void *) &chessProgram, 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, - TRUE, (ArgIniType) SCP_NAMES }, + !XBOARD, (ArgIniType) SCP_NAMES }, + { "themeNames", ArgString, (void *) &appData.themeNames, TRUE, (ArgIniType) "native -upf false -ub false -ubt false -pid \"\"\n" }, + { "addMasterOption", ArgMaster, NULL, FALSE, INVALID }, + { "installEngine", ArgInstall, (void *) &firstChessProgramNames, FALSE, (ArgIniType) "" }, + { "installTheme", ArgInstall, (void *) &appData.themeNames, FALSE, (ArgIniType) "" }, { "initialMode", ArgString, (void *) &appData.initialMode, FALSE, (ArgIniType) "" }, { "mode", ArgString, (void *) &appData.initialMode, FALSE, INVALID }, { "variant", ArgString, (void *) &appData.variant, FALSE, (ArgIniType) "normal" }, @@ -493,16 +535,25 @@ ArgDescriptor argDescriptors[] = { { "secondScoreAbs", ArgBoolean, (void *) &appData.secondScoreIsAbsolute, FALSE, (ArgIniType) FALSE }, { "pgnExtendedInfo", ArgBoolean, (void *) &appData.saveExtendedInfoInPGN, TRUE, (ArgIniType) FALSE }, { "hideThinkingFromHuman", ArgBoolean, (void *) &appData.hideThinkingFromHuman, TRUE, (ArgIniType) FALSE }, - { "liteBackTextureFile", ArgString, (void *) &appData.liteBackTextureFile, TRUE, (ArgIniType) "" }, - { "darkBackTextureFile", ArgString, (void *) &appData.darkBackTextureFile, TRUE, (ArgIniType) "" }, + { "pgnTimeLeft", ArgBoolean, (void *) &appData.cumulativeTimePGN, TRUE, (ArgIniType) FALSE }, + { "liteBackTextureFile", ArgFilename, (void *) &appData.liteBackTextureFile, TRUE, (ArgIniType) "" }, + { "lbtf", ArgFilename, (void *) &appData.liteBackTextureFile, FALSE, INVALID }, + { "darkBackTextureFile", ArgFilename, (void *) &appData.darkBackTextureFile, TRUE, (ArgIniType) "" }, + { "dbtf", ArgFilename, (void *) &appData.darkBackTextureFile, FALSE, INVALID }, { "liteBackTextureMode", ArgInt, (void *) &appData.liteBackTextureMode, TRUE, (ArgIniType) BACK_TEXTURE_MODE_PLAIN }, + { "lbtm", ArgInt, (void *) &appData.liteBackTextureMode, FALSE, INVALID }, { "darkBackTextureMode", ArgInt, (void *) &appData.darkBackTextureMode, TRUE, (ArgIniType) BACK_TEXTURE_MODE_PLAIN }, + { "dbtm", ArgInt, (void *) &appData.darkBackTextureMode, FALSE, INVALID }, { "renderPiecesWithFont", ArgString, (void *) &appData.renderPiecesWithFont, TRUE, (ArgIniType) "" }, + { "pf", ArgString, (void *) &appData.renderPiecesWithFont, FALSE, INVALID }, { "fontPieceToCharTable", ArgString, (void *) &appData.fontToPieceTable, TRUE, (ArgIniType) "" }, + { "fptc", ArgString, (void *) &appData.fontToPieceTable, FALSE, INVALID }, { "fontPieceBackColorWhite", ArgColor, (void *) 8, TRUE, (ArgIniType) WHITE_PIECE_COLOR }, { "fontPieceForeColorWhite", ArgColor, (void *) 9, TRUE, (ArgIniType) WHITE_PIECE_COLOR }, { "fontPieceBackColorBlack", ArgColor, (void *) 10, TRUE, (ArgIniType) BLACK_PIECE_COLOR }, { "fontPieceForeColorBlack", ArgColor, (void *) 11, TRUE, (ArgIniType) BLACK_PIECE_COLOR }, + { "fpfcw", ArgColor, (void *) 9, FALSE, INVALID }, + { "fpbcb", ArgColor, (void *) 10, FALSE, INVALID }, { "fontPieceSize", ArgInt, (void *) &appData.fontPieceSize, TRUE, (ArgIniType) 80 }, { "overrideLineGap", ArgInt, (void *) &appData.overrideLineGap, TRUE, (ArgIniType) 1 }, { "adjudicateLossThreshold", ArgInt, (void *) &appData.adjudicateLossThreshold, TRUE, (ArgIniType) 0 }, @@ -512,6 +563,8 @@ ArgDescriptor argDescriptors[] = { { "debugfile", ArgFilename, (void *) &appData.nameOfDebugFile, FALSE, INVALID }, { "pgnEventHeader", ArgString, (void *) &appData.pgnEventHeader, TRUE, (ArgIniType) "Computer Chess Game" }, { "defaultFrcPosition", ArgInt, (void *) &appData.defaultFrcPosition, TRUE, (ArgIniType) -1 }, + { "shuffleOpenings", ArgTrue, (void *) &shuffleOpenings, FALSE, INVALID }, + { "fischerCastling", ArgTrue, (void *) &appData.fischerCastling, FALSE, INVALID }, { "gameListTags", ArgString, (void *) &appData.gameListTags, TRUE, (ArgIniType) GLT_DEFAULT_TAGS }, { "saveOutOfBookInfo", ArgBoolean, (void *) &appData.saveOutOfBookInfo, TRUE, (ArgIniType) TRUE }, { "showEvalInMoveHistory", ArgBoolean, (void *) &appData.showEvalInMoveHistory, TRUE, (ArgIniType) TRUE }, @@ -525,8 +578,14 @@ ArgDescriptor argDescriptors[] = { { "autoDisplayTags", ArgBoolean, (void *) &appData.autoDisplayTags, TRUE, (ArgIniType) TRUE }, { "firstIsUCI", ArgBoolean, (void *) &appData.firstIsUCI, FALSE, (ArgIniType) FALSE }, { "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 }, { "firstHasOwnBookUCI", ArgBoolean, (void *) &appData.firstHasOwnBookUCI, FALSE, (ArgIniType) TRUE }, { "fNoOwnBookUCI", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID }, { "firstXBook", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID }, @@ -534,22 +593,62 @@ ArgDescriptor argDescriptors[] = { { "sNoOwnBookUCI", ArgFalse, (void *) &appData.secondHasOwnBookUCI, FALSE, INVALID }, { "secondXBook", ArgFalse, (void *) &appData.secondHasOwnBookUCI, FALSE, INVALID }, { "adapterCommand", ArgFilename, (void *) &appData.adapterCommand, TRUE, (ArgIniType) "polyglot -noini -ec \"%fcp\" -ed \"%fd\"" }, + { "uxiAdapter", ArgFilename, (void *) &appData.ucciAdapter, TRUE, (ArgIniType) "" }, { "polyglotDir", ArgFilename, (void *) &appData.polyglotDir, TRUE, (ArgIniType) "" }, { "usePolyglotBook", ArgBoolean, (void *) &appData.usePolyglotBook, TRUE, (ArgIniType) FALSE }, { "polyglotBook", ArgFilename, (void *) &appData.polyglotBook, TRUE, (ArgIniType) "" }, - { "defaultHashSize", ArgInt, (void *) &appData.defaultHashSize, TRUE, (ArgIniType) 64 }, + { "bookDepth", ArgInt, (void *) &appData.bookDepth, TRUE, (ArgIniType) 12 }, + { "bookVariation", ArgInt, (void *) &appData.bookStrength, TRUE, (ArgIniType) 50 }, + { "discourageOwnBooks", ArgBoolean, (void *) &appData.defNoBook, TRUE, (ArgIniType) FALSE }, + { "mcBookMode", ArgTrue, (void *) &mcMode, FALSE, (ArgIniType) FALSE }, + { "defaultHashSize", ArgInt, (void *) &appData.defaultHashSize, TRUE, (ArgIniType) 64 }, { "defaultCacheSizeEGTB", ArgInt, (void *) &appData.defaultCacheSizeEGTB, TRUE, (ArgIniType) 4 }, { "defaultPathEGTB", ArgFilename, (void *) &appData.defaultPathEGTB, TRUE, (ArgIniType) "c:\\egtb" }, + { "language", ArgFilename, (void *) &appData.language, TRUE, (ArgIniType) "" }, + { "userFileDirectory", ArgFilename, (void *) &homeDir, FALSE, (ArgIniType) installDir }, + { "usePieceFont", ArgBoolean, (void *) &appData.useFont, TRUE, (ArgIniType) FALSE }, + { "upf", ArgBoolean, (void *) &appData.useFont, FALSE, INVALID }, + { "useBoardTexture", ArgBoolean, (void *) &appData.useBitmaps, TRUE, (ArgIniType) FALSE }, + { "ubt", ArgBoolean, (void *) &appData.useBitmaps, FALSE, INVALID }, + { "useBorder", ArgBoolean, (void *) &appData.useBorder, TRUE, (ArgIniType) FALSE }, + { "ub", ArgBoolean, (void *) &appData.useBorder, FALSE, INVALID }, + { "border", ArgFilename, (void *) &appData.border, TRUE, (ArgIniType) "" }, + { "finger", ArgFilename, (void *) &appData.finger, FALSE, (ArgIniType) "" }, + { "epd", ArgTrue, (void *) &appData.epd, FALSE, INVALID }, + { "inscriptions", ArgString, (void *) &appData.inscriptions, FALSE, (ArgIniType) "" }, + { "autoInstall", ArgString, (void *) &appData.autoInstall, XBOARD, (ArgIniType) "" }, + { "fixedSize", ArgBoolean, (void *) &appData.fixedSize, TRUE, (ArgIniType) FALSE }, + { "showMoveTime", ArgBoolean, (void *) &appData.moveTime, TRUE, (ArgIniType) FALSE }, + + // [HGM] tournament options + { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, (ArgIniType) "" }, + { "tf", ArgFilename, (void *) &appData.tourneyFile, FALSE, INVALID }, + { "participants", ArgString, (void *) &appData.participants, FALSE, (ArgIniType) "" }, + { "tourneyType", ArgInt, (void *) &appData.tourneyType, FALSE, (ArgIniType) 0 }, + { "tt", ArgInt, (void *) &appData.tourneyType, FALSE, INVALID }, + { "tourneyCycles", ArgInt, (void *) &appData.tourneyCycles, FALSE, (ArgIniType) 1 }, + { "cy", ArgInt, (void *) &appData.tourneyCycles, FALSE, INVALID }, + { "results", ArgString, (void *) &appData.results, FALSE, (ArgIniType) "" }, + { "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 }, /* [HGM] board-size, adjudication and misc. options */ { "oneClickMove", ArgBoolean, (void *) &appData.oneClick, TRUE, (ArgIniType) FALSE }, - { "boardWidth", ArgInt, (void *) &appData.NrFiles, TRUE, (ArgIniType) -1 }, - { "boardHeight", ArgInt, (void *) &appData.NrRanks, TRUE, (ArgIniType) -1 }, - { "holdingsSize", ArgInt, (void *) &appData.holdingsSize, TRUE, (ArgIniType) -1 }, + { "boardWidth", ArgInt, (void *) &appData.NrFiles, FALSE, (ArgIniType) -1 }, + { "boardHeight", ArgInt, (void *) &appData.NrRanks, FALSE, (ArgIniType) -1 }, + { "rankOffset", ArgInt, (void *) &appData.rankOffset, FALSE, (ArgIniType) 0 }, + { "holdingsSize", ArgInt, (void *) &appData.holdingsSize, FALSE, (ArgIniType) -1 }, + { "defaultMatchGames", ArgInt, (void *) &appData.defaultMatchGames, TRUE, (ArgIniType) 10 }, { "matchPause", ArgInt, (void *) &appData.matchPause, TRUE, (ArgIniType) 10000 }, { "pieceToCharTable", ArgString, (void *) &appData.pieceToCharTable, FALSE, INVALID }, - { "flipBlack", ArgBoolean, (void *) &appData.upsideDown, TRUE, (ArgIniType) FALSE }, - { "allWhite", ArgBoolean, (void *) &appData.allWhite, TRUE, (ArgIniType) FALSE }, + { "pieceNickNames", ArgString, (void *) &appData.pieceNickNames, FALSE, INVALID }, + { "colorNickNames", ArgString, (void *) &appData.colorNickNames, FALSE, INVALID }, + { "flipBlack", ArgBoolean, (void *) &appData.upsideDown, FALSE, (ArgIniType) FALSE }, + { "allWhite", ArgBoolean, (void *) &appData.allWhite, FALSE, (ArgIniType) FALSE }, { "alphaRank", ArgBoolean, (void *) &appData.alphaRank, FALSE, (ArgIniType) FALSE }, { "firstAlphaRank", ArgBoolean, (void *) &first.alphaRank, FALSE, (ArgIniType) FALSE }, { "secondAlphaRank", ArgBoolean, (void *) &second.alphaRank, FALSE, (ArgIniType) FALSE }, @@ -559,6 +658,8 @@ ArgDescriptor argDescriptors[] = { { "trivialDraws", ArgBoolean, (void *) &appData.trivialDraws, TRUE, (ArgIniType) FALSE }, { "ruleMoves", ArgInt, (void *) &appData.ruleMoves, TRUE, (ArgIniType) 51 }, { "repeatsToDraw", ArgInt, (void *) &appData.drawRepeats, TRUE, (ArgIniType) 6 }, + { "backgroundObserve", ArgBoolean, (void *) &appData.bgObserve, TRUE, (ArgIniType) FALSE }, + { "dualBoard", ArgBoolean, (void *) &appData.dualBoard, TRUE, (ArgIniType) FALSE }, { "autoKibitz", ArgTrue, (void *) &appData.autoKibitz, FALSE, INVALID }, { "engineDebugOutput", ArgInt, (void *) &appData.engineComments, FALSE, (ArgIniType) 1 }, { "userName", ArgString, (void *) &appData.userName, FALSE, INVALID }, @@ -567,19 +668,60 @@ ArgDescriptor argDescriptors[] = { { "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) "" }, + { "firstFeatures", ArgString, (void *) &appData.features[0], FALSE, (ArgIniType) "" }, + { "secondFeatures", ArgString, (void *) &appData.features[1], FALSE, (ArgIniType) "" }, + { "featureDefaults", ArgString, (void *) &appData.featureDefaults, TRUE, (ArgIniType) "" }, { "firstNeedsNoncompliantFEN", ArgString, (void *) &appData.fenOverride1, FALSE, (ArgIniType) NULL }, { "secondNeedsNoncompliantFEN", ArgString, (void *) &appData.fenOverride2, FALSE, (ArgIniType) NULL }, { "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 }, - -#ifdef ZIPPY + { "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) "" }, + { "sn", ArgString, (void *) &appData.pgnName[1], FALSE, INVALID }, + { "absoluteAnalysisScores", ArgBoolean, (void *) &appData.whitePOV, TRUE, FALSE }, + { "scoreWhite", ArgBoolean, (void *) &appData.scoreWhite, TRUE, FALSE }, + { "evalZoom", ArgInt, (void *) &appData.zoom, TRUE, (ArgIniType) 1 }, + { "evalThreshold", ArgInt, (void *) &appData.evalThreshold, TRUE, (ArgIniType) 25 }, + { "firstPseudo", ArgTrue, (void *) &appData.pseudo[0], FALSE, FALSE }, + { "secondPseudo", ArgTrue, (void *) &appData.pseudo[1], FALSE, FALSE }, + { "fSAN", ArgTrue, (void *) &appData.pvSAN[0], FALSE, FALSE }, + { "sSAN", ArgTrue, (void *) &appData.pvSAN[1], FALSE, FALSE }, + { "pairingEngine", ArgFilename, (void *) &appData.pairingEngine, TRUE, "" }, + { "defaultTourneyName", ArgFilename, (void *) &appData.defName, TRUE, "" }, + { "eloThresholdAny", ArgInt, (void *) &appData.eloThreshold1, FALSE, (ArgIniType) 0 }, + { "eloThresholdBoth", ArgInt, (void *) &appData.eloThreshold2, FALSE, (ArgIniType) 0 }, + { "dateThreshold", ArgInt, (void *) &appData.dateThreshold, FALSE, (ArgIniType) 0 }, + { "searchMode", ArgInt, (void *) &appData.searchMode, FALSE, (ArgIniType) 1 }, + { "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) "" }, + { "firstDrawDepth", ArgInt, (void *) &appData.drawDepth[0], FALSE, (ArgIniType) 0 }, + { "secondDrawDepth", ArgInt, (void *) &appData.drawDepth[1], FALSE, (ArgIniType) 0 }, + { "memoHeaders", ArgBoolean, (void *) &appData.headers, TRUE, (ArgIniType) FALSE }, + { "startupMessage", ArgString, (void *) &appData.message, FALSE, (ArgIniType) "" }, + { "messageSuppress", ArgString, (void *) &appData.suppress, XBOARD, (ArgIniType) "" }, + { "fen", ArgString, (void *) &appData.fen, FALSE, (ArgIniType) "" }, + { "men", ArgString, (void *) &appData.men, FALSE, (ArgIniType) "" }, + { "analysisBell", ArgInt, (void *) &appData.analysisBell, TRUE, (ArgIniType) 0 }, + +#if ZIPPY { "zippyTalk", ArgBoolean, (void *) &appData.zippyTalk, FALSE, (ArgIniType) ZIPPY_TALK }, { "zt", ArgTrue, (void *) &appData.zippyTalk, FALSE, INVALID }, { "xzt", ArgFalse, (void *) &appData.zippyTalk, FALSE, INVALID }, @@ -623,7 +765,9 @@ ArgDescriptor argDescriptors[] = { { "zippyReplyTimeout", ArgInt, (void *)&junk, FALSE, INVALID }, #endif /* [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 }, @@ -637,22 +781,20 @@ ArgDescriptor argDescriptors[] = { { "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 { "x", ArgInt, (void *) &wpMain.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "y", ArgInt, (void *) &wpMain.y, TRUE, (ArgIniType) CW_USEDEFAULT }, + { "icsUp", ArgBoolean, (void *) &wpConsole.visible, XBOARD, (ArgIniType) FALSE }, { "icsX", ArgX, (void *) &wpConsole.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "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 }, @@ -665,6 +807,12 @@ ArgDescriptor argDescriptors[] = { { "gameListY", ArgY, (void *) &wpGameList.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "gameListW", ArgInt, (void *) &wpGameList.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "gameListH", ArgInt, (void *) &wpGameList.height, TRUE, (ArgIniType) CW_USEDEFAULT }, +#if XBOARD + { "slaveX", ArgX, (void *) &wpDualBoard.x, TRUE, (ArgIniType) CW_USEDEFAULT }, + { "slaveY", ArgY, (void *) &wpDualBoard.y, TRUE, (ArgIniType) CW_USEDEFAULT }, + { "slaveW", ArgInt, (void *) &wpDualBoard.width, FALSE, (ArgIniType) CW_USEDEFAULT }, + { "slaveH", ArgInt, (void *) &wpDualBoard.height, FALSE, (ArgIniType) CW_USEDEFAULT }, +#endif /* [AS] Layout stuff */ { "moveHistoryUp", ArgBoolean, (void *) &wpMoveHistory.visible, TRUE, (ArgIniType) TRUE }, { "moveHistoryX", ArgX, (void *) &wpMoveHistory.x, TRUE, (ArgIniType) CW_USEDEFAULT }, @@ -694,21 +842,50 @@ ArgDescriptor argDescriptorIndirection = { "", ArgSettingsFilename, (void *) NULL, FALSE }; void -ExitArgError(char *msg, char *badArg) +ExitArgError(char *msg, char *badArg, Boolean quit) { char buf[MSG_SIZ]; + int len; + + 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); - sprintf(buf, "%s %s", msg, badArg); + if(!quit) { printf(_("%s in settings file\n"), buf); return; } // DisplayError does not work yet at this stage... DisplayFatalError(buf, 0, 2); exit(2); } +void +AppendToSettingsFile (char *line) +{ + char buf[MSG_SIZ]; + FILE *f; + int c; + if(f = fopen(SETTINGS_FILE, "r")) { + do { + int i = 0; + while((buf[i] = c = fgetc(f)) != '\n' && c != EOF) if(i < MSG_SIZ-1) i++; + buf[i] = NULLCHAR; + if(!strcmp(line, buf)) return; // line occurs + } while(c != EOF); + // line did not occur; add it + fclose(f); + if(f = fopen(SETTINGS_FILE, "a")) { + TimeMark now; + GetTimeMark(&now); + fprintf(f, "-date %10lu\n%s\n", now.sec, line); + fclose(f); + } + } +} + int ValidateInt(char *s) { char *p = s; if(*p == '-' || *p == '+') p++; - while(*p) if(!isdigit(*p++)) ExitArgError("Bad integer value", s); + while(*p) if(!isdigit(*p++)) ExitArgError(_("Bad integer value %s"), s, TRUE); return atoi(s); } @@ -739,18 +916,37 @@ Boolean ParseSettingsFile(char *name, char **addr) { FILE *f; - int ok; char buf[MSG_SIZ], fullname[MSG_SIZ]; + int ok,len; + char buf[MSG_SIZ], fullname[MSG_SIZ]; + ok = MySearchPath(installDir, name, fullname); - if(!ok && strchr(name, '.') == NULL) { // [HGM] append default file-name extension '.ini' when needed - sprintf(buf, "%s.ini", name); - ok = MySearchPath(installDir, buf, fullname); - } + if(!ok && strchr(name, '.') == NULL) + { // append default file-name extension '.ini' when needed + len = snprintf(buf,MSG_SIZ, "%s.ini", name); + if( (len >= MSG_SIZ) && appData.debugMode ) + fprintf(debugFP, "ParseSettingsFile: buffer truncated. Input: name=%s \n",name); + + ok = MySearchPath(installDir, buf, fullname); + } if (ok) { f = fopen(fullname, "r"); +#ifdef DATADIR + if(f == NULL && *fullname != '/' && !addr) { // when a relative name did not work + char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "~/.xboard/themes/conf/%s", name); + MySearchPath(installDir, buf, fullname); // first look in user's own files + f = fopen(fullname, "r"); + if(f == NULL) { + snprintf(buf, MSG_SIZ, "%s/themes/conf", dataDir); + MySearchPath(buf, name, fullname); // also look in standard place + f = fopen(fullname, "r"); + } + } +#endif if (f != NULL) { if (addr != NULL) { - *addr = strdup(fullname); + ASSIGN(*addr, fullname); } ParseArgs(FileGet, f); fclose(f); @@ -767,13 +963,14 @@ ParseArgs(GetFunc get, void *cl) char argValue[MAX_ARG_LEN]; ArgDescriptor *ad; char start; - char *q; + char *q, *r, *s; 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 == ';') { @@ -781,7 +978,7 @@ ParseArgs(GetFunc get, void *cl) ch = get(cl); while (ch != '\n' && ch != NULLCHAR) ch = get(cl); continue; - } else if (ch == '/' || ch == '-') { + } else if (ch == SLASH || ch == '-') { /* Switch */ q = argName; while (ch != ' ' && ch != '=' && ch != ':' && ch != NULLCHAR && @@ -790,13 +987,15 @@ ParseArgs(GetFunc get, void *cl) ch = get(cl); } *q = NULLCHAR; - for (ad = argDescriptors; ad->argName != NULL; ad++) if (strcmp(ad->argName, argName + 1) == 0) break; - - if (ad->argName == NULL) - ExitArgError("Unrecognized argument", argName); - + if (ad->argName == NULL) { + char endChar = (ch && ch != '\n' && (ch = get(cl)) == '{' ? '}' : '\n'); + ExitArgError(_("Unrecognized argument %s"), argName, get != &FileGet); // [HGM] make unknown argument non-fatal + while (ch != endChar && ch != NULLCHAR) ch = get(cl); // but skip rest of line it is on (or until closing '}' ) + if(ch == '}') ch = get(cl); + continue; // so that when it is in a settings file, it is the only setting that will be purged from it + } } else if (ch == '@') { /* Indirection file */ ad = &argDescriptorIndirection; @@ -804,9 +1003,14 @@ ParseArgs(GetFunc get, void *cl) } else { /* Positional argument */ ad = &argDescriptors[posarg++]; - strcpy(argName, ad->argName); + posflag++; + strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0])); } + if (ad->argType == ArgTwo) { // [HGM] kludgey arg type, not suitable for saving + *(Boolean *) ad->argLoc = 2; + continue; + } if (ad->argType == ArgTrue) { *(Boolean *) ad->argLoc = TRUE; continue; @@ -818,7 +1022,7 @@ ParseArgs(GetFunc get, void *cl) while (ch == ' ' || ch == '=' || ch == ':' || ch == '\t') ch = get(cl); if (ch == NULLCHAR || ch == '\n') { - ExitArgError("No value provided for argument", argName); + ExitArgError(_("No value provided for argument %s"), argName, TRUE); } q = argValue; if (ch == '{') { @@ -831,7 +1035,7 @@ ParseArgs(GetFunc get, void *cl) case NULLCHAR: start = NULLCHAR; break; - + case '}': ch = get(cl); start = NULLCHAR; @@ -842,7 +1046,7 @@ ParseArgs(GetFunc get, void *cl) ch = get(cl); break; } - } + } } else if (ch == '\'' || ch == '"') { // Quoting with ' ' or " ", with \ as escape character. // Inconvenient for long strings that may contain Windows filenames. @@ -878,7 +1082,7 @@ ParseArgs(GetFunc get, void *cl) ch = get(cl); switch (ch) { case NULLCHAR: - ExitArgError("Incomplete \\ escape in value for", argName); + ExitArgError(_("Incomplete \\ escape in value for %s"), argName, TRUE); break; case 'n': *q++ = '\n'; @@ -922,20 +1126,39 @@ ParseArgs(GetFunc get, void *cl) } } } 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); break; case ArgX: - *(int *) ad->argLoc = ValidateInt(argValue) + wpMain.x; // [HGM] placement: translate stored relative to absolute + *(int *) ad->argLoc = ValidateInt(argValue) + wpMain.x; // [HGM] placement: translate stored relative to absolute break; case ArgY: @@ -944,7 +1167,7 @@ ParseArgs(GetFunc get, void *cl) case ArgZ: *(int *) ad->argLoc = ValidateInt(argValue); - EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); + EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); break; case ArgFloat: @@ -953,16 +1176,24 @@ ParseArgs(GetFunc get, void *cl) case ArgString: case ArgFilename: - *(char **) ad->argLoc = strdup(argValue); + if(argValue[0] == '~' && argValue[1] == '~') { + char buf[4*MSG_SIZ]; // expand ~~ + snprintf(buf, 4*MSG_SIZ, "%s%s", dataDir, argValue+2); + ASSIGN(*(char **) ad->argLoc, buf); + break; + } + ASSIGN(*(char **) ad->argLoc, argValue); break; + case ArgBackupSettingsFile: // no-op if non-default settings-file already successfully read + if(strcmp(*(char**)ad->argLoc, SETTINGS_FILE)) break; case ArgSettingsFilename: { if (ParseSettingsFile(argValue, (char**)ad->argLoc)) { } else { if (ad->argLoc != NULL) { } else { - ExitArgError("Failed to open indirection file", argValue); + ExitArgError(_("Failed to open indirection file %s"), argValue, TRUE); } } } @@ -979,13 +1210,13 @@ ParseArgs(GetFunc get, void *cl) *(Boolean *) ad->argLoc = FALSE; break; default: - ExitArgError("Unrecognized boolean argument value", argValue); + ExitArgError(_("Unrecognized boolean argument value %s"), argValue, TRUE); break; } break; case ArgColor: - ParseColor((int)ad->argLoc, argValue); + ParseColor((int)(intptr_t)ad->argLoc, argValue); break; case ArgAttribs: { @@ -993,22 +1224,56 @@ ParseArgs(GetFunc get, void *cl) ParseTextAttribs(cc, argValue); // [HGM] wrapper for platform independency } break; - + case ArgBoardSize: ParseBoardSize(ad->argLoc, argValue); break; case ArgFont: - ParseFont(argValue, (int)ad->argLoc); + ParseFont(argValue, (int)(intptr_t)ad->argLoc); break; case ArgCommSettings: ParseCommPortSettings(argValue); break; + case ArgMaster: + AppendToSettingsFile(argValue); + break; + + case ArgInstall: + q = *(char **) ad->argLoc; + r = NULL; s = argValue; + if(argValue[0] == '#') { // group specification + r = strstr(argValue, "\\n"); + if(r) *r++ = '\n', *r++ = NULLCHAR, s = r, r = argValue; // split s into line-to-add (s) and group (r) + } + if((saveDate == 0 || saveDate - dateStamp < 0) && !strstr(q, s) ) { // not seen before, and line does not occur yet + int l = strlen(q) + strlen(s); + if(r) { // must be put in group r + char *p = strstr(q, r); + if(p) { // group already exists + p += strlen(r) - 1; // determine insertion point (immediately after group header line) + *(char **) ad->argLoc = malloc(l+2); + *p++ = NULLCHAR; // spit old value (q) at insertion point into q and p + snprintf(*(char **) ad->argLoc, l+2, "%s\n%s\n%s", q, s, p); // insert (with newline) + } else { // group did not exist, create at end + l += strlen(r) + 8; + *(char **) ad->argLoc = malloc(l); + snprintf(*(char **) ad->argLoc, l, "%s%s%s\n# end\n", q, r, s); + } + } else { // no group, just add line at end + *(char **) ad->argLoc = malloc(l+2); + snprintf(*(char **) ad->argLoc, l+2, "%s%s\n", q, s); + } + free(q); + } + break; + case ArgNone: - ExitArgError("Unrecognized argument", argValue); + ExitArgError(_("Unrecognized argument %s"), argValue, TRUE); break; + case ArgTwo: case ArgTrue: case ArgFalse: ; } @@ -1016,6 +1281,18 @@ ParseArgs(GetFunc get, void *cl) } void +ParseArgsFromString(char *p) +{ + ParseArgs(StringGet, &p); +} + +void +ParseArgsFromFile(FILE *f) +{ + ParseArgs(FileGet, f); +} + +void ParseIcsTextMenu(char *icsTextMenuString) { // int flags = 0; @@ -1072,7 +1349,7 @@ ParseIcsTextMenu(char *icsTextMenuString) p = t + 1; } e++; - } + } } void @@ -1093,26 +1370,28 @@ SetDefaultsFromList() if(argDescriptors[i].defaultValue != INVALID) switch(argDescriptors[i].argType) { case ArgBoolean: + case ArgTwo: case ArgTrue: case ArgFalse: - *(Boolean *) argDescriptors[i].argLoc = (int)argDescriptors[i].defaultValue; + *(Boolean *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; break; case ArgInt: case ArgX: case ArgY: case ArgZ: - *(int *) argDescriptors[i].argLoc = (int)argDescriptors[i].defaultValue; + *(int *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; break; case ArgString: case ArgFilename: case ArgSettingsFilename: - *(char **) argDescriptors[i].argLoc = (char *)argDescriptors[i].defaultValue; + if((char *)argDescriptors[i].defaultValue) + *(char **) argDescriptors[i].argLoc = strdup((char *)argDescriptors[i].defaultValue); break; case ArgBoardSize: - *(int *) argDescriptors[i].argLoc = (int)argDescriptors[i].defaultValue; + *(int *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; break; case ArgColor: - ParseColor((int)argDescriptors[i].argLoc, (char*)argDescriptors[i].defaultValue); + ParseColor((int)(intptr_t)argDescriptors[i].argLoc, (char*)argDescriptors[i].defaultValue); break; case ArgFloat: // floats cannot be casted to int without precision loss default: ; // some arg types cannot be initialized through table @@ -1136,6 +1415,7 @@ InitAppData(char *lpCmdLine) // float: casting to int is not harmless, so default cannot be contained in table appData.timeDelay = TIME_DELAY; + appData.timeIncrement = -314159; // some complex, platform-dependent stuff that could not be handled from table SetDefaultTextAttribs(); @@ -1148,11 +1428,22 @@ InitAppData(char *lpCmdLine) /* 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 ) DisplayFatalError("Recompile with BOARD_RANKS or BOARD_FILES, to support this size", 0, 2); + if(!*appData.secondChessProgram) { // [HGM] scp defaults to fcp + ASSIGN(appData.secondChessProgram, appData.firstChessProgram); + ASSIGN(appData.secondDirectory, appData.firstDirectory); + appData.secondIsUCI = appData.firstIsUCI; // copy type too! + } + /* [HGM] After parsing the options from the .ini file, and overruling them * with options from the command line, we now make an even higher priority * overrule by WB options attached to the engine command line. This so that @@ -1163,22 +1454,34 @@ InitAppData(char *lpCmdLine) char *p = StrStr(appData.firstChessProgram, "WBopt"); static char *f = "first"; char buf[MSG_SIZ], *q = buf; - if(p != NULL) { // engine command line contains WinBoard options - sprintf(buf, p+6, f, f, f, f, f, f, f, f, f, f); // replace %s in them by "first" + int len; + + if(p != NULL) + { // engine command line contains WinBoard options + len = snprintf(buf, MSG_SIZ, p+6, f, f, f, f, f, f, f, f, f, f); // replace %s in them by "first" + if( (len >= MSG_SIZ) && appData.debugMode ) + fprintf(debugFP, "InitAppData: buffer truncated.\n"); + ParseArgs(StringGet, &q); p[-1] = 0; // cut them offengine command line - } + } } // now do same for second chess program if(appData.secondChessProgram != NULL) { char *p = StrStr(appData.secondChessProgram, "WBopt"); static char *s = "second"; char buf[MSG_SIZ], *q = buf; - if(p != NULL) { // engine command line contains WinBoard options - sprintf(buf, p+6, s, s, s, s, s, s, s, s, s, s); // replace %s in them by "first" + int len; + + if(p != NULL) + { // engine command line contains WinBoard options + len = snprintf(buf,MSG_SIZ, p+6, s, s, s, s, s, s, s, s, s, s); // replace %s in them by "first" + if( (len >= MSG_SIZ) && appData.debugMode ) + fprintf(debugFP, "InitAppData: buffer truncated.\n"); + ParseArgs(StringGet, &q); p[-1] = 0; // cut them offengine command line - } + } } /* Propagate options that affect others */ @@ -1186,12 +1489,23 @@ InitAppData(char *lpCmdLine) 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 + if(*appData.defaultPathEGTB) { // append value of deprecated -defaultPathEGTB to -egtFormats + snprintf(buf, MAX_ARG_LEN, "%s%snalimov:%s", appData.egtFormats, (*appData.egtFormats ?"," : ""), appData.defaultPathEGTB); + ASSIGN(appData.egtFormats, buf); + ASSIGN(appData.defaultPathEGTB, ""); + } /* Open startup dialog if needed */ if ((!appData.noChessProgram && !chessProgram && !appData.icsActive) || (appData.icsActive && *appData.icsHost == NULLCHAR) || (chessProgram && (*appData.firstChessProgram == NULLCHAR || - *appData.secondChessProgram == NULLCHAR))) + *appData.secondChessProgram == NULLCHAR))) PopUpStartupDialog(); /* Make sure save files land in the right (?) directory */ @@ -1202,6 +1516,11 @@ InitAppData(char *lpCmdLine) appData.savePositionFile = strdup(buf); } + if(autoClose) { // was called for updating settingsfile only + if(saveSettingsOnExit) SaveSettings(settingsFileName); + exit(0); + } + /* Finish initialization for fonts and sounds */ CreateFonts(); @@ -1231,8 +1550,11 @@ SaveSettings(char* name) FILE *f; ArgDescriptor *ad; char dir[MSG_SIZ], buf[MSG_SIZ]; + int mps = appData.movesPerSession; - if (!MainWindowUp()) return; + if (!MainWindowUp() && !autoClose) return; + + saveDate = programStartTime.sec; GetCurrentDirectory(MSG_SIZ, dir); if(MySearchPath(installDir, name, buf)) { @@ -1269,6 +1591,8 @@ SaveSettings(char* name) // [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) { @@ -1313,7 +1637,7 @@ SaveSettings(char* name) fprintf(f, OPTCHAR "%s" SEPCHAR "%g\n", ad->argName, *(float *)ad->argLoc); break; case ArgBoolean: - fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, + fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (*(Boolean *)ad->argLoc) ? "true" : "false"); break; case ArgTrue: @@ -1330,10 +1654,17 @@ SaveSettings(char* name) break; case ArgFilename: if(*(char**)ad->argLoc == NULL) break; // just in case - if (strchr(*(char **)ad->argLoc, '\"')) { - fprintf(f, OPTCHAR "%s" SEPCHAR "'%s'\n", ad->argName, *(char **)ad->argLoc); - } else { - fprintf(f, OPTCHAR "%s" SEPCHAR "\"%s\"\n", ad->argName, *(char **)ad->argLoc); + { char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%s", *(char**)ad->argLoc); +#ifdef OSXAPP + if(strstr(buf, dataDir) == buf) + snprintf(buf, MSG_SIZ, "~~%s", *(char**)ad->argLoc + strlen(dataDir)); +#endif + if (strchr(buf, '\"')) { + fprintf(f, OPTCHAR "%s" SEPCHAR "'%s'\n", ad->argName, buf); + } else { + fprintf(f, OPTCHAR "%s" SEPCHAR "\"%s\"\n", ad->argName, buf); + } } break; case ArgBoardSize: @@ -1344,11 +1675,16 @@ SaveSettings(char* name) break; case ArgCommSettings: PrintCommPortSettings(f, ad->argName); + case ArgTwo: case ArgNone: + case ArgBackupSettingsFile: case ArgSettingsFilename: ; + case ArgMaster: ; + case ArgInstall: ; } } fclose(f); + appData.movesPerSession = mps; } Boolean @@ -1356,6 +1692,7 @@ GetArgValue(char *name) { // retrieve (as text) current value of string or int argument given by name // (this is used for maing the values available in the adapter command) ArgDescriptor *ad; + int len; for (ad = argDescriptors; ad->argName != NULL; ad++) if (strcmp(ad->argName, name) == 0) break; @@ -1365,13 +1702,20 @@ GetArgValue(char *name) switch(ad->argType) { case ArgString: case ArgFilename: - strcpy(name, *(char**) ad->argLoc); + strncpy(name, *(char**) ad->argLoc, MSG_SIZ); + return TRUE; case ArgInt: - sprintf(name, "%d", *(int*) ad->argLoc); + len = snprintf(name, MSG_SIZ, "%d", *(int*) ad->argLoc); + if( (len >= MSG_SIZ) && appData.debugMode ) + fprintf(debugFP, "GetArgValue: buffer truncated.\n"); + return TRUE; case ArgBoolean: - sprintf(name, "%s", *(Boolean*) ad->argLoc ? "true" : "false"); + len = snprintf(name, MSG_SIZ, "%s", *(Boolean*) ad->argLoc ? "true" : "false"); + if( (len >= MSG_SIZ) && appData.debugMode ) + fprintf(debugFP, "GetArgValue: buffer truncated.\n"); + return TRUE; default: ; }