Important update:
- DataTreeCore:
- Renamed Get/SetMemXxx() methods to Get/SetChXxx()
- Renamed GetMember() to GetChild()
- Updated: JSONparse, ApplicationCore, FunctionCore, SelectableCore,
and WatchdogCore
- Remove unused PrevChild & Last vars in GetChild (GetMember)
- JSONparseCore:
- Use return values from write() and PrintXxx() methods to report fail
- SelectableCore:
- Fix possible uninitialised FlowCtrl & Parity value
- DateTimeCore:
- Fix possible memory overrun in temp buffer
- EventBufferCore:
- Fix possible uninitialised value error in AddEvent
This commit is contained in:
@@ -136,15 +136,19 @@ bool CJSONparse::WriteToHandle( const char * BasePath, const int Handle, const i
|
||||
OutputHandle = Handle;
|
||||
|
||||
// Get Root object
|
||||
if (!(Member = DataTree->GetMember( BasePath ))) {
|
||||
if (!(Member = DataTree->GetChild( BasePath ))) {
|
||||
Error = true;
|
||||
sprintf( ErrorText, "Invalid root object path" );
|
||||
OutputHandle = -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Print to file
|
||||
PrintObject( Member, Indent );
|
||||
write( OutputHandle, "\n", 1 );
|
||||
if (!PrintObject( Member, Indent ) ||
|
||||
(write( OutputHandle, "\n", 1 ) < 0)) {
|
||||
OutputHandle = -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
OutputHandle = -1;
|
||||
return true;
|
||||
@@ -287,7 +291,7 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath )
|
||||
Error = false;
|
||||
|
||||
// Get/Create Root object
|
||||
if (!(BaseMember = DataTree->GetMember( BasePath, true ))) {
|
||||
if (!(BaseMember = DataTree->GetChild( BasePath, true ))) {
|
||||
Error = true;
|
||||
sprintf( ErrorText, "Invalid root object path" );
|
||||
return false;
|
||||
@@ -568,7 +572,7 @@ bool CJSONparse::ParseObject( CDataMember * Object )
|
||||
}
|
||||
|
||||
// Check if Member exists
|
||||
Member = Object->GetMember( MemberName, true );
|
||||
Member = Object->GetChild( MemberName, true );
|
||||
|
||||
// Check for delimiter
|
||||
SkipWhiteSpace();
|
||||
@@ -753,8 +757,11 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member )
|
||||
|
||||
bool CJSONparse::PrintString( char * String, int Len )
|
||||
{
|
||||
int BytesWritten;
|
||||
|
||||
// Start quote
|
||||
write( OutputHandle, "\"", 1 );
|
||||
if (write( OutputHandle, "\"", 1 ) < 0)
|
||||
return false;
|
||||
|
||||
// Content
|
||||
BufPos = String;
|
||||
@@ -766,7 +773,8 @@ bool CJSONparse::PrintString( char * String, int Len )
|
||||
BufPos++;
|
||||
|
||||
// Print Portion
|
||||
write( OutputHandle, Mark, (BufPos-Mark) );
|
||||
if (write( OutputHandle, Mark, (BufPos-Mark) ) < 0)
|
||||
return false;
|
||||
|
||||
// Handle special chars
|
||||
if (BufPos-String >= Len) {
|
||||
@@ -774,24 +782,27 @@ bool CJSONparse::PrintString( char * String, int Len )
|
||||
}
|
||||
else {
|
||||
switch (*BufPos) {
|
||||
case '\b': write( OutputHandle, "\\b", 2 ); break;
|
||||
case '\f': write( OutputHandle, "\\f", 2 ); break;
|
||||
case '\n': write( OutputHandle, "\\n", 2 ); break;
|
||||
case '\r': write( OutputHandle, "\\r", 2 ); break;
|
||||
case '\t': write( OutputHandle, "\\t", 2 ); break;
|
||||
case '/': write( OutputHandle, "\\/", 2 ); break;
|
||||
case '\\': write( OutputHandle, "\\\\", 2 ); break;
|
||||
case '"': write( OutputHandle, "\\\"", 2 ); break;
|
||||
case '\b': BytesWritten = write( OutputHandle, "\\b", 2 ); break;
|
||||
case '\f': BytesWritten = write( OutputHandle, "\\f", 2 ); break;
|
||||
case '\n': BytesWritten = write( OutputHandle, "\\n", 2 ); break;
|
||||
case '\r': BytesWritten = write( OutputHandle, "\\r", 2 ); break;
|
||||
case '\t': BytesWritten = write( OutputHandle, "\\t", 2 ); break;
|
||||
case '/': BytesWritten = write( OutputHandle, "\\/", 2 ); break;
|
||||
case '\\': BytesWritten = write( OutputHandle, "\\\\", 2 ); break;
|
||||
case '"': BytesWritten = write( OutputHandle, "\\\"", 2 ); break;
|
||||
default:
|
||||
dprintf( OutputHandle, "\\u%04X", (unsigned char)*BufPos );
|
||||
BytesWritten = dprintf( OutputHandle, "\\u%04X", (unsigned char)*BufPos );
|
||||
break;
|
||||
}
|
||||
if (BytesWritten < 0)
|
||||
return false;
|
||||
BufPos++;
|
||||
}
|
||||
}
|
||||
|
||||
// End Quote
|
||||
write( OutputHandle, "\"", 1 );
|
||||
if (write( OutputHandle, "\"", 1 ) < 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -805,7 +816,8 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
||||
int Count = 0;
|
||||
|
||||
// Opening brace
|
||||
write( OutputHandle, "{", 1 );
|
||||
if (write( OutputHandle, "{", 1 ) < 0)
|
||||
return false;
|
||||
|
||||
// Extend spacer
|
||||
if (Indent) {
|
||||
@@ -821,17 +833,22 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
||||
if (Indent) {
|
||||
if (First) {
|
||||
First = false;
|
||||
write( OutputHandle, "\n", 1 );
|
||||
if (write( OutputHandle, "\n", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
write( OutputHandle, Spacer, SpacerLen );
|
||||
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Print key name
|
||||
PrintString( Member->Name, strlen(Member->Name) );
|
||||
if (!PrintString( Member->Name, strlen(Member->Name) ))
|
||||
return false;
|
||||
if (Indent) {
|
||||
write( OutputHandle," : ", 3 );
|
||||
if (write( OutputHandle," : ", 3 ) < 0)
|
||||
return false;
|
||||
} else {
|
||||
write( OutputHandle, ":", 1 );
|
||||
if (write( OutputHandle, ":", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Print value
|
||||
@@ -839,37 +856,50 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
||||
switch (Member->Type)
|
||||
{
|
||||
case jtNull :
|
||||
write( OutputHandle, "null", 4 );
|
||||
if (write( OutputHandle, "null", 4 ) < 0)
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtBool :
|
||||
if (!strcmp( Member->Value, "0" ))
|
||||
write( OutputHandle, "false", 5 );
|
||||
else
|
||||
write( OutputHandle, "true", 4 );
|
||||
if (!strcmp( Member->Value, "0" )) {
|
||||
if (write( OutputHandle, "false", 5 ) < 0)
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
if (write( OutputHandle, "true", 4 ) < 0)
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case jtInt :
|
||||
case jtFloat :
|
||||
write( OutputHandle, Member->Value, Member->Len );
|
||||
if (write( OutputHandle, Member->Value, Member->Len ) < 0)
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtString :
|
||||
PrintString( Member->Value, Member->Len );
|
||||
if (!PrintString( Member->Value, Member->Len ))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtArray :
|
||||
PrintArray( Member, Indent );
|
||||
if (!PrintArray( Member, Indent ))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtObject :
|
||||
PrintObject( Member, Indent );
|
||||
if (!PrintObject( Member, Indent ))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
if (!Last)
|
||||
write( OutputHandle, ",", 1 );
|
||||
if (Indent)
|
||||
write( OutputHandle, "\n", 1 );
|
||||
if (!Last) {
|
||||
if (write( OutputHandle, ",", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
if (Indent) {
|
||||
if (write( OutputHandle, "\n", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Shorten spacer
|
||||
@@ -879,9 +909,12 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
||||
}
|
||||
|
||||
// Closing brace
|
||||
if (Indent)
|
||||
write( OutputHandle, Spacer, SpacerLen );
|
||||
write( OutputHandle, "}", 1 );
|
||||
if (Indent) {
|
||||
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
|
||||
return false;
|
||||
}
|
||||
if (write( OutputHandle, "}", 1 ))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -894,7 +927,8 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
|
||||
int Count = 0;
|
||||
|
||||
// Opening brace
|
||||
write( OutputHandle, "[", 1 );
|
||||
if (write( OutputHandle, "[", 1 ) < 0)
|
||||
return false;
|
||||
|
||||
// Extend spacer
|
||||
if (Indent) {
|
||||
@@ -910,42 +944,53 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
|
||||
if (Indent) {
|
||||
if (First) {
|
||||
First = false;
|
||||
write( OutputHandle, "\n", 1 );
|
||||
if (write( OutputHandle, "\n", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
write( OutputHandle, Spacer, SpacerLen );
|
||||
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
Last = (++Count >= Array->Len);
|
||||
switch (Member->Type)
|
||||
{
|
||||
case jtNull :
|
||||
write( OutputHandle, "null", 4 );
|
||||
if (write( OutputHandle, "null", 4 ) < 0)
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtBool :
|
||||
case jtInt :
|
||||
case jtFloat :
|
||||
write( OutputHandle, Member->Value, Member->Len );
|
||||
if (write( OutputHandle, Member->Value, Member->Len ) < 0)
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtString :
|
||||
write( OutputHandle, "\"", 1 );
|
||||
write( OutputHandle, Member->Value, Member->Len );
|
||||
write( OutputHandle, "\"", 1 );
|
||||
if ((write( OutputHandle, "\"", 1 ) < 0) ||
|
||||
(write( OutputHandle, Member->Value, Member->Len ) < 0) ||
|
||||
(write( OutputHandle, "\"", 1 ) < 0))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtArray :
|
||||
PrintArray( Member, Indent );
|
||||
if (!PrintArray( Member, Indent ))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case jtObject :
|
||||
PrintObject( Member, Indent );
|
||||
if (!PrintObject( Member, Indent ))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
if (!Last)
|
||||
write( OutputHandle, ",", 1 );
|
||||
if (Indent)
|
||||
write( OutputHandle, "\n", 1 );
|
||||
if (!Last) {
|
||||
if (write( OutputHandle, ",", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
if (Indent) {
|
||||
if (write( OutputHandle, "\n", 1 ) < 0)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Shorten spacer
|
||||
@@ -955,9 +1000,12 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
|
||||
}
|
||||
|
||||
// Closing brace
|
||||
if (Indent)
|
||||
write( OutputHandle, Spacer, SpacerLen );
|
||||
write( OutputHandle, "]", 1 );
|
||||
if (Indent) {
|
||||
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
|
||||
return false;
|
||||
}
|
||||
if (write( OutputHandle, "]", 1 ) < 0)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user