Major Update:
- Bug fix: BufferCore - set correct auto buffer size
- Change Get/Set methods to use BaseReference and full path instead of
ParentPath and MemberName
- Add Create param to all Get methods (create if not found)
- Implement arrays & parsing of arrays
- Set CJSONparse as friend class to DataTree (access protected methods)
- Print JSON to screen
This commit is contained in:
498
DataTreeCore.cpp
498
DataTreeCore.cpp
@@ -20,8 +20,8 @@
|
||||
CDataTree::CDataTree()
|
||||
{
|
||||
// Create Root member of tree
|
||||
RootObject = CreateMember( NULL );
|
||||
RootObject->Type = jtObject;
|
||||
RootMember = CreateMember( NULL );
|
||||
RootMember->Type = jtObject;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -29,7 +29,7 @@ CDataTree::~CDataTree()
|
||||
{
|
||||
// Destroy Members
|
||||
DeleteAll();
|
||||
DestroyMember( &RootObject );
|
||||
DestroyMember( &RootMember );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -47,6 +47,28 @@ TDataMember * CDataTree::CreateMember( const char * Name )
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::AddMember( TDataMember * Parent, TDataMember * Member )
|
||||
{
|
||||
TDataMember ** Child;
|
||||
|
||||
// Validate
|
||||
if (!Parent || !Member) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get end of list
|
||||
Child = &(Parent->FirstChild);
|
||||
while (*Child) {
|
||||
Child = &((*Child)->Next);
|
||||
}
|
||||
|
||||
// Add member
|
||||
*Child = Member;
|
||||
Parent->Len++;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::DestroyMember( TDataMember ** Member )
|
||||
{
|
||||
TDataMember * NextMember;
|
||||
@@ -76,101 +98,168 @@ bool CDataTree::DestroyMember( TDataMember ** Member )
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::GetParent( const char * ParentPath, TDataMember **Parent )
|
||||
bool CDataTree::DestroyValue( TDataMember * Member )
|
||||
{
|
||||
TDataMember * Member;
|
||||
char * ParentName;
|
||||
char * Pos;
|
||||
|
||||
// Validate
|
||||
if (!Parent) {
|
||||
// Valdate
|
||||
if (!Member)
|
||||
return false;
|
||||
|
||||
// Destroy values
|
||||
if (Member->Value) {
|
||||
free( Member->Value );
|
||||
Member->Value = NULL;
|
||||
}
|
||||
|
||||
// Set first Parent
|
||||
*Parent = RootObject;
|
||||
|
||||
// Check if path provided
|
||||
if (!ParentPath || !*ParentPath) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Split path
|
||||
Pos = (char*)ParentPath;
|
||||
while (*Pos)
|
||||
{
|
||||
// Set Name start
|
||||
ParentName = Pos;
|
||||
|
||||
// Find delimeter
|
||||
while (*Pos && (*Pos != '/')) {
|
||||
Pos++;
|
||||
}
|
||||
|
||||
// Zero terminate name
|
||||
if (*Pos) {
|
||||
*Pos = 0;
|
||||
Pos++;
|
||||
}
|
||||
|
||||
// Find next parent
|
||||
Member = (*Parent)->FirstChild;
|
||||
while (Member && strcasecmp( Member->Name, ParentName )) {
|
||||
Member = Member->Next;
|
||||
}
|
||||
if (!Member) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set Next parent
|
||||
*Parent = Member;
|
||||
while (Member->FirstChild) {
|
||||
DestroyMember( &(Member->FirstChild) );
|
||||
}
|
||||
Member->Len = 0;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
TDataMember * CDataTree::GetMember( TDataMember * Parent, const char * Name )
|
||||
TDataMember ** CDataTree::GetMemberPtr( TDataMember * BaseMember, const char * Path, bool Create, TDataMember ** Parent )
|
||||
{
|
||||
char * WorkPath = NULL;
|
||||
TDataMember * Member;
|
||||
TDataMember ** Child = NULL;
|
||||
char * Pos;
|
||||
char * EndPos;
|
||||
char * MemberName;
|
||||
int Index;
|
||||
int Count;
|
||||
bool Last = false;
|
||||
|
||||
// Validate
|
||||
if (!Parent || !Name || !*Name) {
|
||||
if (!Path || !*Path) {
|
||||
if (Parent) *Parent = NULL;
|
||||
return NULL;
|
||||
}
|
||||
WorkPath = (char*)malloc( strlen(Path)+1 );
|
||||
strcpy( WorkPath, Path );
|
||||
|
||||
// Get Member
|
||||
Member = Parent->FirstChild;
|
||||
while (Member && strcasecmp( Member->Name, Name ))
|
||||
Member = Member->Next;
|
||||
return Member;
|
||||
// Set init references
|
||||
if (Parent) *Parent = NULL;
|
||||
Child = NULL;
|
||||
Member = (BaseMember)? BaseMember : RootMember;
|
||||
|
||||
// Split path
|
||||
Pos = (char*)WorkPath;
|
||||
while (Member && *Pos)
|
||||
{
|
||||
// Reset Child reference
|
||||
Child = NULL;
|
||||
|
||||
// Set Name start
|
||||
MemberName = Pos;
|
||||
|
||||
// Find delimiter
|
||||
if (*Pos == '[')
|
||||
{
|
||||
// Validate
|
||||
if (Create && (Member->Type == jtNull)) {
|
||||
Member->Type = jtArray; // Convert to array
|
||||
}
|
||||
if (Member->Type != jtArray) {
|
||||
break; // Can't convert something else to an array
|
||||
}
|
||||
|
||||
// Get Index value
|
||||
Pos++;
|
||||
while (*Pos && (*Pos != ']')) {
|
||||
Pos++;
|
||||
}
|
||||
if (*Pos != ']') {
|
||||
break;
|
||||
}
|
||||
Index = (int)strtoul( Pos, &EndPos, 10 );
|
||||
if (EndPos != Pos) {
|
||||
break;
|
||||
}
|
||||
Pos++;
|
||||
if (!*Pos) {
|
||||
// Last element
|
||||
Last = true;
|
||||
}
|
||||
|
||||
// Find next parent
|
||||
Child = &(Member->FirstChild);
|
||||
Count = 0;
|
||||
while (*Child && (Count < Index)) {
|
||||
Child = &((*Child)->Next);
|
||||
Count++;
|
||||
}
|
||||
if (!*Child && Create) {
|
||||
if (!Index || (Index = Count + 1)) {
|
||||
*Child = CreateMember( NULL );
|
||||
Member->Value++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Validate
|
||||
if (Create && (Member->Type == jtNull)) {
|
||||
Member->Type = jtObject; // Convert to object
|
||||
}
|
||||
if (Member->Type != jtObject) {
|
||||
break; // Can't convert something else to an object
|
||||
}
|
||||
|
||||
// Get key value
|
||||
while (*Pos && (*Pos != '/') && (*Pos != '[')) {
|
||||
Pos++;
|
||||
}
|
||||
if (!*Pos) {
|
||||
// Last element
|
||||
Last = true;
|
||||
}
|
||||
else {
|
||||
// Zero terminate name
|
||||
*Pos = 0;
|
||||
Pos++;
|
||||
}
|
||||
|
||||
// Find next parent
|
||||
Child = &(Member->FirstChild);
|
||||
while (*Child && strcasecmp( (*Child)->Name, MemberName )) {
|
||||
Child = &((*Child)->Next);
|
||||
}
|
||||
if (!*Child && Create) {
|
||||
*Child = CreateMember( MemberName );
|
||||
Member->Len++;
|
||||
}
|
||||
}
|
||||
|
||||
// Set Parent
|
||||
if (Last && Parent) {
|
||||
*Parent = Member;
|
||||
}
|
||||
|
||||
// Next level
|
||||
Member = *Child;
|
||||
}
|
||||
|
||||
return Child;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
TDataMember ** CDataTree::GetMemberPtr( TDataMember * Parent, const char * Name )
|
||||
TDataMember * CDataTree::GetMember( TDataMember * BaseMember, const char * Path, bool Create )
|
||||
{
|
||||
TDataMember ** Member;
|
||||
|
||||
// Validate
|
||||
if (!Parent || !Name || !*Name) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Get Member
|
||||
Member = &(Parent->FirstChild);
|
||||
while (Member && strcasecmp( (*Member)->Name, Name ))
|
||||
Member = &((*Member)->Next);
|
||||
return Member;
|
||||
// Get Child
|
||||
Member = GetMemberPtr( BaseMember, Path, Create );
|
||||
return *Member;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::Delete( const char * ParentPath, const char * Name )
|
||||
bool CDataTree::Delete( TDataMember * BaseMember, const char * Path )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
|
||||
// Check if exists
|
||||
if (!GetParent( ParentPath, &Parent ) ||
|
||||
!(Member = GetMemberPtr( Parent, Name ))) {
|
||||
if (!(Member = GetMemberPtr( BaseMember, Path, false, &Parent ))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -183,224 +272,179 @@ bool CDataTree::Delete( const char * ParentPath, const char * Name )
|
||||
|
||||
bool CDataTree::DeleteAll()
|
||||
{
|
||||
while (RootObject->FirstChild) {
|
||||
DestroyMember( &(RootObject->FirstChild) );
|
||||
// Delete all except root member
|
||||
while (RootMember->FirstChild) {
|
||||
DestroyMember( &(RootMember->FirstChild) );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetMember( TDataMember * Member, EDataType Type, const char * Value, const int Len )
|
||||
bool CDataTree::SetValuePtr( TDataMember * Member, EDataType Type, char * Value, int Len )
|
||||
{
|
||||
// Clear previous value
|
||||
if (Member->Value != NULL) {
|
||||
free( Member->Value );
|
||||
DestroyValue( Member );
|
||||
}
|
||||
|
||||
// Set type
|
||||
Member->Type = Type;
|
||||
|
||||
// Set new value
|
||||
switch (Type) {
|
||||
case jtNull:
|
||||
case jtObject:
|
||||
case jtArray:
|
||||
Member->Len = 0;
|
||||
Member->Value = NULL;
|
||||
break;
|
||||
|
||||
case jtString:
|
||||
case jtFloat:
|
||||
case jtInt:
|
||||
case jtBool:
|
||||
Member->Len = (Len == -1)? strlen(Value) : Len;
|
||||
Member->Value = (char *)malloc( sizeof(Member->Len+1) );
|
||||
if (Value) {
|
||||
memcpy( Member->Value, Value, Member->Len+1 );
|
||||
} else {
|
||||
memset( Member->Value, 0, Member->Len+1 );
|
||||
}
|
||||
Member->Value[Member->Len] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
Member->Type = Type;
|
||||
Member->Value = Value;
|
||||
Member->Len = Len;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetObject( const char * ParentPath, const char * Name )
|
||||
bool CDataTree::SetValue( TDataMember * Member, EDataType Type, const char * Value, const int Len )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
char * NewValue = NULL;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return false;
|
||||
if ((Type == jtString) || (Type == jtFloat) || (Type == jtInt) || (Type == jtBool))
|
||||
{
|
||||
// Create copy of value
|
||||
NewValue = (char *)malloc( sizeof(Member->Len+1) );
|
||||
if (Value) {
|
||||
memcpy( NewValue, Value, Len );
|
||||
} else {
|
||||
memset( NewValue, 0, Len );
|
||||
}
|
||||
NewValue[Len] = 0;
|
||||
SetValuePtr( Member, Type, NewValue, Len );
|
||||
}
|
||||
|
||||
// Create new param if it doesn't exist
|
||||
if (!(Member = GetMemberPtr( Parent, Name ))) {
|
||||
*Member = CreateMember( Name );
|
||||
else {
|
||||
// Set null value
|
||||
SetValuePtr( Member, Type, NULL, 0 );
|
||||
}
|
||||
SetMember( *Member, jtObject, NULL, -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetStr( const char * ParentPath, const char * Name, const char * Value, const int Len )
|
||||
bool CDataTree::SetObject( TDataMember * BaseMember, const char * Path )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
if (!(Member = GetMember( BaseMember, Path, true ))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create new param if it doesn't exist
|
||||
if (!(Member = GetMemberPtr( Parent, Name ))) {
|
||||
*Member = CreateMember( Name );
|
||||
}
|
||||
SetMember( *Member, jtString, Value, Len );
|
||||
SetValue( Member, jtObject, NULL, -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetInt( const char * ParentPath, const char * Name, const long Value )
|
||||
bool CDataTree::SetStr( TDataMember * BaseMember, const char * Path, const char * Value, const int Len )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
char ValueStr[50];
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
if (!(Member = GetMember( BaseMember, Path, true ))) {
|
||||
return false;
|
||||
}
|
||||
SetValue( Member, jtString, Value, Len );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Create new param if it doesn't exist
|
||||
if (!(Member = GetMemberPtr( Parent, Name ))) {
|
||||
*Member = CreateMember( Name );
|
||||
bool CDataTree::SetInt( TDataMember * BaseMember, const char * Path, const long Value )
|
||||
{
|
||||
TDataMember * Member;
|
||||
char ValueStr[20];
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetMember( BaseMember, Path, true ))) {
|
||||
return false;
|
||||
}
|
||||
sprintf( ValueStr, "%ld", Value );
|
||||
SetMember( *Member, jtInt, ValueStr, -1 );
|
||||
SetValue( Member, jtInt, ValueStr, -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetFloat( const char * ParentPath, const char * Name, const double Value )
|
||||
bool CDataTree::SetFloat( TDataMember * BaseMember, const char * Path, const double Value )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
char ValueStr[50];
|
||||
TDataMember * Member;
|
||||
char ValueStr[20];
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
if (!(Member = GetMember( BaseMember, Path, true ))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create new param if it doesn't exist
|
||||
if (!*(Member = GetMemberPtr( Parent, Name ))) {
|
||||
*Member = CreateMember( Name );
|
||||
}
|
||||
sprintf( ValueStr, "%lf", Value );
|
||||
SetMember( *Member, jtFloat, ValueStr, -1 );
|
||||
SetValue( Member, jtFloat, ValueStr, -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetBool( const char * ParentPath, const char * Name, const bool Value )
|
||||
bool CDataTree::SetBool( TDataMember * BaseMember, const char * Path, const bool Value )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create new param if it doesn't exist
|
||||
if (!*(Member = GetMemberPtr( Parent, Name ))) {
|
||||
*Member = CreateMember( Name );
|
||||
}
|
||||
SetMember( *Member, jtBool, ((Value == 0)? "0" : "1"), -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataTree::SetNull( const char * ParentPath, const char * Name )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember ** Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create new param if it doesn't exist
|
||||
if (!*(Member = GetMemberPtr( Parent, Name ))) {
|
||||
*Member = CreateMember( Name );
|
||||
}
|
||||
SetMember( *Member, jtNull, NULL, -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const EDataType CDataTree::GetType( const char * ParentPath, const char * Name )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return jtNull;
|
||||
}
|
||||
|
||||
// Return type
|
||||
if ((Member = GetMember( Parent, Name ))) {
|
||||
return Member->Type;
|
||||
}
|
||||
else {
|
||||
return jtNull;
|
||||
if (!(Member = GetMember( BaseMember, Path, true ))) {
|
||||
return false;
|
||||
}
|
||||
SetValue( Member, jtBool, ((Value == 0)? "0" : "1"), -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const char * CDataTree::GetStr( const char * ParentPath, const char * Name, const char * Default )
|
||||
bool CDataTree::SetNull( TDataMember * BaseMember, const char * Path )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return Default;
|
||||
if (!(Member = GetMember( BaseMember, Path, true ))) {
|
||||
return false;
|
||||
}
|
||||
SetValue( Member, jtNull, NULL, -1 );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Return value
|
||||
if ((Member = GetMember( Parent, Name )) && (Member->Type == jtString)) {
|
||||
EDataType CDataTree::GetType( TDataMember * BaseMember, const char * Path )
|
||||
{
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetMember( BaseMember, Path, false ))) {
|
||||
return jtNull;
|
||||
}
|
||||
return Member->Type;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const char * CDataTree::GetStr( TDataMember * BaseMember, const char * Path, const char * Default, bool Create )
|
||||
{
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if ((Member = GetMember( BaseMember, Path, Create )) && (Member->Type == jtString)) {
|
||||
return Member->Value;
|
||||
}
|
||||
else if (Member && Create && (Member->Type == jtNull)) {
|
||||
SetValue( Member, jtString, Default, strlen(Default) );
|
||||
return Default;
|
||||
}
|
||||
else {
|
||||
return Default;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const char * CDataTree::GetStr( const char * ParentPath, const char * Name, int &Len, const char * Default )
|
||||
const char * CDataTree::GetStr( TDataMember * BaseMember, const char * Path, int &Len, const char * Default, bool Create )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return Default;
|
||||
}
|
||||
|
||||
// Return value
|
||||
if ((Member = GetMember( Parent, Name )) && (Member->Type == jtString)) {
|
||||
if ((Member = GetMember( BaseMember, Path, Create )) && (Member->Type == jtString)) {
|
||||
Len = Member->Len;
|
||||
return Member->Value;
|
||||
}
|
||||
else if (Member && Create && (Member->Type == jtNull)) {
|
||||
SetValue( Member, jtString, Default, strlen(Default) );
|
||||
Len = Member->Len;
|
||||
return Default;
|
||||
}
|
||||
else {
|
||||
Len = strlen( Default );
|
||||
return Default;
|
||||
@@ -408,60 +452,58 @@ const char * CDataTree::GetStr( const char * ParentPath, const char * Name, int
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const long CDataTree::GetInt( const char * ParentPath, const char * Name, long Default )
|
||||
const long CDataTree::GetInt( TDataMember * BaseMember, const char * Path, long Default, bool Create )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return Default;
|
||||
}
|
||||
|
||||
// Return value
|
||||
if ((Member = GetMember( Parent, Name )) && (Member->Type == jtInt)) {
|
||||
if ((Member = GetMember( BaseMember, Path, Create )) && (Member->Type == jtInt)) {
|
||||
return strtol( Member->Value, NULL, 10 );
|
||||
}
|
||||
else if (Member && Create && (Member->Type == jtNull)) {
|
||||
char TempStr[20];
|
||||
sprintf( TempStr, "%ld", Default );
|
||||
SetValue( Member, jtInt, TempStr, strlen(TempStr) );
|
||||
return Default;
|
||||
}
|
||||
else {
|
||||
return Default;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const double CDataTree::GetFloat( const char * ParentPath, const char * Name, double Default )
|
||||
const double CDataTree::GetFloat( TDataMember * BaseMember, const char * Path, double Default, bool Create )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return Default;
|
||||
}
|
||||
|
||||
// Return value
|
||||
if ((Member = GetMember( Parent, Name )) && (Member->Type == jtFloat)) {
|
||||
if ((Member = GetMember( BaseMember, Path, Create )) && (Member->Type == jtFloat)) {
|
||||
return strtod( Member->Value, NULL );
|
||||
}
|
||||
else if (Member && Create && (Member->Type == jtNull)) {
|
||||
char TempStr[20];
|
||||
sprintf( TempStr, "%lf", Default );
|
||||
SetValue( Member, jtInt, TempStr, strlen(TempStr) );
|
||||
return Default;
|
||||
}
|
||||
else {
|
||||
return Default;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const bool CDataTree::GetBool( const char * ParentPath, const char * Name, bool Default )
|
||||
const bool CDataTree::GetBool( TDataMember * BaseMember, const char * Path, bool Default, bool Create )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
TDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!Name || !*Name || !GetParent( ParentPath, &Parent )) {
|
||||
return Default;
|
||||
}
|
||||
|
||||
// Return value
|
||||
if ((Member = GetMember( Parent, Name )) && (Member->Type == jtBool)) {
|
||||
if ((Member = GetMember( BaseMember, Path, Create )) && (Member->Type == jtBool)) {
|
||||
return ((!strcasecmp( Member->Value, "0" ))? false : true );
|
||||
}
|
||||
else if (Member && Create && (Member->Type == jtNull)) {
|
||||
SetValue( Member, jtInt, ((Default)? "1" : "0"), 1 );
|
||||
return Default;
|
||||
}
|
||||
else {
|
||||
return Default;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user