.Core: Config->Ini

git-svn-id: svn://ultimatepp.org/upp/trunk@5097 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2012-07-03 07:31:40 +00:00
parent ddeff70705
commit 75f3740645
3 changed files with 49 additions and 44 deletions

View file

@ -169,7 +169,7 @@ struct DebugLogBlock
struct IniBool;
namespace Config {
namespace Ini {
extern IniBool user_log;
};

View file

@ -424,30 +424,32 @@ String GetIniKey(const char *id)
return GetIniKey(id, String());
}
IniString::operator String()
namespace Ini {
String::operator Upp::String()
{
ONCELOCK_(loaded) {
static Array<String> ss;
String& x = ss.Add();
static Array<UPP::String> ss;
UPP::String& x = ss.Add();
x = Nvl(TrimBoth(GetIniKey(id)), (*def)());
value = &x;
}
return *value;
}
String IniString::operator=(const String& s)
Upp::String String::operator=(const UPP::String& s)
{
operator String();
operator UPP::String();
*value = s;
return s;
}
String IniString::ToString() const
UPP::String String::ToString() const
{
return AsString((String)const_cast<IniString&>(*this));
return AsString((String)const_cast<Ini::String&>(*this));
}
IniInt::operator int() {
Int::operator int() {
ONCELOCK_(loaded) {
value = ScanInt(TrimBoth(ToLower(GetIniKey(id))));
if(IsNull(value))
@ -456,34 +458,36 @@ IniInt::operator int() {
return value;
}
int IniInt::operator=(int b) {
int Int::operator=(int b) {
ONCELOCK_(loaded) {}
return value = b;
}
String IniInt::ToString() const
UPP::String Int::ToString() const
{
return AsString((int)const_cast<IniInt&>(*this));
return AsString((int)const_cast<Ini::Int&>(*this));
}
IniBool::operator bool() {
Bool::operator bool() {
ONCELOCK_(loaded) {
String h = TrimBoth(ToLower(GetIniKey(id)));
UPP::String h = TrimBoth(ToLower(GetIniKey(id)));
value = h.GetCount() ? h == "1" || h == "yes" || h == "true" || h == "y" : (*def)();
}
return value;
}
bool IniBool::operator=(bool b) {
bool Bool::operator=(bool b) {
ONCELOCK_(loaded) {}
return value = b;
}
String IniBool::ToString() const
UPP::String Bool::ToString() const
{
return AsString((bool)const_cast<IniBool&>(*this));
return AsString((bool)const_cast<Ini::Bool&>(*this));
}
};
Array<IniInfo>& sIniInfo()
{
static Array<IniInfo> s;

View file

@ -28,42 +28,43 @@ void SetIniFile(const char *path = NULL);
String GetIniKey(const char *id, const String& def);
String GetIniKey(const char *id);
struct IniString {
namespace Ini {
struct String {
// "private":
const char *id;
String (*def)();
bool loaded;
String *value;
const char *id;
UPP::String (*def)();
bool loaded;
UPP::String *value;
operator String();
String operator=(const String& s);
String ToString() const;
operator UPP::String();
UPP::String operator=(const UPP::String& s);
UPP::String ToString() const;
};
struct IniInt {
struct Int {
// "private":
const char *id;
int (*def)();
int loaded;
int value;
operator int();
int operator=(int b);
String ToString() const;
operator int();
int operator=(int b);
UPP::String ToString() const;
};
struct IniBool {
struct Bool {
// "private":
const char *id;
bool (*def)();
bool loaded;
bool value;
operator bool();
bool operator=(bool b);
String ToString() const;
operator bool();
bool operator=(bool b);
UPP::String ToString() const;
};
}
void AddIniInfo(const char *id, String (*current)(), String (*def)(), const char *info);
@ -79,23 +80,23 @@ String GetIniInfoFormatted();
#define INI_BOOL(var, def, info)\
bool DefIni_##var() { return def; }\
IniBool var = { #var, DefIni_##var };\
String AsStringIniCurrent_##var() { return AsString(var); } \
String AsStringIniDefault_##var() { return AsString(DefIni_##var()); } \
Ini::Bool var = { #var, DefIni_##var };\
UPP::String AsStringIniCurrent_##var() { return AsString(var); } \
UPP::String AsStringIniDefault_##var() { return AsString(DefIni_##var()); } \
INITBLOCK { AddIniInfo(#var, AsStringIniCurrent_##var, AsStringIniDefault_##var, info); }
#define INI_STRING(var, def, info)\
String DefIni_##var() { return def; }\
IniString var = { #var, DefIni_##var };\
String AsStringIniCurrent_##var() { return AsString(var); } \
String AsStringIniDefault_##var() { return AsString(DefIni_##var()); } \
UPP::String DefIni_##var() { return def; }\
Ini::String var = { #var, DefIni_##var };\
UPP::String AsStringIniCurrent_##var() { return AsString(var); } \
UPP::String AsStringIniDefault_##var() { return AsString(DefIni_##var()); } \
INITBLOCK { AddIniInfo(#var, AsStringIniCurrent_##var, AsStringIniDefault_##var, info); }
#define INI_INT(var, def, info)\
int DefIni_##var() { return def; }\
IniInt var = { #var, DefIni_##var };\
String AsStringIniCurrent_##var() { return AsString(var); } \
String AsStringIniDefault_##var() { return AsString(DefIni_##var()); } \
Ini::Int var = { #var, DefIni_##var };\
UPP::String AsStringIniCurrent_##var() { return AsString(var); } \
UPP::String AsStringIniDefault_##var() { return AsString(DefIni_##var()); } \
INITBLOCK { AddIniInfo(#var, AsStringIniCurrent_##var, AsStringIniDefault_##var, info); }
VectorMap<String, String> LoadIniStream(Stream &in);