Implement roaring of Lion
[xboard.git] / args.h
diff --git a/args.h b/args.h
index 4634031..03a7f43 100644 (file)
--- a/args.h
+++ b/args.h
@@ -60,7 +60,7 @@
 typedef enum {
   ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone,
   ArgColor, ArgAttribs, ArgFilename, ArgBoardSize, ArgFont, ArgCommSettings,
-  ArgSettingsFilename, ArgTwo,
+  ArgSettingsFilename, ArgBackupSettingsFile, ArgTwo,
   ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window
 } ArgType;
 
@@ -272,6 +272,7 @@ 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 },
@@ -467,6 +468,7 @@ 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) "" },
@@ -489,6 +491,7 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -595,6 +598,7 @@ ArgDescriptor argDescriptors[] = {
   { "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) "" },
 
   // [HGM] tournament options
   { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, (ArgIniType) "" },
@@ -771,6 +775,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 },
@@ -911,8 +921,10 @@ ParseArgs(GetFunc get, void *cl)
       for (ad = argDescriptors; ad->argName != NULL; ad++)
        if (strcmp(ad->argName, argName + 1) == 0) break;
       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 != '\n' && ch != NULLCHAR) ch = get(cl); // but skip rest of line it is on
+       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 == '@') {
@@ -1098,6 +1110,8 @@ ParseArgs(GetFunc get, void *cl)
       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)) {
@@ -1530,6 +1544,7 @@ SaveSettings(char* name)
       PrintCommPortSettings(f, ad->argName);
     case ArgTwo:
     case ArgNone:
+    case ArgBackupSettingsFile:
     case ArgSettingsFilename: ;
     }
   }