1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-02-23 13:17:14 +01:00
2021-08-22 18:07:06 +03:00

194 lines
3.7 KiB
C++

//
// Parser.h
//
// Library: JSON
// Package: JSON
// Module: ParserImpl
//
// Definition of the ParserImpl class.
//
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier: BSL-1.0
//
#ifndef JSON_JSONParserImpl_INCLUDED
#define JSON_JSONParserImpl_INCLUDED
#include "Poco/JSON/JSON.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Array.h"
#include "Poco/JSON/ParseHandler.h"
#include "Poco/JSON/JSONException.h"
#include "Poco/UTF8Encoding.h"
#include "Poco/Dynamic/Var.h"
#include <string>
struct json_stream;
namespace Poco {
namespace JSON {
class JSON_API ParserImpl
{
protected:
static const std::size_t JSON_DEFAULT_DEPTH = 128;
ParserImpl(const Handler::Ptr& pHandler = new ParseHandler);
/// Creates JSON ParserImpl, using the given Handler and buffer size.
virtual ~ParserImpl();
/// Destroys JSON ParserImpl.
void resetImpl();
/// Resets the parser.
void setAllowCommentsImpl(bool comments);
/// Allow or disallow comments. By default, comments are not allowed.
bool getAllowCommentsImpl() const;
/// Returns true if comments are allowed, false otherwise.
///
/// By default, comments are not allowed.
void setAllowNullByteImpl(bool nullByte);
/// Allow or disallow null byte in strings.
///
/// By default, null byte is allowed.
bool getAllowNullByteImpl() const;
/// Returns true if null byte is allowed, false otherwise.
///
/// By default, null bytes are allowed.
void setDepthImpl(std::size_t depth);
/// Sets the allowed JSON depth.
std::size_t getDepthImpl() const;
/// Returns the allowed JSON depth.
Dynamic::Var parseImpl(const std::string& json);
/// Parses JSON from a string.
Dynamic::Var parseImpl(std::istream& in);
/// Parses JSON from an input stream.
void setHandlerImpl(const Handler::Ptr& pHandler);
/// Set the Handler.
const Handler::Ptr& getHandlerImpl();
/// Returns the Handler.
Dynamic::Var asVarImpl() const;
/// Returns the result of parsing;
Dynamic::Var resultImpl() const;
/// Returns the result of parsing as Dynamic::Var;
private:
ParserImpl(const ParserImpl&);
ParserImpl& operator =(const ParserImpl&);
void handleArray();
void handleObject();
void handle();
void handle(const std::string& json);
void handle(std::istream& json);
void stripComments(std::string& json);
bool checkError();
struct json_stream* _pJSON;
Handler::Ptr _pHandler;
std::size_t _depth;
char _decimalPoint;
bool _allowNullByte;
bool _allowComments;
};
//
// inlines
//
inline void ParserImpl::resetImpl()
{
// currently, json stream is opened and closed on every parse request
// (perhaps there is some optimization room?)
//json_reset(&_json);
if (_pHandler) _pHandler->reset();
}
inline void ParserImpl::setAllowCommentsImpl(bool comments)
{
_allowComments = comments;
}
inline bool ParserImpl::getAllowCommentsImpl() const
{
return _allowComments;
}
inline void ParserImpl::setAllowNullByteImpl(bool nullByte)
{
_allowNullByte = nullByte;
}
inline bool ParserImpl::getAllowNullByteImpl() const
{
return _allowNullByte;
}
inline void ParserImpl::setDepthImpl(std::size_t depth)
{
_depth = static_cast<int>(depth);
}
inline std::size_t ParserImpl::getDepthImpl() const
{
return static_cast<int>(_depth);
}
inline void ParserImpl::setHandlerImpl(const Handler::Ptr& pHandler)
{
_pHandler = pHandler;
}
inline const Handler::Ptr& ParserImpl::getHandlerImpl()
{
return _pHandler;
}
inline Dynamic::Var ParserImpl::resultImpl() const
{
return asVarImpl();
}
inline Dynamic::Var ParserImpl::asVarImpl() const
{
if (_pHandler) return _pHandler->asVar();
return Dynamic::Var();
}
} } // namespace Poco::JSON
#endif // JSON_JSONParserImpl_INCLUDED