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:
Charl Wentzel
2018-11-20 11:27:09 +02:00
parent 278198171d
commit 6263c0f508
9 changed files with 248 additions and 213 deletions

View File

@@ -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;
}
//---------------------------------------------------------------------------