diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index 49f221f..ce1a842 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -17,71 +17,34 @@ CDataMember::CDataMember( const char * pName, const int pLen ) { if (pName) { - Name = strdup( pName ); NameLen = (pLen == -1)? strlen( pName ) : pLen ; + Name = strndup( pName, NameLen ); } - else { - Name = NULL; - NameLen = 0; - } - - Type = jtNull; - Value = NULL; - Len = 0; - - FirstChild = NULL; - LastChild = NULL; - - Parent = NULL; - PrevPeer = NULL; - NextPeer = NULL; } //--------------------------------------------------------------------------- CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int pLen ) { if (pName) { - Name = strdup( pName ); NameLen = (pLen == -1)? strlen( pName ) : pLen ; - } - else { - Name = NULL; - NameLen = 0; + Name = strndup( pName, NameLen ); } - Type = jtNull; - Value = NULL; - Len = 0; - - FirstChild = NULL; - LastChild = NULL; - - if (!pParent) { - Parent = NULL; - PrevPeer = NULL; - NextPeer = NULL; - } - else { + if (pParent) { // Clear/reset parent if not object Parent = pParent; - if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray)) { + if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray)) Parent->Clear(); - } // Insert into Parent & Peer lists Parent->Len++; if (!Parent->FirstChild) { - PrevPeer = NULL; - NextPeer = NULL; - Parent->FirstChild = this; Parent->LastChild = this; } else { PrevPeer = Parent->LastChild; Parent->LastChild->NextPeer = this; - NextPeer = NULL; - Parent->LastChild = this; } } @@ -93,19 +56,15 @@ CDataMember::~CDataMember() // Remove from parent if (Parent) { Parent->Len--; - if (this == Parent->LastChild) { + if (this == Parent->LastChild) Parent->LastChild = PrevPeer; - } - if (this == Parent->FirstChild) { + if (this == Parent->FirstChild) Parent->FirstChild = NextPeer; - } } - if (PrevPeer) { + if (PrevPeer) PrevPeer->NextPeer = NextPeer; - } - if (NextPeer) { + if (NextPeer) NextPeer->PrevPeer = PrevPeer; - } // Destroy value/children Clear(); @@ -116,10 +75,10 @@ CDataMember::~CDataMember() } //--------------------------------------------------------------------------- -CDataMember * CDataMember::CreateChild( const char * Name, const int Len ) +CDataMember * CDataMember::CreateChild( const char * pName, const int pLen ) { CDataMember * Member; - Member = new CDataMember( this, Name, Len ); + Member = new CDataMember( this, pName, pLen ); return Member; } //--------------------------------------------------------------------------- @@ -131,9 +90,8 @@ bool CDataMember::Clear() free( Value ); // Clear children - while (FirstChild) { + while (FirstChild) delete FirstChild; - } // Reset value Type = jtNull; @@ -169,31 +127,26 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create ) int Count; // Validate - if (!Path || !*Path) { + if (!Path || !*Path) return this; - } // Set init references - Child = NULL; - Member = this; + Child = NULL; + Member = this; // Split path Pos = (char*)Path; - while (Member && *Pos) - { + while (Member && *Pos) { // Reset Child reference Child = NULL; // Find delimiter - if (*Pos == '[') - { + if (*Pos == '[') { // Validate - if (Create && (Member->Type == jtNull)) { + if (Create && (Member->Type == jtNull)) Member->Type = jtArray; // Convert to array - } - if (Member->Type != jtArray) { + if (Member->Type != jtArray) break; // Can't convert something else to an array - } // Set Index start Pos++; @@ -214,9 +167,8 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create ) // find end of list Child = &(Member->FirstChild); - while (*Child) { + while (*Child) Child = &((*Child)->NextPeer); - } } else { // Get requested index @@ -235,25 +187,21 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create ) // Create element if needed if (!*Child && Create) { - if ((Index == -1) || (Index == Count)) { + if ((Index == -1) || (Index == Count)) *Child = new CDataMember( Member, NULL ); - } } } - else - { + else { // Skip separator if (*Pos == '/') { Pos++; } // Validate - if (Create && (Member->Type == jtNull)) { + if (Create && (Member->Type == jtNull)) Member->Type = jtObject; // Convert to object - } - if (Member->Type != jtObject) { + if (Member->Type != jtObject) break; // Can't convert something else to an object - } // Get key value Key = Pos; @@ -265,12 +213,11 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create ) // Find next parent 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); - } - if (!*Child && Create) { + + if (!*Child && Create) *Child = new CDataMember( Member, Key, KeyLen ); - } } // Next level @@ -288,12 +235,10 @@ CDataMember * CDataMember::GetChFirstChild( const char * Path, bool Create ) Member = (!Path || !*Path)? this : GetChild( Path, Create ); // Check if valid type - if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull))) { + if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull))) return NULL; - } - else if (Create && (Member->Type == jtNull)) { + else if (Create && (Member->Type == jtNull)) Member->SetObject(); // Set newly created member to object - } return Member->FirstChild; } @@ -309,12 +254,10 @@ CDataMember * CDataMember::GetChElement( const char * Path, const int Index, boo Member = (!Path || !*Path)? this : GetChild( Path, Create ); // Check if valid type - if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull))) { + if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull))) return NULL; - } - else if (Create && (Member->Type == jtNull)) { + else if (Create && (Member->Type == jtNull)) Member->SetArray(); // Set newly created member to array - } // Find element at position Count = 0; @@ -354,8 +297,7 @@ bool CDataMember::SetValuePtr( EJsonDataType pType, const char * pValue, int pL Clear(); 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; Value = (char*)pValue; } @@ -370,10 +312,9 @@ bool CDataMember::SetValue( EJsonDataType pType, const char * pValue, int pLen Type = pType; // Set new primitive value - if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) - { - Value = strdup( pValue ); + if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) { Len = (pLen == -1)? strlen(pValue) : pLen; + Value = strndup( pValue, Len ); } return true; } @@ -384,9 +325,8 @@ bool CDataMember::SetChObject( const char * Path ) CDataMember * Member; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Set as Object Member->SetValue( jtObject, NULL ); @@ -399,9 +339,8 @@ bool CDataMember::SetChArray( const char * Path ) CDataMember * Member; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Set as Object Member->SetValue( jtArray, NULL ); @@ -409,71 +348,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; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Create Value - if (!Value) { + if (!pValue) Member->SetValue( jtString, "", 0 ); - } - else { - Member->SetValue( jtString, Value, Len ); - } + else + Member->SetValue( jtString, pValue, pLen ); 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; char ValueStr[20]; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Create Value - sprintf( ValueStr, ((Mask)? Mask : "%ld"), Value ); + sprintf( ValueStr, ((Mask)? Mask : "%ld"), pValue ); Member->SetValue( jtInt, ValueStr ); 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; char ValueStr[20]; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Create Value - sprintf( ValueStr, ((Mask)? Mask : "%lf"), Value ); + sprintf( ValueStr, ((Mask)? Mask : "%lf"), pValue ); Member->SetValue( jtFloat, ValueStr ); return true; } //--------------------------------------------------------------------------- -bool CDataMember::SetChBool( const char * Path, const bool Value ) +bool CDataMember::SetChBool( const char * Path, const bool pValue ) { CDataMember * Member; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Create Value - Member->SetValue( jtBool, ((Value == 0)? "0" : "1") ); + Member->SetValue( jtBool, ((pValue == 0)? "0" : "1") ); return true; } //--------------------------------------------------------------------------- @@ -483,9 +416,8 @@ bool CDataMember::SetChNull( const char * Path ) CDataMember * Member; // Validate - if (!(Member = GetChild( Path, true ))) { + if (!(Member = GetChild( Path, true ))) return false; - } // Create Value Member->SetValue( jtNull, NULL ); @@ -498,10 +430,10 @@ const char * CDataMember::GetChName( const char * Path ) CDataMember * Member; // Validate - if (!(Member = GetChild( Path, false ))) { + if (!(Member = GetChild( Path, false ))) return NULL; - } - return Member->Name; + else + return Member->Name; } //--------------------------------------------------------------------------- @@ -510,10 +442,10 @@ EJsonDataType CDataMember::GetChType( const char * Path ) CDataMember * Member; // Validate - if (!(Member = GetChild( Path, false ))) { + if (!(Member = GetChild( Path, false ))) return jtNull; - } - return Member->Type; + else + return Member->Type; } //--------------------------------------------------------------------------- @@ -522,12 +454,10 @@ const int CDataMember::GetChLen( const char * Path ) CDataMember * Member; // Validate - if ((Member = GetChild( Path, false ))) { + if ((Member = GetChild( Path, false ))) return Member->Len; - } - else { + else return 0; - } } //--------------------------------------------------------------------------- @@ -550,23 +480,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; // Validate if ((Member = GetChild( Path, Create )) && ((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) { - Len = Member->Len; + pLen = Member->Len; return Member->Value; } else if (Member && Create && (Member->Type == jtNull)) { Member->SetStr( Default ); - Len = Member->Len; + pLen = Member->Len; return Member->Value; } else { - Len = 0; + pLen = (Default? strlen(Default) : 0); return Default; } } diff --git a/DataTreeCore.h b/DataTreeCore.h index a930d24..b1203e1 100644 --- a/DataTreeCore.h +++ b/DataTreeCore.h @@ -23,25 +23,25 @@ typedef enum { jtNull = 0, jtBool = 1, jtInt = 2, jtFloat = 3, jtString = 4, jtA // One Config Members class CDataMember { - char * Name; - unsigned short NameLen; - EJsonDataType Type; + char * Name = NULL; + unsigned short NameLen = 0; + EJsonDataType Type = jtNull; - char * Value; - unsigned short Len; + char * Value = NULL; + unsigned short Len = 0; - CDataMember * FirstChild; - CDataMember * LastChild; + CDataMember * FirstChild = NULL; + CDataMember * LastChild = NULL; - CDataMember * Parent; - CDataMember * PrevPeer; - CDataMember * NextPeer; + CDataMember * Parent = NULL; + CDataMember * PrevPeer = NULL; + CDataMember * NextPeer = NULL; // Manage Members - CDataMember * CreateChild( const char * Name, const int Len = -1 ); + CDataMember * CreateChild( const char * pName, const int pLen = -1 ); // 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 ); public: @@ -50,16 +50,15 @@ public: ~CDataMember(); const char * GetName() { return Name; }; + EJsonDataType GetType() { return Type; }; const int GetLen() { return Len; }; 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 */ - EJsonDataType GetType() { return Type; }; - EJsonDataType GetChType( const char * Path ); - inline bool isNull() { return (Type == jtNull); }; inline bool isBool() { return (Type == jtBool); }; inline bool isInt() { return (Type == jtInt); }; @@ -73,9 +72,9 @@ public: inline CDataMember * GetFirstChild() { return GetChFirstChild( NULL, 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 * 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 * GetPrevPeer() { return PrevPeer; }; @@ -83,37 +82,37 @@ public: /* Read Values */ - 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 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 char * GetStr( const char * Default = NULL ) { return GetChStr( NULL, 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 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 ); }; 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 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 ); /* Modify Values */ - inline bool SetNull() { return SetChNull( NULL ); }; + inline bool SetNull() { return SetChNull( 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 SetInt( const long Value, const char * Mask = NULL ) { return SetChInt( NULL, Value, Mask ); }; - inline bool SetFloat( const double Value, const char * Mask = NULL ) { return SetChFloat( NULL, Value, Mask ); }; - inline bool SetStr( const char * Value = NULL, const int Len = -1 ) { return SetChStr( NULL, Value, Len ); }; + inline bool SetBool( const bool pValue ) { return SetChBool( NULL, pValue ); }; + inline bool SetInt( const long pValue, const char * Mask = NULL ) { return SetChInt( NULL, pValue, Mask ); }; + inline bool SetFloat( const double pValue, const char * Mask = NULL ) { return SetChFloat( NULL, pValue, Mask ); }; + 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 SetChArray( const char * Path ); - bool SetChNull( const char * Path ); - bool SetChBool( const char * Path, const bool Value ); - bool SetChInt( const char * Path, const long Value, const char * Mask = NULL ); - bool SetChFloat( const char * Path, const double Value, const char * Mask = NULL ); + bool SetChNull( const char * Path ); + bool SetChBool( const char * Path, const bool pValue ); + bool SetChInt( const char * Path, const long pValue, const char * Mask = NULL ); + bool SetChFloat( const char * Path, const double pValue, const char * Mask = NULL ); /* Clear / Remove values */ diff --git a/DateTimeCore.cpp b/DateTimeCore.cpp index 6dade96..f542a78 100644 --- a/DateTimeCore.cpp +++ b/DateTimeCore.cpp @@ -223,7 +223,7 @@ char const * GetDateTimeStr( const char * DateSeparator, const char * TimeSepar // Build String sprintf( ReturnStr, "%04d%s%02d%s%02d%s%02d%s%02d%s%02d", Year, ((DateSeparator)? DateSeparator : ""), Month, ((DateSeparator)? DateSeparator : ""), Day, - Separator, + ((Separator)? Separator : ""), Hours, ((TimeSeparator)? TimeSeparator : ""), Minutes, ((TimeSeparator)? TimeSeparator : ""), Seconds ); return (ReturnStr); @@ -309,7 +309,8 @@ bool ReadDateTime( const char * DateTimeStr, bool LocalTime, time_t &EpochTime ) // Update time NewTime.tm_year -= 1900; NewTime.tm_mon -= 1; - NewTime.tm_zone = "UTC"; + NewTime.tm_zone = "UTC"; + NewTime.tm_isdst = -1; // Convert to Epoch Time EpochTime = mktime( &NewTime ) + ((LocalTime)? 0 : NewTime.tm_gmtoff); @@ -423,7 +424,7 @@ char const * BuildDateTimeStr( unsigned char Day, unsigned char Month, unsigned // Build String sprintf( ReturnStr, "%04d%s%02d%s%02d%s%02d%s%02d%s%02d", Year, ((DateSeparator)? DateSeparator : ""), Month, ((DateSeparator)? DateSeparator : ""), Day, - Separator, + ((Separator)? Separator : ""), Hours, ((TimeSeparator)? TimeSeparator : ""), Minutes, ((TimeSeparator)? TimeSeparator : ""), Seconds ); return (ReturnStr); diff --git a/JSONparseCore.cpp b/JSONparseCore.cpp index b879e8b..c63e983 100644 --- a/JSONparseCore.cpp +++ b/JSONparseCore.cpp @@ -31,9 +31,8 @@ CJSONparse::CJSONparse( CDataMember * pDataTree ) CJSONparse::~CJSONparse() { // Destroy buffer - if (Buffer) { + if (Buffer) delete Buffer; - } } //--------------------------------------------------------------------------- @@ -118,9 +117,8 @@ bool CJSONparse::WriteToFile( const char * BasePath, const char * Path, const ch if (Path && *Path) { strcpy( FilePath, Path ); PathLen = strlen( FilePath ); - if (FilePath[PathLen] != '/') { + if (FilePath[PathLen] != '/') FilePath[PathLen++] = '/'; - } } strcpy( &FilePath[PathLen], FileName ); @@ -215,9 +213,8 @@ bool CJSONparse::ReadFromFile( const char * BasePath, const char * Path, const c if (Path && *Path) { strcpy( FilePath, Path ); PathLen = strlen( FilePath ); - if (FilePath[PathLen] != '/') { + if (FilePath[PathLen] != '/') FilePath[PathLen++] = '/'; - } } strcpy( &FilePath[PathLen], FileName ); @@ -347,8 +344,8 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath ) BaseMember->Clear(); // Position Counters - LineNo = 1; - CharNo = 0; + LineNo = 1; + CharNo = 0; // Parse Root Object SkipWhiteSpace(); @@ -357,9 +354,8 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath ) CharNo += BufPos-Mark; sprintf( ErrorText, "First entry in file must be an Object or Array on line %d:%d", LineNo, CharNo ); } - if (Error) { + if (Error) return false; - } // Ensure remainder of file is empty SkipWhiteSpace(); @@ -428,8 +424,7 @@ void CJSONparse::FreeBuffer() void CJSONparse::SkipWhiteSpace() { - while (true) - { + while (true) { // Append buffer if required if (!*BufPos && RefillBuffer) FillBuffer(); @@ -458,9 +453,8 @@ bool CJSONparse::ParseString( char ** Value, int &Len ) char HexVal[5] = ""; // Check for opening quote - if (*BufPos != '"') { + if (*BufPos != '"') return false; - } // Clear values *Value = NULL; @@ -470,12 +464,12 @@ bool CJSONparse::ParseString( char ** Value, int &Len ) BufPos++; // Check for closing quote - while (true) - { + while (true) { // Check for special characters if ((EndMark = strpbrk( BufPos, "\"\\\n\t\b\f\n\r" ))) { /*"\"/\\\n\t\b\f\n\r" (forward slash included)*/ BufPos = EndMark; - } else if (RefillBuffer) { + } + else if (RefillBuffer) { FillBuffer(); continue; } @@ -492,9 +486,8 @@ bool CJSONparse::ParseString( char ** Value, int &Len ) } else if (*BufPos == '\\') { if (!*(BufPos+1) && RefillBuffer) { - if (FillBuffer()) { + if (FillBuffer()) continue; - } } if (*(BufPos+1) == 'u') { for (EndMark = BufPos+2; EndMark < BufPos+6; EndMark++) { @@ -538,8 +531,7 @@ bool CJSONparse::ParseString( char ** Value, int &Len ) // Convert value BufPos = Mark+1; - while ((EndMark = strpbrk( BufPos, "\"\\" ))) - { + while ((EndMark = strpbrk( BufPos, "\"\\" ))) { // Copy portion memcpy( ValuePos, BufPos, (EndMark-BufPos) ); ValuePos += (EndMark-BufPos); @@ -586,16 +578,14 @@ bool CJSONparse::ParseObject( CDataMember * Object ) int Len = 0; // Check for start of Object - if (*BufPos != '{') { + if (*BufPos != '{') return false; - } BufPos++; // Set Type Object->SetValue( jtObject ); - while (true) - { + while (true) { // Evaluate key name SkipWhiteSpace(); if (*BufPos == '}') { @@ -666,21 +656,18 @@ bool CJSONparse::ParseArray( CDataMember * Array ) CDataMember ** Member; // Check for start of Object - if (*BufPos != '[') { + if (*BufPos != '[') return false; - } BufPos++; // Set Type Array->SetValue( jtArray ); Member = &(Array->FirstChild); - while (true) - { + while (true) { // Look for Member Name SkipWhiteSpace(); - if (*BufPos == ']') { + if (*BufPos == ']') break; - } // Add new element *Member = new CDataMember( Array ); @@ -724,9 +711,8 @@ bool CJSONparse::ParseString( CDataMember * Member ) int Len = 0; // Try to parse - if (!ParseString( &Value, Len )) { + if (!ParseString( &Value, Len )) return false; - } // Set string Member->SetValuePtr( jtString, Value, Len ); @@ -737,7 +723,6 @@ bool CJSONparse::ParseString( CDataMember * Member ) bool CJSONparse::ParsePrimitive( CDataMember * Member ) { - char * Value = NULL; int Len = 0; char * EndMark; @@ -772,19 +757,13 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member ) // Try conversion to int strtol( Mark, &EndMark, 10 ); if (EndMark == BufPos) { - Value = (char*)malloc( Len+1 ); - memcpy( Value, Mark, Len ); - Value[Len] = 0; - Member->SetValuePtr( jtInt, Value, Len ); + Member->SetValue( jtInt, Mark, Len ); } else { // Try conversion to float strtod( Mark, &EndMark ); if (EndMark == BufPos) { - Value = (char*)malloc( Len+1 ); - memcpy( Value, Mark, Len ); - Value[Len] = 0; - Member->SetValuePtr( jtFloat, Value, Len ); + Member->SetValue( jtFloat, Mark, Len ); } else { Error = true; @@ -810,8 +789,7 @@ bool CJSONparse::PrintString( char * String, int Len ) // Content BufPos = String; - while (true) - { + while (true) { // Scan for special chars Mark = BufPos; while ((*BufPos >= 32) && (*BufPos <= 126) && (*BufPos != '\\') && /*(*BufPos != '/') &&*/ (*BufPos != '"')) @@ -880,8 +858,7 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent ) } // Save parameters - for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer)) - { + for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer)) { // Whitespace around first bracket if (Indent) { if (First) { @@ -894,20 +871,21 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent ) } // Print key name - if (!PrintString( Member->Name, strlen(Member->Name) )) + if (!PrintString( Member->Name, strlen(Member->Name) )) { return false; - if (Indent) { + } + else if (Indent) { if (Print( this, " : ", 3 ) < 0) return false; - } else { + } + else { if (Print( this, ":", 1 ) < 0) return false; } // Print value Last = (++Count >= Object->Len); - switch (Member->Type) - { + switch (Member->Type) { case jtNull : if (Print( this, "null", 4 ) < 0) return false; @@ -968,6 +946,7 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent ) } if (Print( this, "}", 1 ) < 0) return false; + return true; } //--------------------------------------------------------------------------- @@ -998,8 +977,7 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent ) } // Save parameters - for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer)) - { + for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer)) { // Whitespace around brace if (Indent) { if (First) { @@ -1012,8 +990,7 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent ) } Last = (++Count >= Array->Len); - switch (Member->Type) - { + switch (Member->Type) { case jtNull : if (Print( this, "null", 4 ) < 0) return false; diff --git a/SelectCore.cpp b/SelectCore.cpp index eeeec5e..08745ba 100644 --- a/SelectCore.cpp +++ b/SelectCore.cpp @@ -54,7 +54,7 @@ CSelect::~CSelect() while (FirstHandle) { NextHandle = FirstHandle->Next; - free( FirstHandle ); + delete FirstHandle; FirstHandle = NextHandle; } @@ -95,8 +95,7 @@ void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableB } if (!*SelectHandle) { // Create if not exist - *SelectHandle = (TSelectHandle*)malloc( sizeof(TSelectHandle) ); - memset( *SelectHandle, 0, sizeof(TSelectHandle) ); + *SelectHandle = new TSelectHandle; // Set Parameters (*SelectHandle)->FD = FD; @@ -229,7 +228,7 @@ bool CSelect::Test() *HandlePtr = (*HandlePtr)->Next; // Destroy and go to next - free( Handle ); + delete Handle; Handle = *HandlePtr; continue; } diff --git a/TimingCore.h b/TimingCore.h index 14f8ece..3211f10 100644 --- a/TimingCore.h +++ b/TimingCore.h @@ -63,6 +63,18 @@ inline long SecondsPassed( timeval StartTime ) { }; //--------------------------------------------------------------------------- +// Milli-seconds difference between two times +inline long TimeDiff( timeval StartTime, timeval EndTime ) { + long Duration; + + Duration = (EndTime.tv_sec - StartTime.tv_sec) * (time_t)1000 + + (EndTime.tv_usec - StartTime.tv_usec) / (time_t)1000; + if (Duration < 0) + Duration = LONG_MAX; + return Duration; +}; +//--------------------------------------------------------------------------- + // Time remaining from Start time to given time out inline long TimeLeft( timeval StartTime, long MilliSeconds ) { return (MilliSeconds - TimePassed(StartTime));