@@ -484,7 +484,7 @@ class NumberToken: public Token
484484};
485485
486486
487- Parser::Parser () : _tokenizer(), _handler( NULL )
487+ Parser::Parser (const Handler::Ptr& pHandler ) : _tokenizer(), _pHandler(pHandler )
488488{
489489 _tokenizer.addToken (new WhitespaceToken ());
490490 _tokenizer.addToken (new InvalidToken ());
@@ -512,7 +512,7 @@ const Token* Parser::nextToken()
512512}
513513
514514
515- void Parser::parse (std::istream& in)
515+ Dynamic::Var Parser::parse (std::istream& in)
516516{
517517 _tokenizer.attachToStream (in);
518518 const Token* token = nextToken ();
@@ -542,24 +542,26 @@ void Parser::parse(std::istream& in)
542542 {
543543 throw JSONException (format (" Invalid token '%s' found. Expecting { or [" , token->asString ()));
544544 }
545+
546+ return result ();
545547}
546548
547549
548550void Parser::readObject ()
549551{
550- if (_handler != NULL )
552+ if (!_pHandler. isNull () )
551553 {
552- _handler ->startObject ();
554+ _pHandler ->startObject ();
553555 }
554556
555557 if ( readRow (true ) ) // First call is special: check for empty object
556558 {
557559 while (readRow ());
558560 }
559561
560- if (_handler != NULL )
562+ if (!_pHandler. isNull () )
561563 {
562- _handler ->endObject ();
564+ _pHandler ->endObject ();
563565 }
564566}
565567
@@ -576,9 +578,9 @@ bool Parser::readRow(bool firstCall)
576578 if (token->tokenClass () == Token::STRING_LITERAL_TOKEN )
577579 {
578580 std::string propertyName = token->tokenString ();
579- if ( _handler != NULL )
581+ if ( !_pHandler. isNull () )
580582 {
581- _handler ->key (propertyName);
583+ _pHandler ->key (propertyName);
582584 }
583585
584586 token = nextToken ();
@@ -594,9 +596,9 @@ bool Parser::readRow(bool firstCall)
594596 {
595597 if (token->asChar () == ' ,' )
596598 {
597- if (_handler != NULL )
599+ if (!_pHandler. isNull () )
598600 {
599- _handler ->comma ();
601+ _pHandler ->comma ();
600602 }
601603 return true ; // Read next row
602604 }
@@ -637,7 +639,7 @@ void Parser::readValue(const Token* token)
637639 break ;
638640
639641 case Token::INTEGER_LITERAL_TOKEN :
640- if (_handler != NULL )
642+ if (!_pHandler. isNull () )
641643 {
642644#if defined(POCO_HAVE_INT64)
643645 try
@@ -647,11 +649,11 @@ void Parser::readValue(const Token* token)
647649 if ( value > std::numeric_limits<int >::max ()
648650 || value < std::numeric_limits<int >::min () )
649651 {
650- _handler ->value (value);
652+ _pHandler ->value (value);
651653 }
652654 else
653655 {
654- _handler ->value (static_cast <int >(value));
656+ _pHandler ->value (static_cast <int >(value));
655657 }
656658 }
657659 // try to handle error as unsigned in case of overflow
@@ -661,11 +663,11 @@ void Parser::readValue(const Token* token)
661663 // if number is 32-bit, then handle as such
662664 if ( value > std::numeric_limits<unsigned >::max () )
663665 {
664- _handler ->value (value);
666+ _pHandler ->value (value);
665667 }
666668 else
667669 {
668- _handler ->value (static_cast <unsigned >(value));
670+ _pHandler ->value (static_cast <unsigned >(value));
669671 }
670672 }
671673#else
@@ -687,23 +689,23 @@ void Parser::readValue(const Token* token)
687689 {
688690 if (token->tokenString ().compare (" null" ) == 0 )
689691 {
690- if (_handler != NULL )
692+ if (!_pHandler. isNull () )
691693 {
692- _handler ->null ();
694+ _pHandler ->null ();
693695 }
694696 }
695697 else if (token->tokenString ().compare (" true" ) == 0 )
696698 {
697- if (_handler != NULL )
699+ if (!_pHandler. isNull () )
698700 {
699- _handler ->value (true );
701+ _pHandler ->value (true );
700702 }
701703 }
702704 else if (token->tokenString ().compare (" false" ) == 0 )
703705 {
704- if (_handler != NULL )
706+ if (!_pHandler. isNull () )
705707 {
706- _handler ->value (false );
708+ _pHandler ->value (false );
707709 }
708710 }
709711 else
@@ -715,15 +717,15 @@ void Parser::readValue(const Token* token)
715717 case Token::FLOAT_LITERAL_TOKEN :
716718 // Fall through
717719 case Token::DOUBLE_LITERAL_TOKEN :
718- if (_handler != NULL )
720+ if (!_pHandler. isNull () )
719721 {
720- _handler ->value (token->asFloat ());
722+ _pHandler ->value (token->asFloat ());
721723 }
722724 break ;
723725 case Token::STRING_LITERAL_TOKEN :
724- if (_handler != NULL )
726+ if (!_pHandler. isNull () )
725727 {
726- _handler ->value (token->tokenString ());
728+ _pHandler ->value (token->tokenString ());
727729 }
728730 break ;
729731 case Token::SEPARATOR_TOKEN :
@@ -746,19 +748,19 @@ void Parser::readValue(const Token* token)
746748
747749void Parser::readArray ()
748750{
749- if (_handler != NULL )
751+ if (!_pHandler. isNull () )
750752 {
751- _handler ->startArray ();
753+ _pHandler ->startArray ();
752754 }
753755
754756 if (readElements (true )) // First call is special: check for empty array
755757 {
756758 while (readElements ());
757759 }
758760
759- if (_handler != NULL )
761+ if (!_pHandler. isNull () )
760762 {
761- _handler ->endArray ();
763+ _pHandler ->endArray ();
762764 }
763765}
764766
@@ -784,9 +786,9 @@ bool Parser::readElements(bool firstCall)
784786
785787 if (token->asChar () == ' ,' )
786788 {
787- if (_handler != NULL )
789+ if (!_pHandler. isNull () )
788790 {
789- _handler ->comma ();
791+ _pHandler ->comma ();
790792 }
791793 return true ;
792794 }
0 commit comments