- Improve "printing" for JSON with single & multi line objects - Fix bugs in getting, setting & creating array elements - "array[]" allowed to create/add element at end of an array - No longer duplicate get() path (reduce memory allocation) - added NameLen to TMember to eliminate zero-terminate requirement - Fix ReadfromXXX() return values
93 lines
3.5 KiB
C++
93 lines
3.5 KiB
C++
/*
|
|
* DataTreeCore.h
|
|
*
|
|
* Created on: 5 Mar 2017
|
|
* Author: wentzelc
|
|
*/
|
|
|
|
#ifndef REDACORE_DATATREECORE_H_
|
|
#define REDACORE_DATATREECORE_H_
|
|
|
|
// redA Libraries
|
|
#include <BufferCore.h>
|
|
|
|
// Standard C/C++ Libraries
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdio.h>
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
typedef enum { jtNull = 0, jtBool = 1, jtInt = 2, jtFloat = 3, jtString = 4, jtArray = 5, jtObject = 6 } EDataType;
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
// Structure prototypes
|
|
typedef struct SDataMember TDataMember;
|
|
|
|
// One Config Members
|
|
struct SDataMember
|
|
{
|
|
char * Name;
|
|
unsigned short NameLen;
|
|
EDataType Type;
|
|
|
|
TDataMember * FirstChild;
|
|
char * Value;
|
|
unsigned short Len;
|
|
|
|
TDataMember * Next;
|
|
};
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
class CDataTree
|
|
{
|
|
private:
|
|
TDataMember * RootMember;
|
|
|
|
// Manage Members
|
|
TDataMember * CreateMember( const char * Name );
|
|
bool AddMember( TDataMember * Parent, TDataMember * Member );
|
|
bool DestroyMember( TDataMember ** Member );
|
|
bool DestroyValue( TDataMember * Member );
|
|
|
|
// Find Member
|
|
TDataMember * GetRootMember() { return RootMember; };
|
|
TDataMember ** GetMemberPtr( TDataMember * BaseMember, const char * Path, bool Create, TDataMember ** Parent = NULL );
|
|
|
|
// Set Member value
|
|
bool SetValue( TDataMember * Member, EDataType Type, const char * Value = NULL, int Len = -1 );
|
|
bool SetValuePtr( TDataMember * Member, EDataType Type, char * Value, int Len );
|
|
|
|
public:
|
|
CDataTree();
|
|
~CDataTree();
|
|
|
|
EDataType GetType( TDataMember * BaseMember, const char * Path );
|
|
TDataMember * GetMember( TDataMember * BaseMember, const char * Path, bool Create = false );
|
|
TDataMember * GetFirstChild( TDataMember * BaseMember, const char * Path, bool Create = false );
|
|
|
|
const char * GetStr( TDataMember * BaseMember, const char * Path, const char * Default = NULL, bool Create = false );
|
|
const char * GetStr( TDataMember * BaseMember, const char * Path, int &Len, const char * Default = NULL, bool Create = false );
|
|
const long GetInt( TDataMember * BaseMember, const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL );
|
|
const double GetFloat( TDataMember * BaseMember, const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
|
|
const bool GetBool( TDataMember * BaseMember, const char * Path, bool Default = false, bool Create = false );
|
|
|
|
bool SetObject( TDataMember * BaseMember, const char * Path );
|
|
bool SetArray( TDataMember * BaseMember, const char * Path );
|
|
bool SetStr( TDataMember * BaseMember, const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values
|
|
bool SetInt( TDataMember * BaseMember, const char * Path, const long Value, const char * Mask = NULL );
|
|
bool SetFloat( TDataMember * BaseMember, const char * Path, const double Value, const char * Mask = NULL );
|
|
bool SetBool( TDataMember * BaseMember, const char * Path, const bool Value );
|
|
bool SetNull( TDataMember * BaseMember, const char * Path );
|
|
|
|
bool Delete( TDataMember * BaseMember, const char * Path );
|
|
bool DeleteAll();
|
|
|
|
friend class CJSONparse;
|
|
};
|
|
|
|
#endif /* REDACORE_DATATREECORE_H_ */
|