Minor Update:

- Pass printf Mask for Int/Float values on Get/Set methods
  - On GetValue use mask for default value
- Add SetArray() method
- Bug fix: Incorrect malloc size in SetValue()
- Bug fix: Len not calculated if -1 passed to SetValue()
- Set default value for Len = -1 on SetValue() methods
- Don't pass Len to SetValue() unless required
This commit is contained in:
Charl Wentzel
2017-03-27 04:29:11 +02:00
parent a22f60b152
commit 5691b22df9
3 changed files with 68 additions and 30 deletions

View File

@@ -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 {