summaryrefslogtreecommitdiff
path: root/app/bin/appdefaults.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/appdefaults.c')
-rw-r--r--app/bin/appdefaults.c362
1 files changed, 181 insertions, 181 deletions
diff --git a/app/bin/appdefaults.c b/app/bin/appdefaults.c
index 55a2201..0e1898d 100644
--- a/app/bin/appdefaults.c
+++ b/app/bin/appdefaults.c
@@ -17,49 +17,39 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <locale.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <string.h>
#include <wchar.h>
-#ifdef WINDOWS
-#include <Windows.h>
-#include <malloc.h>
-#endif
-
#include "common.h"
#include "custom.h"
#include "fileio.h"
#include "paths.h"
-#include "wlib.h"
enum defaultTypes {
- INTEGERCONSTANT,
- FLOATCONSTANT,
- STRINGCONSTANT,
- INTEGERFUNCTION,
- FLOATFUNCTION,
- STRINGFUNCTION
+ INTEGERCONSTANT,
+ FLOATCONSTANT,
+ STRINGCONSTANT,
+ INTEGERFUNCTION,
+ FLOATFUNCTION,
+ STRINGFUNCTION
};
struct appDefault {
- char *defaultKey; /**< the key used to access the value */
- bool wasUsed; /**< value has already been used on this run */
- enum defaultTypes
- valueType; /**< type of default, constant or pointer to a function */
- union {
- int intValue;
- double floatValue;
- char *stringValue;
- int (*intFunction)(struct appDefault *, void *);
- double (*floatFunction)(struct appDefault *, void *);
- char *(*stringFunction)(struct appDefault *, void *);
- } defaultValue;
- void *additionalData;
+ char *defaultKey; /**< the key used to access the value */
+ bool wasUsed; /**< value has already been used on this run */
+ enum defaultTypes
+ valueType; /**< type of default, constant or pointer to a function */
+ union {
+ int intValue;
+ double floatValue;
+ char *stringValue;
+ int (*intFunction)(struct appDefault *, void *);
+ double (*floatFunction)(struct appDefault *, void *);
+ char *(*stringFunction)(struct appDefault *, void *);
+ } defaultValue;
+ void *additionalData;
};
static int GetLocalMeasureSystem(struct appDefault *ptrDefault,
@@ -73,7 +63,7 @@ static double GetLocalRoomSize(struct appDefault *ptrDefault,
static char *GetParamFullPath(struct appDefault *ptrDefault,
void *additionalData);
static char *GetParamPrototype(struct appDefault *ptrDefault,
- void *additionalData);
+ void *additionalData);
/**
* List of application default settings. As this is searched by binary search, the list has to be kept sorted
@@ -83,46 +73,51 @@ static char *GetParamPrototype(struct appDefault *ptrDefault,
struct appDefault xtcDefaults[] = {
{ "DialogItem.cmdopt-preselect", 0, INTEGERCONSTANT,{ .intValue = 1 } }, /**< default command is select */
- { "DialogItem.cmdopt-rightclickmode", 0, INTEGERCONSTANT,{ .intValue = 1 } }, /**< swap default to context */
+ { "DialogItem.cmdopt-rightclickmode", 0, INTEGERCONSTANT,{ .intValue = 1 } }, /**< swap default to context */
{ "DialogItem.cmdopt-selectmode", 0, INTEGERCONSTANT,{ .intValue = 0 } }, /**< 'Only' mode */
{ "DialogItem.cmdopt-selectzero", 0, INTEGERCONSTANT,{ .intValue = 1 } }, /**< 'On' mode */
{ "DialogItem.grid-horzenable", 0, INTEGERCONSTANT, { .intValue = 0 }},
{ "DialogItem.grid-vertenable", 0, INTEGERCONSTANT,{ .intValue = 0 } },
{ "DialogItem.pref-dstfmt", 0, INTEGERFUNCTION,{ .intFunction = GetLocalDistanceFormat } }, /**< number format for distances */
- { "DialogItem.pref-units", 0, INTEGERFUNCTION,{ .intFunction = GetLocalMeasureSystem } }, /**< default unit depends on region */
+ { "DialogItem.pref-units", 0, INTEGERFUNCTION,{ .intFunction = GetLocalMeasureSystem } }, /**< default unit depends on region */
{ "DialogItem.rgbcolor-exception", 0, INTEGERCONSTANT, { .intValue = 15923462 }}, /**< rich yellow as exception color */
{ "Parameter File Map.British stock", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "br.xtp" },
{ "Parameter File Map.European stock", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "eu.xtp" },
- { "Parameter File Map.NMRA RP12-25 Feb 2015 O scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-o.xtp" },
- { "Parameter File Map.NMRA RP12-27 Feb 2015 S Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-s.xtp" },
- { "Parameter File Map.NMRA RP12-31 Feb 2015 HO Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-ho.xtp" },
- { "Parameter File Map.NMRA RP12-33 Feb 2015 TT Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-tt.xtp" },
- { "Parameter File Map.NMRA RP12-35 Feb 2015 N Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-n.xtp" },
- { "Parameter File Map.NMRA RP12-37 Feb 2015 Z scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-z.xtp" },
+ { "Parameter File Map.NMRA RP-12.25 Feb 2015 O scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-o.xtp" },
+ { "Parameter File Map.NMRA RP-12.27 Feb 2015 S Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-s.xtp" },
+ { "Parameter File Map.NMRA RP-12.31 Feb 2015 HO Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-ho.xtp" },
+ { "Parameter File Map.NMRA RP-12.33 Feb 2015 TT Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-tt.xtp" },
+ { "Parameter File Map.NMRA RP-12.35 Feb 2015 N Scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-n.xtp" },
+ { "Parameter File Map.NMRA RP-12.37 Feb 2015 Z scale Turnouts", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "nmra-z.xtp" },
{ "Parameter File Map.North American Prototypes", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "protoam.xtp" },
- { "Parameter File Map.Trees", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath } , "trees.xtp" },
+ { "Parameter File Map.Trees", 0, STRINGFUNCTION,{ .stringFunction = GetParamFullPath }, "trees.xtp" },
{ "Parameter File Names.File1", 0, STRINGFUNCTION,{ .stringFunction = GetParamPrototype }},
{ "Parameter File Names.File2", 0, STRINGCONSTANT,{ .stringValue = "Trees" } },
- { "Parameter File Names.File3", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP12-37 Feb 2015 Z scale Turnouts" } },
- { "Parameter File Names.File4", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP12-35 Feb 2015 N Scale Turnouts" } },
- { "Parameter File Names.File5", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP12-33 Feb 2015 TT Scale Turnouts" } },
- { "Parameter File Names.File6", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP12-31 Feb 2015 HO Scale Turnouts" } },
- { "Parameter File Names.File7", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP12-27 Feb 2015 S Scale Turnouts" } },
- { "Parameter File Names.File8", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP12-25 Feb 2015 O scale Turnouts" } },
- { "draw.roomsizeX", 0, FLOATFUNCTION, {.floatFunction = GetLocalRoomSize }}, /**< layout width */
- { "draw.roomsizeY", 0, FLOATFUNCTION,{ .floatFunction = GetLocalRoomSize } }, /**< layout depth */
- { "misc.scale", 0, STRINGFUNCTION, { .stringFunction = GetLocalPopularScale}}, /**< the (probably) most popular scale for a region */
+ { "Parameter File Names.File3", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP-12.37 Feb 2015 Z scale Turnouts" } },
+ { "Parameter File Names.File4", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP-12.35 Feb 2015 N Scale Turnouts" } },
+ { "Parameter File Names.File5", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP-12.33 Feb 2015 TT Scale Turnouts" } },
+ { "Parameter File Names.File6", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP-12.31 Feb 2015 HO Scale Turnouts" } },
+ { "Parameter File Names.File7", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP-12.27 Feb 2015 S Scale Turnouts" } },
+ { "Parameter File Names.File8", 0, STRINGCONSTANT,{ .stringValue = "NMRA RP-12.25 Feb 2015 O scale Turnouts" } },
+ { "draw.roomsizeX", 0, FLOATFUNCTION, {.floatFunction = GetLocalRoomSize }}, /**< layout width */
+ { "draw.roomsizeY", 0, FLOATFUNCTION,{ .floatFunction = GetLocalRoomSize } }, /**< layout depth */
+ { "misc.scale", 0, STRINGFUNCTION, { .stringFunction = GetLocalPopularScale}}, /**< the (probably) most popular scale for a region */
};
-#define DEFAULTCOUNT (sizeof(xtcDefaults)/sizeof(xtcDefaults[0]))
+#define DEFAULTCOUNT COUNT(xtcDefaults)
static long bFirstRun; /**< TRUE if appl is run the first time */
-static char regionCode[3]; /**< will be initialized to the locale's region code */
+static char
+regionCode[3]; /**< will be initialized to the locale's region code */
-static wBool_t(*GetIntegerPref)(const char *, const char *, long *, long) = wPrefGetIntegerExt; /**< pointer to active integer pref getter */
-static wBool_t(*GetFloatPref)(const char *, const char *, double *, double) = wPrefGetFloatExt; /**< pointer to active float pref getter */
-static char *(*GetStringPref)(const char *, const char *) = wPrefGetStringExt; /**< pointer to active string pref getter */
+static wBool_t(*GetIntegerPref)(const char *, const char *, long *,
+ long) = wPrefGetIntegerExt; /**< pointer to active integer pref getter */
+static wBool_t(*GetFloatPref)(const char *, const char *, double *,
+ double) = wPrefGetFloatExt; /**< pointer to active float pref getter */
+static char *(*GetStringPref)(const char *,
+ const char *) =
+ wPrefGetStringExt; /**< pointer to active string pref getter */
/**
* A recursive binary search function. It returns location of x in
@@ -138,32 +133,32 @@ static char *(*GetStringPref)(const char *, const char *) = wPrefGetStringExt;
static int binarySearch(struct appDefault arr[], int l, int r, char *key)
{
- if (r >= l) {
- int mid = l + (r - l) / 2;
- int res = strcmp(key, arr[mid].defaultKey);
-
- // If the element is present at the middle itself
- if (!res) {
- return mid;
- }
-
- // If the array size is 1
- if (r == 0) {
- return -1;
- }
-
- // If element is smaller than mid, then it can only be present
- // in left subarray
- if (res < 0) {
- return binarySearch(arr, l, mid - 1, key);
- }
-
- // Else the element can only be present in right subarray
- return binarySearch(arr, mid + 1, r, key);
- }
-
- // We reach here when element is not present in array
- return -1;
+ if (r >= l) {
+ int mid = l + (r - l) / 2;
+ int res = strcmp(key, arr[mid].defaultKey);
+
+ // If the element is present at the middle itself
+ if (!res) {
+ return mid;
+ }
+
+ // If the array size is 1
+ if (r == 0) {
+ return -1;
+ }
+
+ // If element is smaller than mid, then it can only be present
+ // in left subarray
+ if (res < 0) {
+ return binarySearch(arr, l, mid - 1, key);
+ }
+
+ // Else the element can only be present in right subarray
+ return binarySearch(arr, mid + 1, r, key);
+ }
+
+ // We reach here when element is not present in array
+ return -1;
}
/**
@@ -178,20 +173,20 @@ struct appDefault *
FindDefault(struct appDefault *defaultValues, const char *section,
const char *name)
{
- char *searchString = malloc(strlen(section) + strlen(name) +
- 2); //includes separator and terminating \0
- int res;
- sprintf(searchString, "%s.%s", section, name);
-
- res = binarySearch(defaultValues, 0, DEFAULTCOUNT-1, searchString);
- free(searchString);
-
- if (res != -1 && defaultValues[res].wasUsed == FALSE) {
- defaultValues[res].wasUsed = TRUE;
- return (defaultValues + res);
- } else {
- return (NULL);
- }
+ char *searchString = malloc(strlen(section) + strlen(name) +
+ 2); //includes separator and terminating \0
+ int res;
+ sprintf(searchString, "%s.%s", section, name);
+
+ res = binarySearch(defaultValues, 0, DEFAULTCOUNT-1, searchString);
+ free(searchString);
+
+ if (res != -1 && defaultValues[res].wasUsed == FALSE) {
+ defaultValues[res].wasUsed = TRUE;
+ return (defaultValues + res);
+ } else {
+ return (NULL);
+ }
}
/**
* Get the application's default region code. On Windows, the system's API is used.
@@ -201,31 +196,32 @@ FindDefault(struct appDefault *defaultValues, const char *section,
static void
InitializeRegionCode(void)
{
- strcpy(regionCode, "US");
+ strcpy(regionCode, "US");
+// TODO Move this to wlib
#ifdef WINDOWS
- {
- LCID lcid;
- char iso3166[10];
-
- lcid = GetThreadLocale();
- GetLocaleInfo(lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof(iso3166));
- strncpy(regionCode, iso3166, 2);
- }
+ {
+ LCID lcid;
+ char iso3166[10];
+
+ lcid = GetThreadLocale();
+ GetLocaleInfo(lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof(iso3166));
+ strncpy(regionCode, iso3166, 2);
+ }
#else
- {
- char *pLang;
- pLang = getenv("LANG");
-
- if (pLang) {
- char *ptr;
- ptr = strpbrk(pLang, "_-");
-
- if (ptr) {
- strncpy(regionCode, ptr + 1, 2);
- }
- }
- }
+ {
+ char *pLang;
+ pLang = getenv("LANG");
+
+ if (pLang) {
+ char *ptr;
+ ptr = strpbrk(pLang, "_-");
+
+ if (ptr) {
+ strncpy(regionCode, ptr + 1, 2);
+ }
+ }
+ }
#endif
}
@@ -235,7 +231,7 @@ InitializeRegionCode(void)
static bool UseMetric()
{
return ( strcmp( regionCode, "US" ) != 0 &&
- strcmp( regionCode, "CA" ) != 0 );
+ strcmp( regionCode, "CA" ) != 0 );
}
/**
* For the US the classical 4x8 sheet is used as default size. in the metric world 1,25x2,0m is used.
@@ -244,15 +240,15 @@ static bool UseMetric()
static double
GetLocalRoomSize(struct appDefault *ptrDefault, void *data)
{
- if (!strcmp(ptrDefault->defaultKey, "draw.roomsizeY")) {
- return (UseMetric() ? 125.0/2.54 : 48);
- }
+ if (!strcmp(ptrDefault->defaultKey, "draw.roomsizeY")) {
+ return (UseMetric() ? 125.0/2.54 : 48);
+ }
- if (!strcmp(ptrDefault->defaultKey, "draw.roomsizeX")) {
- return (UseMetric() ? 200.0 / 2.54 : 96);
- }
+ if (!strcmp(ptrDefault->defaultKey, "draw.roomsizeX")) {
+ return (UseMetric() ? 200.0 / 2.54 : 96);
+ }
- return (0.0); // should never get here
+ return (0.0); // should never get here
}
/**
@@ -262,7 +258,7 @@ GetLocalRoomSize(struct appDefault *ptrDefault, void *data)
static char *
GetLocalPopularScale(struct appDefault *ptrDefault, void *data)
{
- return (strcmp(regionCode, "GB") ? "HO" : "OO");
+ return (strcmp(regionCode, "GB") ? "HO" : "OO");
}
/**
@@ -271,7 +267,7 @@ GetLocalPopularScale(struct appDefault *ptrDefault, void *data)
static int
GetLocalMeasureSystem(struct appDefault *ptrDefault, void *data)
{
- return (UseMetric() ? 1 : 0);
+ return (UseMetric() ? 1 : 0);
}
/**
@@ -280,18 +276,19 @@ GetLocalMeasureSystem(struct appDefault *ptrDefault, void *data)
static int
GetLocalDistanceFormat(struct appDefault *ptrDefault, void *data)
{
- return (UseMetric() ? 8 : 4);
+ return (UseMetric() ? 8 : 4);
}
/**
-* Prototype definitions currently only exist for US and British. So US
-* is assumed to be the default.
+* Prototype definitions currently only exist for US and British. So US
+* is assumed to be the default.
*/
static char*
GetParamPrototype(struct appDefault *ptrDefault, void *additionalData)
{
- return (strcmp(regionCode, "GB") ? "North American Prototypes" : "British stock");
+ return (strcmp(regionCode,
+ "GB") ? "North American Prototypes" : "British stock");
}
/**
@@ -300,9 +297,9 @@ GetParamPrototype(struct appDefault *ptrDefault, void *additionalData)
static char *
GetParamFullPath(struct appDefault *ptrDefault, void *additionalData)
{
- char *str;
- MakeFullpath(&str, libDir, PARAM_SUBDIR, (char*)additionalData, (void *)0);
- return str;
+ char *str;
+ MakeFullpath(&str, libDir, PARAM_SUBDIR, (char*)additionalData, I2VP(0));
+ return str;
}
@@ -311,19 +308,21 @@ GetParamFullPath(struct appDefault *ptrDefault, void *additionalData)
* allows to switch from the extended default version to the basic implementation.
*/
-wBool_t
-wPrefGetInteger(const char *section, const char *name, long *result, long defaultValue)
+wBool_t
+wPrefGetInteger(const char *section, const char *name, long *result,
+ long defaultValue)
{
return GetIntegerPref(section, name, result, defaultValue);
}
wBool_t
-wPrefGetFloat(const char *section, const char *name, double *result, double defaultValue)
+wPrefGetFloat(const char *section, const char *name, double *result,
+ double defaultValue)
{
return GetFloatPref(section, name, result, defaultValue);
}
-char *
+char *
wPrefGetString(const char *section, const char *name)
{
return GetStringPref(section, name);
@@ -343,20 +342,20 @@ wBool_t
wPrefGetIntegerExt(const char *section, const char *name, long *result,
long defaultValue)
{
- struct appDefault *thisDefault;
+ struct appDefault *thisDefault;
- thisDefault = FindDefault(xtcDefaults, section, name);
+ thisDefault = FindDefault(xtcDefaults, section, name);
- if (thisDefault) {
- if (thisDefault->valueType == INTEGERCONSTANT) {
- defaultValue = thisDefault->defaultValue.intValue;
- } else {
- defaultValue = (thisDefault->defaultValue.intFunction)(thisDefault,
- thisDefault->additionalData);
- }
- }
+ if (thisDefault) {
+ if (thisDefault->valueType == INTEGERCONSTANT) {
+ defaultValue = thisDefault->defaultValue.intValue;
+ } else {
+ defaultValue = (thisDefault->defaultValue.intFunction)(thisDefault,
+ thisDefault->additionalData);
+ }
+ }
- return (wPrefGetIntegerBasic(section, name, result, defaultValue));
+ return (wPrefGetIntegerBasic(section, name, result, defaultValue));
}
/**
@@ -374,20 +373,20 @@ wBool_t
wPrefGetFloatExt(const char *section, const char *name, double *result,
double defaultValue)
{
- struct appDefault *thisDefault;
+ struct appDefault *thisDefault;
- thisDefault = FindDefault(xtcDefaults, section, name);
+ thisDefault = FindDefault(xtcDefaults, section, name);
- if (thisDefault) {
- if (thisDefault->valueType == FLOATCONSTANT) {
- defaultValue = thisDefault->defaultValue.floatValue;
- } else {
- defaultValue = (thisDefault->defaultValue.floatFunction)(thisDefault,
- thisDefault->additionalData);
- }
- }
+ if (thisDefault) {
+ if (thisDefault->valueType == FLOATCONSTANT) {
+ defaultValue = thisDefault->defaultValue.floatValue;
+ } else {
+ defaultValue = (thisDefault->defaultValue.floatFunction)(thisDefault,
+ thisDefault->additionalData);
+ }
+ }
- return (wPrefGetFloatBasic(section, name, result, defaultValue));
+ return (wPrefGetFloatBasic(section, name, result, defaultValue));
}
/**
@@ -401,37 +400,38 @@ wPrefGetFloatExt(const char *section, const char *name, double *result,
char *
wPrefGetStringExt(const char *section, const char *name)
{
- struct appDefault *thisDefault;
-
- thisDefault = FindDefault(xtcDefaults, section, name);
-
- if (thisDefault) {
- char *prefString;
- char *defaultValue;
-
- if (thisDefault->valueType == STRINGCONSTANT) {
- defaultValue = thisDefault->defaultValue.stringValue;
- } else {
- defaultValue = (thisDefault->defaultValue.stringFunction)(thisDefault,
- thisDefault->additionalData);
- }
-
- prefString = (char *)wPrefGetStringBasic(section, name);
- return (prefString ? prefString : defaultValue);
- } else {
- return ((char *)wPrefGetStringBasic(section, name));
- }
+ struct appDefault *thisDefault;
+
+ thisDefault = FindDefault(xtcDefaults, section, name);
+
+ if ( thisDefault == NULL ) {
+ // Either we don't have a default value or we've already fetched it
+ return ((char *)wPrefGetStringBasic(section, name));
+ }
+
+ char *prefString;
+ char *defaultValue;
+
+ if (thisDefault->valueType == STRINGCONSTANT) {
+ defaultValue = thisDefault->defaultValue.stringValue;
+ } else {
+ defaultValue = (thisDefault->defaultValue.stringFunction)(thisDefault,
+ thisDefault->additionalData);
+ }
+ // Next call will get value from Prefs
+ wPrefSetString( section, name, defaultValue );
+ return (defaultValue);
}
/**
* Initialize the application default system. The flag firstrun is used to find
* out whether the application was run before. This is accomplished by trying
- * to read it from the configuration file. As it is only written after this
+ * to read it from the configuration file. As it is only written after this
* test, it can never be found on the first run of the application ie. when the
* configuration file does not exist yet.
*/
-void
+void
InitAppDefaults(void)
{
wPrefGetIntegerBasic( "misc", "firstrun", &bFirstRun, TRUE);