Code compacting of JSON & DataTree:

- Remove excessive {}
DataTree:
- Use "p" prefix in funtion parameters to avoid object parameter overlap
This commit is contained in:
2021-09-05 09:25:00 +02:00
parent 0e6cbf6664
commit 1de6cc498c
3 changed files with 113 additions and 171 deletions

View File

@@ -64,9 +64,8 @@ CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int p
else { else {
// Clear/reset parent if not object // Clear/reset parent if not object
Parent = pParent; Parent = pParent;
if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray)) { if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray))
Parent->Clear(); Parent->Clear();
}
// Insert into Parent & Peer lists // Insert into Parent & Peer lists
Parent->Len++; Parent->Len++;
@@ -93,19 +92,15 @@ CDataMember::~CDataMember()
// Remove from parent // Remove from parent
if (Parent) { if (Parent) {
Parent->Len--; Parent->Len--;
if (this == Parent->LastChild) { if (this == Parent->LastChild)
Parent->LastChild = PrevPeer; Parent->LastChild = PrevPeer;
} if (this == Parent->FirstChild)
if (this == Parent->FirstChild) {
Parent->FirstChild = NextPeer; Parent->FirstChild = NextPeer;
}
} }
if (PrevPeer) { if (PrevPeer)
PrevPeer->NextPeer = NextPeer; PrevPeer->NextPeer = NextPeer;
} if (NextPeer)
if (NextPeer) {
NextPeer->PrevPeer = PrevPeer; NextPeer->PrevPeer = PrevPeer;
}
// Destroy value/children // Destroy value/children
Clear(); Clear();
@@ -116,10 +111,10 @@ CDataMember::~CDataMember()
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
CDataMember * CDataMember::CreateChild( const char * Name, const int Len ) CDataMember * CDataMember::CreateChild( const char * pName, const int pLen )
{ {
CDataMember * Member; CDataMember * Member;
Member = new CDataMember( this, Name, Len ); Member = new CDataMember( this, pName, pLen );
return Member; return Member;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -131,9 +126,8 @@ bool CDataMember::Clear()
free( Value ); free( Value );
// Clear children // Clear children
while (FirstChild) { while (FirstChild)
delete FirstChild; delete FirstChild;
}
// Reset value // Reset value
Type = jtNull; Type = jtNull;
@@ -169,31 +163,26 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
int Count; int Count;
// Validate // Validate
if (!Path || !*Path) { if (!Path || !*Path)
return this; return this;
}
// Set init references // Set init references
Child = NULL; Child = NULL;
Member = this; Member = this;
// Split path // Split path
Pos = (char*)Path; Pos = (char*)Path;
while (Member && *Pos) while (Member && *Pos) {
{
// Reset Child reference // Reset Child reference
Child = NULL; Child = NULL;
// Find delimiter // Find delimiter
if (*Pos == '[') if (*Pos == '[') {
{
// Validate // Validate
if (Create && (Member->Type == jtNull)) { if (Create && (Member->Type == jtNull))
Member->Type = jtArray; // Convert to array Member->Type = jtArray; // Convert to array
} if (Member->Type != jtArray)
if (Member->Type != jtArray) {
break; // Can't convert something else to an array break; // Can't convert something else to an array
}
// Set Index start // Set Index start
Pos++; Pos++;
@@ -214,9 +203,8 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
// find end of list // find end of list
Child = &(Member->FirstChild); Child = &(Member->FirstChild);
while (*Child) { while (*Child)
Child = &((*Child)->NextPeer); Child = &((*Child)->NextPeer);
}
} }
else { else {
// Get requested index // Get requested index
@@ -235,25 +223,21 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
// Create element if needed // Create element if needed
if (!*Child && Create) { if (!*Child && Create) {
if ((Index == -1) || (Index == Count)) { if ((Index == -1) || (Index == Count))
*Child = new CDataMember( Member, NULL ); *Child = new CDataMember( Member, NULL );
}
} }
} }
else else {
{
// Skip separator // Skip separator
if (*Pos == '/') { if (*Pos == '/') {
Pos++; Pos++;
} }
// Validate // Validate
if (Create && (Member->Type == jtNull)) { if (Create && (Member->Type == jtNull))
Member->Type = jtObject; // Convert to object Member->Type = jtObject; // Convert to object
} if (Member->Type != jtObject)
if (Member->Type != jtObject) {
break; // Can't convert something else to an object break; // Can't convert something else to an object
}
// Get key value // Get key value
Key = Pos; Key = Pos;
@@ -265,12 +249,11 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
// Find next parent // Find next parent
Child = &(Member->FirstChild); Child = &(Member->FirstChild);
while (*Child && (((*Child)->NameLen != KeyLen) || strncasecmp( (*Child)->Name, Key, KeyLen ))) { while (*Child && (((*Child)->NameLen != KeyLen) || strncasecmp( (*Child)->Name, Key, KeyLen )))
Child = &((*Child)->NextPeer); Child = &((*Child)->NextPeer);
}
if (!*Child && Create) { if (!*Child && Create)
*Child = new CDataMember( Member, Key, KeyLen ); *Child = new CDataMember( Member, Key, KeyLen );
}
} }
// Next level // Next level
@@ -288,12 +271,10 @@ CDataMember * CDataMember::GetChFirstChild( const char * Path, bool Create )
Member = (!Path || !*Path)? this : GetChild( Path, Create ); Member = (!Path || !*Path)? this : GetChild( Path, Create );
// Check if valid type // Check if valid type
if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull))) { if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull)))
return NULL; return NULL;
} else if (Create && (Member->Type == jtNull))
else if (Create && (Member->Type == jtNull)) {
Member->SetObject(); // Set newly created member to object Member->SetObject(); // Set newly created member to object
}
return Member->FirstChild; return Member->FirstChild;
} }
@@ -309,12 +290,10 @@ CDataMember * CDataMember::GetChElement( const char * Path, const int Index, boo
Member = (!Path || !*Path)? this : GetChild( Path, Create ); Member = (!Path || !*Path)? this : GetChild( Path, Create );
// Check if valid type // Check if valid type
if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull))) { if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull)))
return NULL; return NULL;
} else if (Create && (Member->Type == jtNull))
else if (Create && (Member->Type == jtNull)) {
Member->SetArray(); // Set newly created member to array Member->SetArray(); // Set newly created member to array
}
// Find element at position // Find element at position
Count = 0; Count = 0;
@@ -354,8 +333,7 @@ bool CDataMember::SetValuePtr( EJsonDataType pType, const char * pValue, int pL
Clear(); Clear();
Type = pType; Type = pType;
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) {
{
Len = (pLen == -1)? strlen(pValue) : pLen; Len = (pLen == -1)? strlen(pValue) : pLen;
Value = (char*)pValue; Value = (char*)pValue;
} }
@@ -370,8 +348,7 @@ bool CDataMember::SetValue( EJsonDataType pType, const char * pValue, int pLen
Type = pType; Type = pType;
// Set new primitive value // Set new primitive value
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) {
{
Len = (pLen == -1)? strlen(pValue) : pLen; Len = (pLen == -1)? strlen(pValue) : pLen;
Value = strndup( pValue, Len ); Value = strndup( pValue, Len );
} }
@@ -384,9 +361,8 @@ bool CDataMember::SetChObject( const char * Path )
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Set as Object // Set as Object
Member->SetValue( jtObject, NULL ); Member->SetValue( jtObject, NULL );
@@ -399,9 +375,8 @@ bool CDataMember::SetChArray( const char * Path )
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Set as Object // Set as Object
Member->SetValue( jtArray, NULL ); Member->SetValue( jtArray, NULL );
@@ -409,71 +384,65 @@ bool CDataMember::SetChArray( const char * Path )
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool CDataMember::SetChStr( const char * Path, const char * Value, const int Len ) bool CDataMember::SetChStr( const char * Path, const char * pValue, const int pLen )
{ {
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Create Value // Create Value
if (!Value) { if (!pValue)
Member->SetValue( jtString, "", 0 ); Member->SetValue( jtString, "", 0 );
} else
else { Member->SetValue( jtString, pValue, pLen );
Member->SetValue( jtString, Value, Len );
}
return true; return true;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool CDataMember::SetChInt( const char * Path, const long Value, const char * Mask ) bool CDataMember::SetChInt( const char * Path, const long pValue, const char * Mask )
{ {
CDataMember * Member; CDataMember * Member;
char ValueStr[20]; char ValueStr[20];
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Create Value // Create Value
sprintf( ValueStr, ((Mask)? Mask : "%ld"), Value ); sprintf( ValueStr, ((Mask)? Mask : "%ld"), pValue );
Member->SetValue( jtInt, ValueStr ); Member->SetValue( jtInt, ValueStr );
return true; return true;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool CDataMember::SetChFloat( const char * Path, const double Value, const char * Mask ) bool CDataMember::SetChFloat( const char * Path, const double pValue, const char * Mask )
{ {
CDataMember * Member; CDataMember * Member;
char ValueStr[20]; char ValueStr[20];
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Create Value // Create Value
sprintf( ValueStr, ((Mask)? Mask : "%lf"), Value ); sprintf( ValueStr, ((Mask)? Mask : "%lf"), pValue );
Member->SetValue( jtFloat, ValueStr ); Member->SetValue( jtFloat, ValueStr );
return true; return true;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool CDataMember::SetChBool( const char * Path, const bool Value ) bool CDataMember::SetChBool( const char * Path, const bool pValue )
{ {
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Create Value // Create Value
Member->SetValue( jtBool, ((Value == 0)? "0" : "1") ); Member->SetValue( jtBool, ((pValue == 0)? "0" : "1") );
return true; return true;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -483,9 +452,8 @@ bool CDataMember::SetChNull( const char * Path )
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, true ))) { if (!(Member = GetChild( Path, true )))
return false; return false;
}
// Create Value // Create Value
Member->SetValue( jtNull, NULL ); Member->SetValue( jtNull, NULL );
@@ -498,10 +466,10 @@ const char * CDataMember::GetChName( const char * Path )
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, false ))) { if (!(Member = GetChild( Path, false )))
return NULL; return NULL;
} else
return Member->Name; return Member->Name;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -510,10 +478,10 @@ EJsonDataType CDataMember::GetChType( const char * Path )
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if (!(Member = GetChild( Path, false ))) { if (!(Member = GetChild( Path, false )))
return jtNull; return jtNull;
} else
return Member->Type; return Member->Type;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -522,12 +490,10 @@ const int CDataMember::GetChLen( const char * Path )
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if ((Member = GetChild( Path, false ))) { if ((Member = GetChild( Path, false )))
return Member->Len; return Member->Len;
} else
else {
return 0; return 0;
}
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -550,23 +516,23 @@ const char * CDataMember::GetChStr( const char * Path, const char * Default, boo
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
const char * CDataMember::GetChStr( const char * Path, int &Len, const char * Default, bool Create ) const char * CDataMember::GetChStr( const char * Path, int &pLen, const char * Default, bool Create )
{ {
CDataMember * Member; CDataMember * Member;
// Validate // Validate
if ((Member = GetChild( Path, Create )) && if ((Member = GetChild( Path, Create )) &&
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) { ((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
Len = Member->Len; pLen = Member->Len;
return Member->Value; return Member->Value;
} }
else if (Member && Create && (Member->Type == jtNull)) { else if (Member && Create && (Member->Type == jtNull)) {
Member->SetStr( Default ); Member->SetStr( Default );
Len = Member->Len; pLen = Member->Len;
return Member->Value; return Member->Value;
} }
else { else {
Len = 0; pLen = (Default? strlen(Default) : 0);
return Default; return Default;
} }
} }

View File

@@ -38,10 +38,10 @@ class CDataMember
CDataMember * NextPeer; CDataMember * NextPeer;
// Manage Members // Manage Members
CDataMember * CreateChild( const char * Name, const int Len = -1 ); CDataMember * CreateChild( const char * pName, const int pLen = -1 );
// Set Member value // Set Member value
bool SetValue( EJsonDataType Type, const char * Value = NULL, int Len = -1 ); bool SetValue( EJsonDataType pType, const char * pValue = NULL, int pLen = -1 );
bool SetValuePtr( EJsonDataType pType, const char * pValue, int pLen = -1 ); bool SetValuePtr( EJsonDataType pType, const char * pValue, int pLen = -1 );
public: public:
@@ -50,16 +50,15 @@ public:
~CDataMember(); ~CDataMember();
const char * GetName() { return Name; }; const char * GetName() { return Name; };
EJsonDataType GetType() { return Type; };
const int GetLen() { return Len; }; const int GetLen() { return Len; };
const char * GetChName( const char * Path ); const char * GetChName( const char * Path );
const int GetChLen( const char * Path ); EJsonDataType GetChType( const char * Path );
const int GetChLen( const char * Path );
/* Check Type */ /* Check Type */
EJsonDataType GetType() { return Type; };
EJsonDataType GetChType( const char * Path );
inline bool isNull() { return (Type == jtNull); }; inline bool isNull() { return (Type == jtNull); };
inline bool isBool() { return (Type == jtBool); }; inline bool isBool() { return (Type == jtBool); };
inline bool isInt() { return (Type == jtInt); }; inline bool isInt() { return (Type == jtInt); };
@@ -73,9 +72,9 @@ public:
inline CDataMember * GetFirstChild() { return GetChFirstChild( NULL, false ); }; inline CDataMember * GetFirstChild() { return GetChFirstChild( NULL, false ); };
inline CDataMember * GetElement( const int Index ) { return GetChElement( NULL, Index, false ); }; inline CDataMember * GetElement( const int Index ) { return GetChElement( NULL, Index, false ); };
CDataMember * GetChild( const char * Path, bool Create = false ); CDataMember * GetChild( const char * Path, bool Create = false );
CDataMember * GetChFirstChild( const char * Path, bool Create = false ); CDataMember * GetChFirstChild( const char * Path, bool Create = false );
CDataMember * GetChElement( const char * Path, const int Index, bool Create = false ); CDataMember * GetChElement( const char * Path, const int Index, bool Create = false );
inline CDataMember * GetParent() { return Parent; }; inline CDataMember * GetParent() { return Parent; };
inline CDataMember * GetPrevPeer() { return PrevPeer; }; inline CDataMember * GetPrevPeer() { return PrevPeer; };
@@ -83,37 +82,37 @@ public:
/* Read Values */ /* Read Values */
inline const char * GetStr( const char * Default = NULL ) { return GetChStr( NULL, Default, false ); }; inline const char * GetStr( const char * Default = NULL ) { return GetChStr( NULL, Default, false ); };
inline const char * GetStr( int &Len, const char * Default = NULL ) { return GetChStr( NULL, Len, Default, false ); }; inline const char * GetStr( int &pLen, const char * Default = NULL ) { return GetChStr( NULL, pLen, Default, false ); };
inline const bool GetBool( bool Default = false ) { return GetChBool( NULL, Default, false ); }; inline const bool GetBool( bool Default = false ) { return GetChBool( NULL, Default, false ); };
inline const long GetInt( long Default = 0, const char * Mask = NULL ) { return GetChInt( NULL, Default, false, Mask ); }; inline const long GetInt( long Default = 0, const char * Mask = NULL ) { return GetChInt( NULL, Default, false, Mask ); };
inline const double GetFloat( double Default = 0.0, const char * Mask = NULL ) { return GetChFloat( NULL, Default, false, Mask ); }; inline const double GetFloat( double Default = 0.0, const char * Mask = NULL ) { return GetChFloat( NULL, Default, false, Mask ); };
const char * GetChStr( const char * Path, const char * Default = NULL, bool Create = false ); const char * GetChStr( const char * Path, const char * Default = NULL, bool Create = false );
const char * GetChStr( const char * Path, int &Len, const char * Default = NULL, bool Create = false ); const char * GetChStr( const char * Path, int &pLen, const char * Default = NULL, bool Create = false );
const bool GetChBool( const char * Path, bool Default = false, bool Create = false ); const bool GetChBool( const char * Path, bool Default = false, bool Create = false );
const long GetChInt( const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL ); const long GetChInt( const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL );
const double GetChFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL ); const double GetChFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
/* Modify Values */ /* Modify Values */
inline bool SetNull() { return SetChNull( NULL ); }; inline bool SetNull() { return SetChNull( NULL ); };
inline bool SetObject() { return SetChObject( NULL ); }; inline bool SetObject() { return SetChObject( NULL ); };
inline bool SetArray() { return SetChArray( NULL ); }; inline bool SetArray() { return SetChArray( NULL ); };
inline bool SetBool( const bool Value ) { return SetChBool( NULL, Value ); }; inline bool SetBool( const bool pValue ) { return SetChBool( NULL, pValue ); };
inline bool SetInt( const long Value, const char * Mask = NULL ) { return SetChInt( NULL, Value, Mask ); }; inline bool SetInt( const long pValue, const char * Mask = NULL ) { return SetChInt( NULL, pValue, Mask ); };
inline bool SetFloat( const double Value, const char * Mask = NULL ) { return SetChFloat( NULL, Value, Mask ); }; inline bool SetFloat( const double pValue, const char * Mask = NULL ) { return SetChFloat( NULL, pValue, Mask ); };
inline bool SetStr( const char * Value = NULL, const int Len = -1 ) { return SetChStr( NULL, Value, Len ); }; inline bool SetStr( const char * pValue = NULL, const int pLen = -1 ) { return SetChStr( NULL, pValue, pLen ); };
bool SetChStr( const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values bool SetChStr( const char * Path, const char * pValue = NULL, const int pLen = -1 ); // Use Len param if Value contains NULL values
bool SetChObject( const char * Path ); bool SetChObject( const char * Path );
bool SetChArray( const char * Path ); bool SetChArray( const char * Path );
bool SetChNull( const char * Path ); bool SetChNull( const char * Path );
bool SetChBool( const char * Path, const bool Value ); bool SetChBool( const char * Path, const bool pValue );
bool SetChInt( const char * Path, const long Value, const char * Mask = NULL ); bool SetChInt( const char * Path, const long pValue, const char * Mask = NULL );
bool SetChFloat( const char * Path, const double Value, const char * Mask = NULL ); bool SetChFloat( const char * Path, const double pValue, const char * Mask = NULL );
/* Clear / Remove values */ /* Clear / Remove values */

View File

@@ -31,9 +31,8 @@ CJSONparse::CJSONparse( CDataMember * pDataTree )
CJSONparse::~CJSONparse() CJSONparse::~CJSONparse()
{ {
// Destroy buffer // Destroy buffer
if (Buffer) { if (Buffer)
delete Buffer; delete Buffer;
}
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -118,9 +117,8 @@ bool CJSONparse::WriteToFile( const char * BasePath, const char * Path, const ch
if (Path && *Path) { if (Path && *Path) {
strcpy( FilePath, Path ); strcpy( FilePath, Path );
PathLen = strlen( FilePath ); PathLen = strlen( FilePath );
if (FilePath[PathLen] != '/') { if (FilePath[PathLen] != '/')
FilePath[PathLen++] = '/'; FilePath[PathLen++] = '/';
}
} }
strcpy( &FilePath[PathLen], FileName ); strcpy( &FilePath[PathLen], FileName );
@@ -215,9 +213,8 @@ bool CJSONparse::ReadFromFile( const char * BasePath, const char * Path, const c
if (Path && *Path) { if (Path && *Path) {
strcpy( FilePath, Path ); strcpy( FilePath, Path );
PathLen = strlen( FilePath ); PathLen = strlen( FilePath );
if (FilePath[PathLen] != '/') { if (FilePath[PathLen] != '/')
FilePath[PathLen++] = '/'; FilePath[PathLen++] = '/';
}
} }
strcpy( &FilePath[PathLen], FileName ); strcpy( &FilePath[PathLen], FileName );
@@ -347,8 +344,8 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath )
BaseMember->Clear(); BaseMember->Clear();
// Position Counters // Position Counters
LineNo = 1; LineNo = 1;
CharNo = 0; CharNo = 0;
// Parse Root Object // Parse Root Object
SkipWhiteSpace(); SkipWhiteSpace();
@@ -357,9 +354,8 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath )
CharNo += BufPos-Mark; CharNo += BufPos-Mark;
sprintf( ErrorText, "First entry in file must be an Object or Array on line %d:%d", LineNo, CharNo ); sprintf( ErrorText, "First entry in file must be an Object or Array on line %d:%d", LineNo, CharNo );
} }
if (Error) { if (Error)
return false; return false;
}
// Ensure remainder of file is empty // Ensure remainder of file is empty
SkipWhiteSpace(); SkipWhiteSpace();
@@ -428,8 +424,7 @@ void CJSONparse::FreeBuffer()
void CJSONparse::SkipWhiteSpace() void CJSONparse::SkipWhiteSpace()
{ {
while (true) while (true) {
{
// Append buffer if required // Append buffer if required
if (!*BufPos && RefillBuffer) if (!*BufPos && RefillBuffer)
FillBuffer(); FillBuffer();
@@ -458,9 +453,8 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
char HexVal[5] = ""; char HexVal[5] = "";
// Check for opening quote // Check for opening quote
if (*BufPos != '"') { if (*BufPos != '"')
return false; return false;
}
// Clear values // Clear values
*Value = NULL; *Value = NULL;
@@ -470,12 +464,12 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
BufPos++; BufPos++;
// Check for closing quote // Check for closing quote
while (true) while (true) {
{
// Check for special characters // Check for special characters
if ((EndMark = strpbrk( BufPos, "\"\\\n\t\b\f\n\r" ))) { /*"\"/\\\n\t\b\f\n\r" (forward slash included)*/ if ((EndMark = strpbrk( BufPos, "\"\\\n\t\b\f\n\r" ))) { /*"\"/\\\n\t\b\f\n\r" (forward slash included)*/
BufPos = EndMark; BufPos = EndMark;
} else if (RefillBuffer) { }
else if (RefillBuffer) {
FillBuffer(); FillBuffer();
continue; continue;
} }
@@ -492,9 +486,8 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
} }
else if (*BufPos == '\\') { else if (*BufPos == '\\') {
if (!*(BufPos+1) && RefillBuffer) { if (!*(BufPos+1) && RefillBuffer) {
if (FillBuffer()) { if (FillBuffer())
continue; continue;
}
} }
if (*(BufPos+1) == 'u') { if (*(BufPos+1) == 'u') {
for (EndMark = BufPos+2; EndMark < BufPos+6; EndMark++) { for (EndMark = BufPos+2; EndMark < BufPos+6; EndMark++) {
@@ -538,8 +531,7 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
// Convert value // Convert value
BufPos = Mark+1; BufPos = Mark+1;
while ((EndMark = strpbrk( BufPos, "\"\\" ))) while ((EndMark = strpbrk( BufPos, "\"\\" ))) {
{
// Copy portion // Copy portion
memcpy( ValuePos, BufPos, (EndMark-BufPos) ); memcpy( ValuePos, BufPos, (EndMark-BufPos) );
ValuePos += (EndMark-BufPos); ValuePos += (EndMark-BufPos);
@@ -586,16 +578,14 @@ bool CJSONparse::ParseObject( CDataMember * Object )
int Len = 0; int Len = 0;
// Check for start of Object // Check for start of Object
if (*BufPos != '{') { if (*BufPos != '{')
return false; return false;
}
BufPos++; BufPos++;
// Set Type // Set Type
Object->SetValue( jtObject ); Object->SetValue( jtObject );
while (true) while (true) {
{
// Evaluate key name // Evaluate key name
SkipWhiteSpace(); SkipWhiteSpace();
if (*BufPos == '}') { if (*BufPos == '}') {
@@ -666,21 +656,18 @@ bool CJSONparse::ParseArray( CDataMember * Array )
CDataMember ** Member; CDataMember ** Member;
// Check for start of Object // Check for start of Object
if (*BufPos != '[') { if (*BufPos != '[')
return false; return false;
}
BufPos++; BufPos++;
// Set Type // Set Type
Array->SetValue( jtArray ); Array->SetValue( jtArray );
Member = &(Array->FirstChild); Member = &(Array->FirstChild);
while (true) while (true) {
{
// Look for Member Name // Look for Member Name
SkipWhiteSpace(); SkipWhiteSpace();
if (*BufPos == ']') { if (*BufPos == ']')
break; break;
}
// Add new element // Add new element
*Member = new CDataMember( Array ); *Member = new CDataMember( Array );
@@ -724,9 +711,8 @@ bool CJSONparse::ParseString( CDataMember * Member )
int Len = 0; int Len = 0;
// Try to parse // Try to parse
if (!ParseString( &Value, Len )) { if (!ParseString( &Value, Len ))
return false; return false;
}
// Set string // Set string
Member->SetValuePtr( jtString, Value, Len ); Member->SetValuePtr( jtString, Value, Len );
@@ -737,7 +723,6 @@ bool CJSONparse::ParseString( CDataMember * Member )
bool CJSONparse::ParsePrimitive( CDataMember * Member ) bool CJSONparse::ParsePrimitive( CDataMember * Member )
{ {
char * Value = NULL;
int Len = 0; int Len = 0;
char * EndMark; char * EndMark;
@@ -772,19 +757,13 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member )
// Try conversion to int // Try conversion to int
strtol( Mark, &EndMark, 10 ); strtol( Mark, &EndMark, 10 );
if (EndMark == BufPos) { if (EndMark == BufPos) {
Value = (char*)malloc( Len+1 ); Member->SetValue( jtInt, Mark, Len );
memcpy( Value, Mark, Len );
Value[Len] = 0;
Member->SetValuePtr( jtInt, Value, Len );
} }
else { else {
// Try conversion to float // Try conversion to float
strtod( Mark, &EndMark ); strtod( Mark, &EndMark );
if (EndMark == BufPos) { if (EndMark == BufPos) {
Value = (char*)malloc( Len+1 ); Member->SetValue( jtFloat, Mark, Len );
memcpy( Value, Mark, Len );
Value[Len] = 0;
Member->SetValuePtr( jtFloat, Value, Len );
} }
else { else {
Error = true; Error = true;
@@ -810,8 +789,7 @@ bool CJSONparse::PrintString( char * String, int Len )
// Content // Content
BufPos = String; BufPos = String;
while (true) while (true) {
{
// Scan for special chars // Scan for special chars
Mark = BufPos; Mark = BufPos;
while ((*BufPos >= 32) && (*BufPos <= 126) && (*BufPos != '\\') && /*(*BufPos != '/') &&*/ (*BufPos != '"')) while ((*BufPos >= 32) && (*BufPos <= 126) && (*BufPos != '\\') && /*(*BufPos != '/') &&*/ (*BufPos != '"'))
@@ -880,8 +858,7 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
} }
// Save parameters // Save parameters
for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer)) for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer)) {
{
// Whitespace around first bracket // Whitespace around first bracket
if (Indent) { if (Indent) {
if (First) { if (First) {
@@ -894,20 +871,21 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
} }
// Print key name // Print key name
if (!PrintString( Member->Name, strlen(Member->Name) )) if (!PrintString( Member->Name, strlen(Member->Name) )) {
return false; return false;
if (Indent) { }
else if (Indent) {
if (Print( this, " : ", 3 ) < 0) if (Print( this, " : ", 3 ) < 0)
return false; return false;
} else { }
else {
if (Print( this, ":", 1 ) < 0) if (Print( this, ":", 1 ) < 0)
return false; return false;
} }
// Print value // Print value
Last = (++Count >= Object->Len); Last = (++Count >= Object->Len);
switch (Member->Type) switch (Member->Type) {
{
case jtNull : case jtNull :
if (Print( this, "null", 4 ) < 0) if (Print( this, "null", 4 ) < 0)
return false; return false;
@@ -968,6 +946,7 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
} }
if (Print( this, "}", 1 ) < 0) if (Print( this, "}", 1 ) < 0)
return false; return false;
return true; return true;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -998,8 +977,7 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
} }
// Save parameters // Save parameters
for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer)) for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer)) {
{
// Whitespace around brace // Whitespace around brace
if (Indent) { if (Indent) {
if (First) { if (First) {
@@ -1012,8 +990,7 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
} }
Last = (++Count >= Array->Len); Last = (++Count >= Array->Len);
switch (Member->Type) switch (Member->Type) {
{
case jtNull : case jtNull :
if (Print( this, "null", 4 ) < 0) if (Print( this, "null", 4 ) < 0)
return false; return false;