summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <mbuland@penny-arcade.com>2019-03-11 11:25:32 -0700
committerMike Buland <mbuland@penny-arcade.com>2019-03-11 11:25:32 -0700
commit33d08f7b68ee57824c135c927bf86ca5fa3444cb (patch)
tree00e6b2a0f9113e1682d4b2ba5533f530f6797b3d
parent252225fa9b2dd3dbc0a3c87bc65ce1f821706e7e (diff)
downloadlibbu++-33d08f7b68ee57824c135c927bf86ca5fa3444cb.tar.gz
libbu++-33d08f7b68ee57824c135c927bf86ca5fa3444cb.tar.bz2
libbu++-33d08f7b68ee57824c135c927bf86ca5fa3444cb.tar.xz
libbu++-33d08f7b68ee57824c135c927bf86ca5fa3444cb.zip
Json parsing fix + new API for copying.
-rw-r--r--src/unstable/json.cpp57
-rw-r--r--src/unstable/json.h4
2 files changed, 61 insertions, 0 deletions
diff --git a/src/unstable/json.cpp b/src/unstable/json.cpp
index 06df9b1..d7e84d9 100644
--- a/src/unstable/json.cpp
+++ b/src/unstable/json.cpp
@@ -81,6 +81,12 @@ Bu::Json::Json( char &c, Bu::Stream &sInput ) :
81 parse( c, sInput ); 81 parse( c, sInput );
82} 82}
83 83
84Bu::Json::Json( const Json &rSrc ) :
85 eType( Invalid )
86{
87 (*this) = rSrc;
88}
89
84Bu::Json::~Json() 90Bu::Json::~Json()
85{ 91{
86 reset(); 92 reset();
@@ -194,6 +200,10 @@ void Bu::Json::insert( const Bu::String &sKey, Bu::Json *pObj )
194{ 200{
195 uDat.pObject->insert( sKey, pObj ); 201 uDat.pObject->insert( sKey, pObj );
196} 202}
203void Bu::Json::insert( const Bu::String &sKey, const Bu::Json &rObj )
204{
205 uDat.pObject->insert( sKey, new Bu::Json( rObj ) );
206}
197 207
198void Bu::Json::insert( const Bu::String &sKey, const Bu::String &sValue ) 208void Bu::Json::insert( const Bu::String &sKey, const Bu::String &sValue )
199{ 209{
@@ -352,6 +362,7 @@ void Bu::Json::reset()
352 break; 362 break;
353 } 363 }
354 uDat.pObject = NULL; 364 uDat.pObject = NULL;
365 eType = Invalid;
355} 366}
356 367
357void Bu::Json::write( Bu::Stream &sOutput ) const 368void Bu::Json::write( Bu::Stream &sOutput ) const
@@ -457,6 +468,51 @@ Bu::String Bu::Json::toStringStable() const
457 return mb.getString(); 468 return mb.getString();
458} 469}
459 470
471Bu::Json &Bu::Json::operator=( const Bu::Json &rSrc )
472{
473 reset();
474
475 eType = rSrc.eType;
476 switch( eType )
477 {
478 case Invalid:
479 case Null:
480 break;
481
482 case String:
483 uDat.pString = new Bu::String( *rSrc.uDat.pString );
484 break;
485
486 case Number:
487 uDat.dNumber = rSrc.uDat.dNumber;
488 break;
489
490 case Boolean:
491 uDat.bBoolean = rSrc.uDat.bBoolean;
492 break;
493
494 case Object:
495 uDat.pObject = new JsonHash();
496 for( JsonHash::const_iterator i = rSrc.uDat.pObject->begin();
497 i; ++i )
498 {
499 uDat.pObject->insert( i.getKey(), new Json( *i.getValue() ) );
500 }
501 break;
502
503 case Array:
504 uDat.pArray = new JsonList();
505 for( JsonList::const_iterator i = rSrc.uDat.pArray->begin();
506 i; ++i )
507 {
508 uDat.pArray->append( new Json( *(*i) ) );
509 }
510 break;
511 }
512
513 return *this;
514}
515
460void Bu::Json::parseString( char &c, Bu::Stream &sInput, Bu::String &sOut ) 516void Bu::Json::parseString( char &c, Bu::Stream &sInput, Bu::String &sOut )
461{ 517{
462 skipWs( c, sInput ); 518 skipWs( c, sInput );
@@ -535,6 +591,7 @@ void Bu::Json::parseObject( char &c, Bu::Stream &sInput )
535 uDat.pObject = new JsonHash(); 591 uDat.pObject = new JsonHash();
536 592
537 next( "object" ); 593 next( "object" );
594 skipWs( c, sInput );
538 595
539 // Check to see if it's an empty object. 596 // Check to see if it's an empty object.
540 if( c == '}' ) 597 if( c == '}' )
diff --git a/src/unstable/json.h b/src/unstable/json.h
index 336f1fd..4c85dd9 100644
--- a/src/unstable/json.h
+++ b/src/unstable/json.h
@@ -41,6 +41,7 @@ namespace Bu
41 Json( bool bValue ); 41 Json( bool bValue );
42 Json( Type eType ); 42 Json( Type eType );
43 Json( Bu::Stream &sInput ); 43 Json( Bu::Stream &sInput );
44 Json( const Json &rSrc );
44 virtual ~Json(); 45 virtual ~Json();
45 46
46 Type getType() const; 47 Type getType() const;
@@ -59,6 +60,7 @@ namespace Bu
59 60
60 bool has( const Bu::String &sKey ) const; 61 bool has( const Bu::String &sKey ) const;
61 void insert( const Bu::String &sKey, Bu::Json *pObj ); 62 void insert( const Bu::String &sKey, Bu::Json *pObj );
63 void insert( const Bu::String &sKey, const Bu::Json &rObj );
62 void insert( const Bu::String &sKey, const Bu::String &sValue ); 64 void insert( const Bu::String &sKey, const Bu::String &sValue );
63 void insert( const Bu::String &sKey, const char *sValue ); 65 void insert( const Bu::String &sKey, const char *sValue );
64 void insert( const Bu::String &sKey, double dValue ); 66 void insert( const Bu::String &sKey, double dValue );
@@ -82,6 +84,8 @@ namespace Bu
82 Bu::String toString() const; 84 Bu::String toString() const;
83 Bu::String toStringStable() const; 85 Bu::String toStringStable() const;
84 86
87 Bu::Json &operator=( const Bu::Json &rSrc );
88
85 private: 89 private:
86 void parse( char &c, Bu::Stream &sInput ); 90 void parse( char &c, Bu::Stream &sInput );
87 void parseString( char &c, Bu::Stream &sInput, Bu::String &sOut ); 91 void parseString( char &c, Bu::Stream &sInput, Bu::String &sOut );