Major Update:

- DataTreeCore:
  - Merge TDataMember and CDataTree into => CDataMember
  - Each node, incl root is now CDataMember object
  - Modified function to not require BaseMember (Object is basemember)
  - Split/duplicat most functions to require, or not require child path
  - Added isNull/Object/Array/Sting() etc methods
  - Many other methods removed or restructured
- Updated DataTree usage in: JSONparseCore,
  ApplicationCore, FunctionCore, SelectableCore, WatchdogCore
This commit is contained in:
Charl Wentzel
2018-11-17 19:10:59 +02:00
parent d36bf3230b
commit f2a1ca950a
10 changed files with 472 additions and 488 deletions

View File

@@ -15,7 +15,7 @@
//---------------------------------------------------------------------------
CJSONparse::CJSONparse( CDataTree * pDataTree )
CJSONparse::CJSONparse( CDataMember * pDataTree )
{
// Object tree
DataTree = pDataTree;
@@ -120,7 +120,7 @@ bool CJSONparse::WriteToFile( const char * BasePath, const char * FilePath, cons
bool CJSONparse::WriteToHandle( const char * BasePath, const int Handle, const int Indent )
{
TDataMember * BaseMember;
CDataMember * Member;
// Validate
if (!DataTree) {
@@ -136,17 +136,14 @@ bool CJSONparse::WriteToHandle( const char * BasePath, const int Handle, const i
OutputHandle = Handle;
// Get Root object
if (!BasePath || !*BasePath) {
BaseMember = DataTree->GetRootMember();
}
else if (!(BaseMember = DataTree->GetMember( NULL, BasePath ))) {
if (!(Member = DataTree->GetMember( BasePath ))) {
Error = true;
sprintf( ErrorText, "Invalid root object path" );
return false;
}
// Print to file
PrintObject( BaseMember, Indent );
PrintObject( Member, Indent );
write( OutputHandle, "\n", 1 );
OutputHandle = -1;
@@ -279,7 +276,7 @@ bool CJSONparse::ReadFromString( const char * BasePath, const char * InString, c
bool CJSONparse::ReadFromBuffer( const char * BasePath )
{
TDataMember * BaseMember = NULL;
CDataMember * BaseMember = NULL;
// Validate
if (!DataTree || !Buffer) {
@@ -290,17 +287,14 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath )
Error = false;
// Get/Create Root object
if (!BasePath || !*BasePath) {
BaseMember = DataTree->GetRootMember();
}
else if (!(BaseMember = DataTree->GetMember( NULL, BasePath, true ))) {
if (!(BaseMember = DataTree->GetMember( BasePath, true ))) {
Error = true;
sprintf( ErrorText, "Invalid root object path" );
return false;
}
// Delete existing object contents
DataTree->Delete( BaseMember, NULL );
BaseMember->Clear();
// Position Counters
LineNo = 1;
@@ -537,9 +531,9 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
}
//---------------------------------------------------------------------------
bool CJSONparse::ParseObject( TDataMember * Object )
bool CJSONparse::ParseObject( CDataMember * Object )
{
TDataMember * Member = NULL;
CDataMember * Member = NULL;
char * MemberName = NULL;
int Len = 0;
@@ -550,7 +544,7 @@ bool CJSONparse::ParseObject( TDataMember * Object )
BufPos++;
// Set Type
DataTree->SetValue( Object, jtObject );
Object->SetValue( jtObject );
while (true)
{
@@ -574,7 +568,7 @@ bool CJSONparse::ParseObject( TDataMember * Object )
}
// Check if Member exists
Member = DataTree->GetMember( Object, MemberName, true );
Member = Object->GetMember( MemberName, true );
// Check for delimiter
SkipWhiteSpace();
@@ -590,7 +584,7 @@ bool CJSONparse::ParseObject( TDataMember * Object )
if (!ParseObject( Member ) && !Error && !ParseArray( Member ) && !Error && !ParseString( Member ) && !Error && !ParsePrimitive( Member ) ) {}
if (Error) {
// Destroy member
DataTree->Delete( Object, MemberName );
Object->Delete( MemberName );
return false;
}
@@ -619,10 +613,9 @@ bool CJSONparse::ParseObject( TDataMember * Object )
}
//---------------------------------------------------------------------------
bool CJSONparse::ParseArray( TDataMember * Array )
bool CJSONparse::ParseArray( CDataMember * Array )
{
TDataMember ** Member;
TDataMember * PrevMember;
CDataMember ** Member;
// Check for start of Object
if (*BufPos != '[') {
@@ -631,9 +624,8 @@ bool CJSONparse::ParseArray( TDataMember * Array )
BufPos++;
// Set Type
DataTree->SetValue( Array, jtArray );
Array->SetValue( jtArray );
Member = &(Array->FirstChild);
PrevMember = NULL;
while (true)
{
// Look for Member Name
@@ -643,18 +635,17 @@ bool CJSONparse::ParseArray( TDataMember * Array )
}
// Add new element
*Member = DataTree->CreateMember( Array, PrevMember, NULL );
*Member = new CDataMember( Array );
// Get Value
SkipWhiteSpace();
if (!ParseObject( *Member ) && !Error && !ParseArray( *Member ) && !Error && !ParseString( *Member ) && !Error && !ParsePrimitive( *Member ) ) {}
if (Error) {
DataTree->DestroyMember( Member );
delete Member;
return false;
}
else {
PrevMember = *Member;
Member = &((*Member)->Next);
Member = &((*Member)->NextPeer);
}
// Check if more parameters to follow
@@ -679,7 +670,7 @@ bool CJSONparse::ParseArray( TDataMember * Array )
}
//---------------------------------------------------------------------------
bool CJSONparse::ParseString( TDataMember * Member )
bool CJSONparse::ParseString( CDataMember * Member )
{
char * Value = NULL;
int Len = 0;
@@ -690,13 +681,13 @@ bool CJSONparse::ParseString( TDataMember * Member )
}
// Set string
DataTree->SetValuePtr( Member, jtString, Value, Len );
Member->SetValue( jtString, Value, Len );
return true;
}
//---------------------------------------------------------------------------
bool CJSONparse::ParsePrimitive( TDataMember * Member )
bool CJSONparse::ParsePrimitive( CDataMember * Member )
{
char * Value = NULL;
int Len = 0;
@@ -721,13 +712,13 @@ bool CJSONparse::ParsePrimitive( TDataMember * Member )
// Check for primitive values
if ((Len == 4) && !strncasecmp( Mark, "null", 4 )) {
DataTree->SetValuePtr( Member, jtNull, NULL, -1 );
Member->SetValue( jtNull, NULL, -1 );
}
else if ((Len == 4) && !strncasecmp( Mark, "true", 4 )) {
DataTree->SetValue( Member, jtBool, "1" );
Member->SetValue( jtBool, "1" );
}
else if ((Len == 5) && !strncasecmp( Mark, "false", 5 )) {
DataTree->SetValue( Member, jtBool, "0" );
Member->SetValue( jtBool, "0" );
}
else {
// Try conversion to int
@@ -736,7 +727,7 @@ bool CJSONparse::ParsePrimitive( TDataMember * Member )
Value = (char*)malloc( Len+1 );
memcpy( Value, Mark, Len );
Value[Len] = 0;
DataTree->SetValuePtr( Member, jtInt, Value, Len );
Member->SetValue( jtInt, Value, Len );
}
else {
// Try conversion to float
@@ -745,7 +736,7 @@ bool CJSONparse::ParsePrimitive( TDataMember * Member )
Value = (char*)malloc( Len+1 );
memcpy( Value, Mark, Len );
Value[Len] = 0;
DataTree->SetValuePtr( Member, jtFloat, Value, Len );
Member->SetValue( jtFloat, Value, Len );
}
else {
Error = true;
@@ -806,9 +797,9 @@ bool CJSONparse::PrintString( char * String, int Len )
}
//---------------------------------------------------------------------------
bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
{
TDataMember * Member;
CDataMember * Member;
bool First = true;
bool Last = false;
int Count = 0;
@@ -824,7 +815,7 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
}
// Save parameters
for (Member = Object->FirstChild; Member != NULL; (Member = Member->Next))
for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer))
{
// Whitespace around first bracket
if (Indent) {
@@ -895,9 +886,9 @@ bool CJSONparse::PrintObject( TDataMember * Object, const int Indent )
}
//---------------------------------------------------------------------------
bool CJSONparse::PrintArray( TDataMember * Array, const int Indent )
bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
{
TDataMember * Member;
CDataMember * Member;
bool First = true;
bool Last = false;
int Count = 0;
@@ -913,7 +904,7 @@ bool CJSONparse::PrintArray( TDataMember * Array, const int Indent )
}
// Save parameters
for (Member = Array->FirstChild; Member != NULL; (Member = Member->Next))
for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer))
{
// Whitespace around brace
if (Indent) {