X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=args.h;h=660e2710660535ffa7f755169821fbeb1fbe0043;hb=fcc8546ae23f9aed992cd222bb1b9cab6ac642c1;hp=f6e755b54eb48a9c0e80cb253c17bc3a31d9717c;hpb=204df43a817c927d4db73f81cd4b4ce5075def6b;p=xboard.git diff --git a/args.h b/args.h index f6e755b..660e271 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, 2012, 2013 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 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, ArgTwo, + ArgSettingsFilename, ArgBackupSettingsFile, ArgTwo, ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window } ArgType; @@ -490,6 +490,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 }, @@ -906,7 +907,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 && @@ -918,8 +919,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 == '@') { @@ -1102,9 +1105,17 @@ ParseArgs(GetFunc get, void *cl) case ArgString: case ArgFilename: + 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)) { @@ -1537,6 +1548,7 @@ SaveSettings(char* name) PrintCommPortSettings(f, ad->argName); case ArgTwo: case ArgNone: + case ArgBackupSettingsFile: case ArgSettingsFilename: ; } }