X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=args.h;h=acfb8f779c5b6f6c092bbd6abdf57ebab1370f17;hb=50ffaff1de1b05f1bf76dd842e734eff2974afd4;hp=b91d02d2830edf40bf19eb2a7ce8b950308b6b32;hpb=9bf9105bf4c9f7063c261d15b5f8326bf7c20439;p=xboard.git diff --git a/args.h b/args.h index b91d02d..acfb8f7 100644 --- a/args.h +++ b/args.h @@ -5,7 +5,7 @@ * 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 * @@ -60,7 +60,7 @@ typedef enum { ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone, ArgColor, ArgAttribs, ArgFilename, ArgBoardSize, ArgFont, ArgCommSettings, - ArgSettingsFilename, + ArgSettingsFilename, ArgTwo, ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window } ArgType; @@ -102,6 +102,12 @@ typedef struct { IcsTextMenuEntry icsTextMenuEntry[ICS_TEXT_MENU_SIZE]; int junk; +Boolean singleList; +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,8 +127,6 @@ 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); @@ -138,6 +142,10 @@ 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 */ @@ -156,8 +164,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 +177,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 }, @@ -186,6 +196,7 @@ ArgDescriptor argDescriptors[] = { { "secondDirectory", ArgFilename, (void *) &appData.secondDirectory, FALSE, (ArgIniType) SECOND_DIRECTORY }, { "sd", ArgFilename, (void *) &appData.secondDirectory, FALSE, INVALID }, { "variations", ArgBoolean, (void *) &appData.variations, 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 */ @@ -202,30 +213,31 @@ 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, TRUE, (ArgIniType) FALSE }, { "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 }, { "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", 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 }, @@ -313,13 +325,14 @@ ArgDescriptor argDescriptors[] = { { "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 }, @@ -419,7 +432,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 }, @@ -470,6 +483,8 @@ 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 }, { "saveSettingsOnExit", ArgBoolean, (void *) &saveSettingsOnExit, TRUE, (ArgIniType) TRUE }, { "chessProgram", ArgBoolean, (void *) &chessProgram, FALSE, (ArgIniType) FALSE }, @@ -478,10 +493,14 @@ 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, !XBOARD, (ArgIniType) "native -upf false -ub false -ubt false -pid \"\"\n" }, { "initialMode", ArgString, (void *) &appData.initialMode, FALSE, (ArgIniType) "" }, { "mode", ArgString, (void *) &appData.initialMode, FALSE, INVALID }, { "variant", ArgString, (void *) &appData.variant, FALSE, (ArgIniType) "normal" }, @@ -497,16 +516,24 @@ 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) "" }, + { "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 }, @@ -532,8 +559,12 @@ ArgDescriptor argDescriptors[] = { { "fUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID }, { "firstUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID }, { "secondIsUCI", ArgBoolean, (void *) &appData.secondIsUCI, FALSE, (ArgIniType) FALSE }, - { "sUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID }, { "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 }, @@ -541,15 +572,41 @@ 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) "" }, { "bookDepth", ArgInt, (void *) &appData.bookDepth, TRUE, (ArgIniType) 12 }, { "bookVariation", ArgInt, (void *) &appData.bookStrength, TRUE, (ArgIniType) 50 }, + { "discourageOwnBooks", ArgBoolean, (void *) &appData.defNoBook, TRUE, (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) "" }, + + // [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 }, @@ -582,17 +639,48 @@ 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 }, + { "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 }, + { "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) "" }, #if ZIPPY { "zippyTalk", ArgBoolean, (void *) &appData.zippyTalk, FALSE, (ArgIniType) ZIPPY_TALK }, @@ -640,6 +728,7 @@ ArgDescriptor argDescriptors[] = { /* [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 }, @@ -653,9 +742,10 @@ 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 @@ -665,10 +755,6 @@ ArgDescriptor argDescriptors[] = { { "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 }, @@ -710,15 +796,16 @@ 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, "%s %s", msg, badArg); - if( (len > MSG_SIZ) && appData.debugMode ) + 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); + if(!quit) { printf(_("%s in settings file\n"), buf); return; } // DisplayError does not work yet at this stage... DisplayFatalError(buf, 0, 2); exit(2); } @@ -728,7 +815,7 @@ 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); } @@ -767,7 +854,7 @@ ParseSettingsFile(char *name, char **addr) 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 ) + if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "ParseSettingsFile: buffer truncated. Input: name=%s \n",name); ok = MySearchPath(installDir, buf, fullname); @@ -776,7 +863,7 @@ ParseSettingsFile(char *name, char **addr) f = fopen(fullname, "r"); if (f != NULL) { if (addr != NULL) { - *addr = strdup(fullname); + ASSIGN(*addr, fullname); } ParseArgs(FileGet, f); fclose(f); @@ -796,10 +883,11 @@ ParseArgs(GetFunc get, void *cl) 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 == ';') { @@ -816,13 +904,13 @@ 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) { + 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 if (ch == '@') { /* Indirection file */ ad = &argDescriptorIndirection; @@ -830,9 +918,14 @@ ParseArgs(GetFunc get, void *cl) } else { /* Positional argument */ ad = &argDescriptors[posarg++]; + 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; @@ -844,7 +937,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 == '{') { @@ -904,7 +997,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'; @@ -948,13 +1041,32 @@ 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); @@ -979,7 +1091,7 @@ ParseArgs(GetFunc get, void *cl) case ArgString: case ArgFilename: - *(char **) ad->argLoc = strdup(argValue); + ASSIGN(*(char **) ad->argLoc, argValue); break; case ArgSettingsFilename: @@ -988,7 +1100,7 @@ ParseArgs(GetFunc get, void *cl) } else { if (ad->argLoc != NULL) { } else { - ExitArgError("Failed to open indirection file", argValue); + ExitArgError(_("Failed to open indirection file %s"), argValue, TRUE); } } } @@ -1005,7 +1117,7 @@ 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; @@ -1033,8 +1145,9 @@ ParseArgs(GetFunc get, void *cl) break; case ArgNone: - ExitArgError("Unrecognized argument", argValue); + ExitArgError(_("Unrecognized argument %s"), argValue, TRUE); break; + case ArgTwo: case ArgTrue: case ArgFalse: ; } @@ -1042,6 +1155,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; @@ -1119,6 +1244,7 @@ SetDefaultsFromList() if(argDescriptors[i].defaultValue != INVALID) switch(argDescriptors[i].argType) { case ArgBoolean: + case ArgTwo: case ArgTrue: case ArgFalse: *(Boolean *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; @@ -1132,7 +1258,8 @@ SetDefaultsFromList() 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)(intptr_t)argDescriptors[i].defaultValue; @@ -1162,7 +1289,7 @@ InitAppData(char *lpCmdLine) // 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(); @@ -1175,6 +1302,11 @@ 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 ) @@ -1195,7 +1327,7 @@ InitAppData(char *lpCmdLine) 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 ) + if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitAppData: buffer truncated.\n"); ParseArgs(StringGet, &q); @@ -1212,7 +1344,7 @@ InitAppData(char *lpCmdLine) 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 ) + if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitAppData: buffer truncated.\n"); ParseArgs(StringGet, &q); @@ -1225,6 +1357,12 @@ 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 /* Open startup dialog if needed */ if ((!appData.noChessProgram && !chessProgram && !appData.icsActive) || @@ -1270,6 +1408,7 @@ SaveSettings(char* name) FILE *f; ArgDescriptor *ad; char dir[MSG_SIZ], buf[MSG_SIZ]; + int mps = appData.movesPerSession; if (!MainWindowUp()) return; @@ -1308,6 +1447,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) { @@ -1383,11 +1524,13 @@ SaveSettings(char* name) break; case ArgCommSettings: PrintCommPortSettings(f, ad->argName); + case ArgTwo: case ArgNone: case ArgSettingsFilename: ; } } fclose(f); + appData.movesPerSession = mps; } Boolean @@ -1410,13 +1553,13 @@ GetArgValue(char *name) return TRUE; case ArgInt: len = snprintf(name, MSG_SIZ, "%d", *(int*) ad->argLoc); - if( (len > MSG_SIZ) && appData.debugMode ) + if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "GetArgValue: buffer truncated.\n"); return TRUE; case ArgBoolean: len = snprintf(name, MSG_SIZ, "%s", *(Boolean*) ad->argLoc ? "true" : "false"); - if( (len > MSG_SIZ) && appData.debugMode ) + if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "GetArgValue: buffer truncated.\n"); return TRUE;