diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index 8b3c103..e77c491 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -295,14 +295,24 @@ bool CDataTree::SetValuePtr( TDataMember * Member, EDataType Type, char * Value } //--------------------------------------------------------------------------- -bool CDataTree::SetValue( TDataMember * Member, EDataType Type, const char * Value, const int Len ) +bool CDataTree::SetValue( TDataMember * Member, EDataType Type, const char * Value, int Len ) { char * NewValue = NULL; if ((Type == jtString) || (Type == jtFloat) || (Type == jtInt) || (Type == jtBool)) { + // Validate + if (!Value) { + return false; + } + + // Check Length + if (Len == -1) { + Len = strlen( Value ); + } + // Create copy of value - NewValue = (char *)malloc( sizeof(Member->Len+1) ); + NewValue = (char *)malloc( sizeof(Len+1) ); if (Value) { memcpy( NewValue, Value, Len ); } else { @@ -313,7 +323,7 @@ bool CDataTree::SetValue( TDataMember * Member, EDataType Type, const char * Va } else { // Set null value - SetValuePtr( Member, Type, NULL, 0 ); + SetValuePtr( Member, Type, NULL, -1 ); } return true; } @@ -327,7 +337,24 @@ bool CDataTree::SetObject( TDataMember * BaseMember, const char * Path ) if (!(Member = GetMember( BaseMember, Path, true ))) { return false; } - SetValue( Member, jtObject, NULL, -1 ); + + // Set as Object + SetValue( Member, jtObject, NULL ); + return true; +} +//--------------------------------------------------------------------------- + +bool CDataTree::SetArray( TDataMember * BaseMember, const char * Path ) +{ + TDataMember * Member; + + // Validate + if (!(Member = GetMember( BaseMember, Path, true ))) { + return false; + } + + // Set as Object + SetValue( Member, jtArray, NULL ); return true; } //--------------------------------------------------------------------------- @@ -340,12 +367,14 @@ bool CDataTree::SetStr( TDataMember * BaseMember, const char * Path, const char if (!(Member = GetMember( BaseMember, Path, true ))) { return false; } + + // Create Value SetValue( Member, jtString, Value, Len ); return true; } //--------------------------------------------------------------------------- -bool CDataTree::SetInt( TDataMember * BaseMember, const char * Path, const long Value ) +bool CDataTree::SetInt( TDataMember * BaseMember, const char * Path, const long Value, const char * Mask ) { TDataMember * Member; char ValueStr[20]; @@ -354,13 +383,15 @@ bool CDataTree::SetInt( TDataMember * BaseMember, const char * Path, const long if (!(Member = GetMember( BaseMember, Path, true ))) { return false; } - sprintf( ValueStr, "%ld", Value ); - SetValue( Member, jtInt, ValueStr, -1 ); + + // Create Value + sprintf( ValueStr, ((Mask)? Mask : "%ld"), Value ); + SetValue( Member, jtInt, ValueStr ); return true; } //--------------------------------------------------------------------------- -bool CDataTree::SetFloat( TDataMember * BaseMember, const char * Path, const double Value ) +bool CDataTree::SetFloat( TDataMember * BaseMember, const char * Path, const double Value, const char * Mask ) { TDataMember * Member; char ValueStr[20]; @@ -369,8 +400,10 @@ bool CDataTree::SetFloat( TDataMember * BaseMember, const char * Path, const do if (!(Member = GetMember( BaseMember, Path, true ))) { return false; } - sprintf( ValueStr, "%lf", Value ); - SetValue( Member, jtFloat, ValueStr, -1 ); + + // Create Value + sprintf( ValueStr, ((Mask)? Mask : "%lf"), Value ); + SetValue( Member, jtFloat, ValueStr ); return true; } //--------------------------------------------------------------------------- @@ -383,7 +416,9 @@ bool CDataTree::SetBool( TDataMember * BaseMember, const char * Path, const boo if (!(Member = GetMember( BaseMember, Path, true ))) { return false; } - SetValue( Member, jtBool, ((Value == 0)? "0" : "1"), -1 ); + + // Create Value + SetValue( Member, jtBool, ((Value == 0)? "0" : "1") ); return true; } //--------------------------------------------------------------------------- @@ -396,7 +431,9 @@ bool CDataTree::SetNull( TDataMember * BaseMember, const char * Path ) if (!(Member = GetMember( BaseMember, Path, true ))) { return false; } - SetValue( Member, jtNull, NULL, -1 ); + + // Create Value + SetValue( Member, jtNull, NULL ); return true; } //--------------------------------------------------------------------------- @@ -422,7 +459,7 @@ const char * CDataTree::GetStr( TDataMember * BaseMember, const char * Path, con return Member->Value; } else if (Member && Create && (Member->Type == jtNull)) { - SetValue( Member, jtString, Default, strlen(Default) ); + SetValue( Member, jtString, Default ); return Default; } else { @@ -441,7 +478,7 @@ const char * CDataTree::GetStr( TDataMember * BaseMember, const char * Path, int return Member->Value; } else if (Member && Create && (Member->Type == jtNull)) { - SetValue( Member, jtString, Default, strlen(Default) ); + SetValue( Member, jtString, Default ); Len = Member->Len; return Default; } @@ -452,7 +489,7 @@ const char * CDataTree::GetStr( TDataMember * BaseMember, const char * Path, int } //--------------------------------------------------------------------------- -const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long Default, bool Create ) +const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long Default, bool Create, const char * Mask ) { TDataMember * Member; @@ -462,8 +499,8 @@ const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long } else if (Member && Create && (Member->Type == jtNull)) { char TempStr[20]; - sprintf( TempStr, "%ld", Default ); - SetValue( Member, jtInt, TempStr, strlen(TempStr) ); + sprintf( TempStr, ((Mask)? Mask : "%ld"), Default ); + SetValue( Member, jtInt, TempStr ); return Default; } else { @@ -472,7 +509,7 @@ const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long } //--------------------------------------------------------------------------- -const double CDataTree::GetFloat( TDataMember * BaseMember, const char * Path, double Default, bool Create ) +const double CDataTree::GetFloat( TDataMember * BaseMember, const char * Path, double Default, bool Create, const char * Mask ) { TDataMember * Member; @@ -482,8 +519,8 @@ const double CDataTree::GetFloat( TDataMember * BaseMember, const char * Path, } else if (Member && Create && (Member->Type == jtNull)) { char TempStr[20]; - sprintf( TempStr, "%lf", Default ); - SetValue( Member, jtInt, TempStr, strlen(TempStr) ); + sprintf( TempStr, ((Mask)? Mask : "%lf"), Default ); + SetValue( Member, jtFloat, TempStr ); return Default; } else { @@ -501,7 +538,7 @@ const bool CDataTree::GetBool( TDataMember * BaseMember, const char * Path, boo return ((!strcasecmp( Member->Value, "0" ))? false : true ); } else if (Member && Create && (Member->Type == jtNull)) { - SetValue( Member, jtInt, ((Default)? "1" : "0"), 1 ); + SetValue( Member, jtBool, ((Default)? "1" : "0") ); return Default; } else { diff --git a/DataTreeCore.h b/DataTreeCore.h index 27a0540..78aa057 100644 --- a/DataTreeCore.h +++ b/DataTreeCore.h @@ -56,7 +56,7 @@ private: TDataMember ** GetMemberPtr( TDataMember * BaseMember, const char * Path, bool Create, TDataMember ** Parent = NULL ); // Set Member value - bool SetValue( TDataMember * Member, EDataType Type, const char * Value, const int Len ); + bool SetValue( TDataMember * Member, EDataType Type, const char * Value = NULL, int Len = -1 ); bool SetValuePtr( TDataMember * Member, EDataType Type, char * Value, int Len ); public: @@ -68,14 +68,15 @@ public: const char * GetStr( TDataMember * BaseMember, const char * Path, const char * Default = NULL, bool Create = false ); const char * GetStr( TDataMember * BaseMember, const char * Path, int &Len, const char * Default = NULL, bool Create = false ); - const long GetInt( TDataMember * BaseMember, const char * Path, long Default = 0, bool Create = false ); - const double GetFloat( TDataMember * BaseMember, const char * Path, double Default = 0.0, bool Create = false ); + const long GetInt( TDataMember * BaseMember, const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL ); + const double GetFloat( TDataMember * BaseMember, const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL ); const bool GetBool( TDataMember * BaseMember, const char * Path, bool Default = false, bool Create = false ); bool SetObject( TDataMember * BaseMember, const char * Path ); + bool SetArray( TDataMember * BaseMember, const char * Path ); bool SetStr( TDataMember * BaseMember, const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values - bool SetInt( TDataMember * BaseMember, const char * Path, const long Value ); - bool SetFloat( TDataMember * BaseMember, const char * Path, const double Value ); + bool SetInt( TDataMember * BaseMember, const char * Path, const long Value, const char * Mask = NULL ); + bool SetFloat( TDataMember * BaseMember, const char * Path, const double Value, const char * Mask = NULL ); bool SetBool( TDataMember * BaseMember, const char * Path, const bool Value ); bool SetNull( TDataMember * BaseMember, const char * Path ); diff --git a/JSONparseCore.cpp b/JSONparseCore.cpp index 3a346ee..19846a4 100644 --- a/JSONparseCore.cpp +++ b/JSONparseCore.cpp @@ -257,7 +257,7 @@ bool CJSONparse::ParseObject( TDataMember * Object ) // Set Type Level++; - DataTree->SetValue( Object, jtObject, NULL, -1 ); + DataTree->SetValue( Object, jtObject ); while (true) { @@ -340,7 +340,7 @@ bool CJSONparse::ParseArray( TDataMember * Array ) // Set Type Level++; - DataTree->SetValue( Array, jtArray, NULL, -1 ); + DataTree->SetValue( Array, jtArray ); while (true) { @@ -438,10 +438,10 @@ bool CJSONparse::ParsePrimitive( TDataMember * Member ) DataTree->SetValuePtr( Member, jtNull, NULL, -1 ); } else if ((Len == 4) && !strncasecmp( Mark, "true", 4 )) { - DataTree->SetValue( Member, jtBool, "1", 1 ); + DataTree->SetValue( Member, jtBool, "1" ); } else if ((Len == 5) && !strncasecmp( Mark, "false", 5 )) { - DataTree->SetValue( Member, jtBool, "0", 1 ); + DataTree->SetValue( Member, jtBool, "0" ); } else { // Try conversion to int