From 23db2539d949d076d68867a42fc59190f0c9868d Mon Sep 17 00:00:00 2001 From: Charl Wentzel Date: Thu, 6 Apr 2017 05:35:30 +0200 Subject: [PATCH] Important Update: - Bug fix: Create wrong member name because not zero terminated - Bug fix: Only create array element if brackets empty --- DataTreeCore.cpp | 19 ++++++++++++------- DataTreeCore.h | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index 6b95668..55e51de 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -33,16 +33,20 @@ CDataTree::~CDataTree() } //--------------------------------------------------------------------------- -TDataMember * CDataTree::CreateMember( const char * Name ) +TDataMember * CDataTree::CreateMember( const char * Name, const int Len ) { TDataMember * Member; + // Create data structure Member = (TDataMember *)calloc( 1, sizeof(TDataMember) ); - if (Name && *Name) + + // Set name + if (Name) { - Member->Len = strlen( Name ); - Member->Name = (char *)malloc( Member->Len+1 ); - strcpy( Member->Name, Name ); + Member->NameLen = (Len == -1)? strlen( Name ) : Len ; + Member->Name = (char *)malloc( Member->NameLen+1 ); + memcpy( Member->Name, Name, Member->NameLen ); + Member->Name[ Member->NameLen ] = 0; } return Member; } @@ -178,6 +182,7 @@ TDataMember ** CDataTree::GetMemberPtr( TDataMember * BaseMember, const char * // Empty bracket only allowed for create if (!Create) break; + Index = -1; // find end of list Child = &(Member->FirstChild); @@ -201,7 +206,7 @@ TDataMember ** CDataTree::GetMemberPtr( TDataMember * BaseMember, const char * // Create element if needed if (!*Child && Create) { - if (!Index || (Index = Count + 1)) { + if ((Index == -1) || (Index = Count + 1)) { *Child = CreateMember( NULL ); Member->Len++; } @@ -241,7 +246,7 @@ TDataMember ** CDataTree::GetMemberPtr( TDataMember * BaseMember, const char * Child = &((*Child)->Next); } if (!*Child && Create) { - *Child = CreateMember( Key ); + *Child = CreateMember( Key, KeyLen ); Member->Len++; } } diff --git a/DataTreeCore.h b/DataTreeCore.h index 52309c4..7c24c88 100644 --- a/DataTreeCore.h +++ b/DataTreeCore.h @@ -48,7 +48,7 @@ private: TDataMember * RootMember; // Manage Members - TDataMember * CreateMember( const char * Name ); + TDataMember * CreateMember( const char * Name, const int Len = -1 ); bool AddMember( TDataMember * Parent, TDataMember * Member ); bool DestroyMember( TDataMember ** Member ); bool DestroyValue( TDataMember * Member );