X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=args.h;h=3480ac1b61cd42d14b5442c242de708ba4caa6b4;hb=b382d988c6f886f3a49483df9e3e36de0b6b0824;hp=e23b506d98433dd18d62f40f01d4e86ed9ef476c;hpb=4b5cd87c8a4353bc70afffb1971c2132a9a12061;p=xboard.git diff --git a/args.h b/args.h index e23b506..3480ac1 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 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * @@ -49,16 +49,16 @@ * 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, ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window @@ -129,7 +129,7 @@ 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, @@ -185,6 +185,7 @@ 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 }, /* 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 */ @@ -208,6 +209,7 @@ ArgDescriptor argDescriptors[] = { { "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 }, { "remoteShell", ArgFilename, (void *) &appData.remoteShell, FALSE, (ArgIniType) REMOTE_SHELL }, { "rsh", ArgFilename, (void *) &appData.remoteShell, FALSE, INVALID }, { "remoteUser", ArgString, (void *) &appData.remoteUser, FALSE, INVALID }, @@ -216,8 +218,8 @@ ArgDescriptor argDescriptors[] = { { "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, TRUE, 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 }, @@ -237,9 +239,12 @@ 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 }, { "gateway", ArgString, (void *) &appData.gateway, FALSE, (ArgIniType) "" }, { "loadGameFile", ArgFilename, (void *) &appData.loadGameFile, FALSE, (ArgIniType) "" }, { "lgf", ArgFilename, (void *) &appData.loadGameFile, FALSE, INVALID }, @@ -303,7 +308,7 @@ 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 }, @@ -449,6 +454,7 @@ ArgDescriptor argDescriptors[] = { { "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 }, @@ -508,6 +514,7 @@ 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 }, { "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 }, @@ -521,30 +528,39 @@ 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 }, { "sUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID }, + { "secondUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID }, { "firstHasOwnBookUCI", ArgBoolean, (void *) &appData.firstHasOwnBookUCI, FALSE, (ArgIniType) TRUE }, { "fNoOwnBookUCI", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID }, { "firstXBook", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID }, { "secondHasOwnBookUCI", ArgBoolean, (void *) &appData.secondHasOwnBookUCI, FALSE, (ArgIniType) TRUE }, { "sNoOwnBookUCI", ArgFalse, (void *) &appData.secondHasOwnBookUCI, FALSE, INVALID }, { "secondXBook", ArgFalse, (void *) &appData.secondHasOwnBookUCI, FALSE, INVALID }, - { "adapterCommand", ArgFilename, (void *) &appData.adapterCommand, TRUE, (ArgIniType) "polyglot -noini -ec %%cp -ed %%d" }, + { "adapterCommand", ArgFilename, (void *) &appData.adapterCommand, TRUE, (ArgIniType) "polyglot -noini -ec \"%fcp\" -ed \"%fd\"" }, { "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 }, + { "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) "" }, /* [HGM] board-size, adjudication and misc. options */ - { "boardWidth", ArgInt, (void *) &appData.NrFiles, TRUE, (ArgIniType) -1 }, - { "boardHeight", ArgInt, (void *) &appData.NrRanks, TRUE, (ArgIniType) -1 }, - { "holdingsSize", ArgInt, (void *) &appData.holdingsSize, TRUE, (ArgIniType) -1 }, + { "oneClickMove", ArgBoolean, (void *) &appData.oneClick, TRUE, (ArgIniType) FALSE }, + { "boardWidth", ArgInt, (void *) &appData.NrFiles, FALSE, (ArgIniType) -1 }, + { "boardHeight", ArgInt, (void *) &appData.NrRanks, FALSE, (ArgIniType) -1 }, + { "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 }, @@ -554,6 +570,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,13 +585,14 @@ ArgDescriptor argDescriptors[] = { { "autoLogo", ArgBoolean, (void *) &appData.autoLogo, TRUE, INVALID }, { "firstOptions", ArgString, (void *) &appData.firstOptions, FALSE, (ArgIniType) "" }, { "secondOptions", ArgString, (void *) &appData.secondOptions, FALSE, (ArgIniType) "" }, - { "firstNeedsNoncompliantFEN", ArgString, (void *) &appData.fenOverride1, FALSE, (ArgIniType) "" }, - { "secondNeedsNoncompliantFEN", ArgString, (void *) &appData.fenOverride2, FALSE, (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 +#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 }, @@ -617,6 +636,7 @@ 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 }, { "suppressLoadMoves", ArgBoolean, (void *) &appData.suppressLoadMoves, FALSE, (ArgIniType) FALSE }, { "serverPause", ArgInt, (void *) &appData.serverPause, FALSE, (ArgIniType) 15 }, @@ -691,12 +711,24 @@ void ExitArgError(char *msg, char *badArg) { char buf[MSG_SIZ]; + int len; + + len = snprintf(buf,MSG_SIZ, "%s %s", 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); DisplayFatalError(buf, 0, 2); exit(2); } +int +ValidateInt(char *s) +{ + char *p = s; + if(*p == '-' || *p == '+') p++; + while(*p) if(!isdigit(*p++)) ExitArgError("Bad integer value", s); + return atoi(s); +} char StringGet(void *getClosure) @@ -725,13 +757,19 @@ 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"); if (f != NULL) { @@ -790,7 +828,7 @@ ParseArgs(GetFunc get, void *cl) } else { /* Positional argument */ ad = &argDescriptors[posarg++]; - strcpy(argName, ad->argName); + strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0])); } if (ad->argType == ArgTrue) { @@ -817,7 +855,7 @@ ParseArgs(GetFunc get, void *cl) case NULLCHAR: start = NULLCHAR; break; - + case '}': ch = get(cl); start = NULLCHAR; @@ -828,7 +866,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. @@ -917,20 +955,20 @@ ParseArgs(GetFunc get, void *cl) switch (ad->argType) { case ArgInt: - *(int *) ad->argLoc = atoi(argValue); + *(int *) ad->argLoc = ValidateInt(argValue); break; case ArgX: - *(int *) ad->argLoc = atoi(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: - *(int *) ad->argLoc = atoi(argValue) + wpMain.y; // (this is really kludgey, it should be done where used...) + *(int *) ad->argLoc = ValidateInt(argValue) + wpMain.y; // (this is really kludgey, it should be done where used...) break; case ArgZ: - *(int *) ad->argLoc = atoi(argValue); - EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); + *(int *) ad->argLoc = ValidateInt(argValue); + EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); break; case ArgFloat: @@ -979,7 +1017,7 @@ ParseArgs(GetFunc get, void *cl) ParseTextAttribs(cc, argValue); // [HGM] wrapper for platform independency } break; - + case ArgBoardSize: ParseBoardSize(ad->argLoc, argValue); break; @@ -1058,7 +1096,7 @@ ParseIcsTextMenu(char *icsTextMenuString) p = t + 1; } e++; - } + } } void @@ -1122,6 +1160,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; // some complex, platform-dependent stuff that could not be handled from table SetDefaultTextAttribs(); @@ -1149,22 +1188,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 */ @@ -1177,7 +1228,7 @@ InitAppData(char *lpCmdLine) 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 */ @@ -1299,7 +1350,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: @@ -1342,6 +1393,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; @@ -1351,13 +1403,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: ; }