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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user