diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c
index 6d10b4222fabb85d94f4d279b85fb01dc00b63f5..743cf45febc06fd5f5b004cb9eb053a198e4e474 100644
--- a/src/xpdev/ini_file.c
+++ b/src/xpdev/ini_file.c
@@ -387,6 +387,15 @@ char* iniSetShortInt(str_list_t* list, const char* section, const char* key, ush
 	return iniSetString(list, section, key, str, style);
 }
 
+char* iniSetLongInt(str_list_t* list, const char* section, const char* key, ulong value
+					,ini_style_t* style)
+{
+	char	str[INI_MAX_VALUE_LEN];
+
+	SAFEPRINTF(str,"%lu",value);
+	return iniSetString(list, section, key, str, style);
+}
+
 char* iniSetHexInt(str_list_t* list, const char* section, const char* key, ulong value
 					,ini_style_t* style)
 {
@@ -424,13 +433,34 @@ char* iniSetBool(str_list_t* list, const char* section, const char* key, BOOL va
 char* iniSetEnum(str_list_t* list, const char* section, const char* key, str_list_t names, unsigned value
 					,ini_style_t* style)
 {
-	char	str[INI_MAX_VALUE_LEN];
-
 	if(value < strListCount(names))
 		return iniSetString(list, section, key, names[value], style);
 
-	SAFEPRINTF(str,"%u",value);
-	return iniSetString(list, section, key, str, style);
+	return iniSetLongInt(list, section, key, value, style);
+}
+
+char* iniSetNamedInt(str_list_t* list, const char* section, const char* key, named_long_t* names
+					 ,long value, ini_style_t* style)
+{
+	size_t	i;
+
+	for(i=0;names[i].name!=NULL;i++)
+		if(names[i].value==value)
+			return iniSetString(list, section, key, names[i].name, style);
+
+	return iniSetInteger(list, section, key, value, style);
+}
+
+char* iniSetNamedFloat(str_list_t* list, const char* section, const char* key, named_double_t* names
+					 ,double value, ini_style_t* style)
+{
+	size_t	i;
+
+	for(i=0;names[i].name!=NULL;i++)
+		if(names[i].value==value)
+			return iniSetString(list, section, key, names[i].name, style);
+
+	return iniSetFloat(list, section, key, value, style);
 }
 
 char* iniSetBitField(str_list_t* list, const char* section, const char* key
@@ -856,6 +886,32 @@ ushort iniGetShortInt(str_list_t list, const char* section, const char* key, ush
 	return((ushort)iniGetInteger(list, section, key, deflt));
 }
 
+ulong iniReadLongInt(FILE* fp, const char* section, const char* key, ulong deflt)
+{
+	char*	value;
+	char	buf[INI_MAX_VALUE_LEN];
+
+	if((value=read_value(fp,section,key,buf))==NULL)
+		return(deflt);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(strtoul(value,NULL,0));
+}
+
+ulong iniGetLongInt(str_list_t list, const char* section, const char* key, ulong deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(list, section, key, value);
+
+	if(*value==0)	/* blank value or missing key */
+		return(deflt);
+
+	return(strtoul(value,NULL,0));
+}
+
 #if !defined(NO_SOCKET_SUPPORT)
 
 static ulong parseIpAddress(const char* value)
@@ -1034,6 +1090,84 @@ unsigned iniGetEnum(str_list_t list, const char* section, const char* key, str_l
 	return(parseEnum(value,names));
 }
 
+static long parseNamedInt(const char* value, named_long_t* names)
+{
+	unsigned i;
+
+	for(i=0;names[i].name!=NULL;i++)
+		if(stricmp(names[i].name,value)==0)
+			return(names[i].value);
+
+	return(strtol(value,NULL,0));
+}
+
+long iniReadNamedInt(FILE* fp, const char* section, const char* key
+					 ,named_long_t* names, long deflt)
+{
+	char	buf[INI_MAX_VALUE_LEN];
+	char*	value;
+
+	if((value=read_value(fp,section,key,buf))==NULL)
+		return(deflt);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(parseNamedInt(value,names));
+}
+
+long iniGetNamedInt(str_list_t list, const char* section, const char* key
+					,named_long_t* names, long deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(list, section, key, value);
+
+	if(*value==0)		/* blank value or missing key */
+		return(deflt);
+
+	return(parseNamedInt(value,names));
+}
+
+static double parseNamedFloat(const char* value, named_double_t* names)
+{
+	unsigned i;
+
+	for(i=0;names[i].name!=NULL;i++)
+		if(stricmp(names[i].name,value)==0)
+			return(names[i].value);
+
+	return(atof(value));
+}
+
+double iniReadNamedFloat(FILE* fp, const char* section, const char* key
+					 ,named_double_t* names, double deflt)
+{
+	char	buf[INI_MAX_VALUE_LEN];
+	char*	value;
+
+	if((value=read_value(fp,section,key,buf))==NULL)
+		return(deflt);
+
+	if(*value==0)		/* blank value */
+		return(deflt);
+
+	return(parseNamedFloat(value,names));
+}
+
+double iniGetNamedFloat(str_list_t list, const char* section, const char* key
+					,named_double_t* names, double deflt)
+{
+	char	value[INI_MAX_VALUE_LEN];
+
+	get_value(list, section, key, value);
+
+	if(*value==0)		/* blank value or missing key */
+		return(deflt);
+
+	return(parseNamedFloat(value,names));
+}
+
 static ulong parseBitField(char* value, ini_bitdesc_t* bitdesc)
 {
 	int		i;
diff --git a/src/xpdev/ini_file.h b/src/xpdev/ini_file.h
index 489726bb318722f6763fa75f9deacae1ed42dc70..e513fd3f9495b4e0181b0ef5ff52ec4c77ab5df5 100644
--- a/src/xpdev/ini_file.h
+++ b/src/xpdev/ini_file.h
@@ -79,6 +79,8 @@ long		iniReadInteger(FILE*, const char* section, const char* key
 					,long deflt);
 ushort		iniReadShortInt(FILE*, const char* section, const char* key
 					,ushort deflt);
+ulong		iniReadLongInt(FILE*, const char* section, const char* key
+					,ulong deflt);
 ulong		iniReadIpAddress(FILE*, const char* section, const char* key
 					,ulong deflt);
 double		iniReadFloat(FILE*, const char* section, const char* key
@@ -87,6 +89,10 @@ BOOL		iniReadBool(FILE*, const char* section, const char* key
 					,BOOL deflt);
 unsigned	iniReadEnum(FILE*, const char* section, const char* key
 					,str_list_t names, unsigned deflt);
+long		iniReadNamedInt(FILE*, const char* section, const char* key
+					,named_long_t*, long deflt);
+double		iniReadNamedFloat(FILE*, const char* section, const char* key
+					,named_double_t*, double deflt);
 ulong		iniReadBitField(FILE*, const char* section, const char* key
 					,ini_bitdesc_t* bitdesc, ulong deflt);
 
@@ -119,6 +125,8 @@ long		iniGetInteger(str_list_t, const char* section, const char* key
 					,long deflt);
 ushort		iniGetShortInt(str_list_t, const char* section, const char* key
 					,ushort deflt);
+ulong		iniGetLongInt(str_list_t, const char* section, const char* key
+					,ulong deflt);
 ulong		iniGetIpAddress(str_list_t, const char* section, const char* key
 					,ulong deflt);
 double		iniGetFloat(str_list_t, const char* section, const char* key
@@ -127,16 +135,21 @@ BOOL		iniGetBool(str_list_t, const char* section, const char* key
 					,BOOL deflt);
 unsigned	iniGetEnum(str_list_t, const char* section, const char* key
 					,str_list_t names, unsigned deflt);
+long		iniGetNamedInt(str_list_t, const char* section, const char* key
+					,named_long_t*, long deflt);
+double		iniGetNamedFloat(str_list_t, const char* section, const char* key
+					,named_double_t*, double deflt);
 ulong		iniGetBitField(str_list_t, const char* section, const char* key
 					,ini_bitdesc_t* bitdesc, ulong deflt);
 
-
 char*		iniSetString(str_list_t*, const char* section, const char* key, const char* value
 					,ini_style_t*);
 char*		iniSetInteger(str_list_t*, const char* section, const char* key, long value
 					,ini_style_t*);
 char*		iniSetShortInt(str_list_t*, const char* section, const char* key, ushort value
 					,ini_style_t*);
+char*		iniSetLongInt(str_list_t*, const char* section, const char* key, ulong value
+					,ini_style_t*);
 char*		iniSetHexInt(str_list_t*, const char* section, const char* key, ulong value
 					,ini_style_t*);
 char*		iniSetFloat(str_list_t*, const char* section, const char* key, double value
@@ -147,6 +160,10 @@ char*		iniSetBool(str_list_t*, const char* section, const char* key, BOOL value
 					,ini_style_t*);
 char*		iniSetEnum(str_list_t*, const char* section, const char* key, str_list_t names
 					,unsigned value, ini_style_t*);
+char*		iniSetNamedInt(str_list_t*, const char* section, const char* key, named_long_t*
+					,long value, ini_style_t*);
+char*		iniSetNamedFloat(str_list_t*, const char* section, const char* key, named_double_t*
+					,double value, ini_style_t*);
 char*		iniSetBitField(str_list_t*, const char* section, const char* key, ini_bitdesc_t*, ulong value
 					,ini_style_t*);
 char*		iniSetStringList(str_list_t*, const char* section, const char* key