11#include "private/qstringconverter_p.h"
12#include "private/qcborvalue_p.h"
13#include "private/qnumeric_p.h"
14#include <private/qtools_p.h>
18Q_CONSTINIT
static int indent = 0;
19#define BEGIN qDebug() << QByteArray(4*indent++, ' ').constData() << "pos=" << current
21#define DEBUG qDebug() << QByteArray(4*indent, ' ').constData()
23#define BEGIN if (1) ; else qDebug()
24#define END do {} while (0)
25#define DEBUG if (1) ; else qDebug()
35#define JSONERR_OK QT_TRANSLATE_NOOP("QJsonParseError", "no error occurred")
36#define JSONERR_UNTERM_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "unterminated object")
37#define JSONERR_MISS_NSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing name separator")
38#define JSONERR_UNTERM_AR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated array")
39#define JSONERR_MISS_VSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing value separator")
40#define JSONERR_ILLEGAL_VAL QT_TRANSLATE_NOOP("QJsonParseError", "illegal value")
41#define JSONERR_END_OF_NUM QT_TRANSLATE_NOOP("QJsonParseError", "invalid termination by number")
42#define JSONERR_ILLEGAL_NUM QT_TRANSLATE_NOOP("QJsonParseError", "illegal number")
43#define JSONERR_STR_ESC_SEQ QT_TRANSLATE_NOOP("QJsonParseError", "invalid escape sequence")
44#define JSONERR_STR_UTF8 QT_TRANSLATE_NOOP("QJsonParseError", "invalid UTF8 string")
45#define JSONERR_UTERM_STR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated string")
46#define JSONERR_MISS_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "object is missing after a comma")
47#define JSONERR_DEEP_NEST QT_TRANSLATE_NOOP("QJsonParseError", "too deeply nested document")
48#define JSONERR_DOC_LARGE QT_TRANSLATE_NOOP("QJsonParseError", "too large document")
49#define JSONERR_GARBAGEEND QT_TRANSLATE_NOOP("QJsonParseError", "garbage at the end of the document")
161#ifndef QT_BOOTSTRAPPED
176 :
type(
type), stashed(
std::move(*container)), current(container)
184 *current = std::move(stashed);
194 : head(json), json(json)
247 if (
end - json > 3 &&
254bool Parser::eatSpace()
259 if (*json !=
Space &&
269char Parser::nextToken()
273 char token = *json++;
297 qDebug(
">>>>> parser begin");
300 char token = nextToken();
340 qDebug(
">>>>> parser error");
344 error->offset = json - head;
345 error->error = lastError;
352template<
typename Iterator,
typename Compare,
typename Assign>
354 Compare
compare, Assign assign)
367 while (++
first != last) {
386 using Value = Forward::value_type;
390 const auto &aKey =
a.key();
391 const auto &bKey =
b.key();
400 return bData ? -1 : 0;
421 auto move = [](Forward::reference
target, Forward::reference
source)
453bool Parser::parseObject()
460 BEGIN <<
"parseObject" << json;
462 char token = nextToken();
496bool Parser::parseMember()
498 BEGIN <<
"parseMember";
502 char token = nextToken();
521bool Parser::parseArray()
523 BEGIN <<
"parseArray";
546 char token = nextToken();
572bool Parser::parseValue()
574 BEGIN <<
"parse Value" << json;
578 if (
end - json < 4) {
582 if (*json++ ==
'u' &&
586 DEBUG <<
"value: null";
593 if (
end - json < 4) {
597 if (*json++ ==
'r' &&
601 DEBUG <<
"value: true";
608 if (
end - json < 5) {
612 if (*json++ ==
'a' &&
617 DEBUG <<
"value: false";
626 DEBUG <<
"value: string";
634 DEBUG <<
"value: array";
642 DEBUG <<
"value: object";
659 DEBUG <<
"value: number";
684bool Parser::parseNumber()
686 BEGIN <<
"parseNumber" << json;
688 const char *
start = json;
692 if (json <
end && *json ==
'-')
696 if (json <
end && *json ==
'0') {
704 if (json <
end && *json ==
'.') {
707 isInt = isInt && *json ==
'0';
713 if (json <
end && (*json ==
'e' || *json ==
'E')) {
716 if (json <
end && (*json ==
'-' || *json ==
'+'))
749 if (convertDoubleTo(
d, &
n))
798 DEBUG <<
"scan escape" << (char)*json;
799 uchar escaped = *json++;
821 for (
int i = 0;
i < 4; ++
i) {
839 const auto *usrc =
reinterpret_cast<const uchar *
>(json);
840 const auto *uend =
reinterpret_cast<const uchar *
>(
end);
846 json =
reinterpret_cast<const char *
>(usrc);
850bool Parser::parseString()
852 const char *
start = json;
856 BEGIN <<
"parse string" << json;
880 DEBUG <<
"end of string";
896 DEBUG <<
"has escape sequences";
905 else if (*json ==
'\\') {
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
const QtCbor::ByteData * byteData(QtCbor::Element e) const
void appendUtf8String(const char *str, qsizetype len)
void appendByteData(const char *data, qsizetype len, QCborValue::Type type, QtCbor::Element::ValueFlags extraFlags={})
static int compareUtf8(const QtCbor::ByteData *b, QLatin1StringView s)
QList< QtCbor::Element > elements
void append(QtCbor::Undefined)
static QCborValue makeValue(QCborValue::Type type, qint64 n, QCborContainerPrivate *d=nullptr, ContainerDisposition disp=CopyContainer)
void appendAsciiString(const QString &s)
\inmodule QtCore\reentrant
Type
This enum represents the QCborValue type.
static constexpr auto fromUcs4(char32_t c) noexcept
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
void reset(T *ptr=nullptr) noexcept
T * data() const noexcept
Returns a pointer to the shared data object.
QCborValue parse(QJsonParseError *error)
qsizetype size() const noexcept
iterator erase(const_iterator begin, const_iterator end)
\macro QT_RESTRICTED_CAST_FROM_ASCII
const QChar * constData() const
Returns a pointer to the data stored in the QString.
qsizetype size() const
Returns the number of characters in this string.
QString & append(QChar c)
StashedContainer(QExplicitlySharedDataPointer< QCborContainerPrivate > *container, QCborValue::Type type)
ObjectIterator< QtCbor::Element, QList< QtCbor::Element >::iterator > KeyIterator
Combined button and popup list for selecting options.
constexpr bool isAsciiDigit(char32_t c) noexcept
constexpr int fromHex(char32_t c) noexcept
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1StringView s) noexcept
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
DBusConnection const char DBusError * error
#define JSONERR_UNTERM_AR
#define JSONERR_MISS_VSEP
#define JSONERR_UNTERM_OBJ
static bool scanEscapeSequence(const char *&json, const char *end, char32_t *ch)
#define JSONERR_ILLEGAL_NUM
#define JSONERR_DOC_LARGE
#define JSONERR_DEEP_NEST
#define JSONERR_UTERM_STR
#define JSONERR_END_OF_NUM
static bool scanUtf8Char(const char *&json, const char *end, char32_t *result)
#define JSONERR_STR_ESC_SEQ
static const int nestingLimit
#define JSONERR_ILLEGAL_VAL
static bool addHexDigit(char digit, char32_t *result)
static void sortContainer(QCborContainerPrivate *container)
#define JSONERR_MISS_NSEP
#define JSONERR_GARBAGEEND
static Iterator customAssigningUniqueLast(Iterator first, Iterator last, Compare compare, Assign assign)
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLsizei GLchar * source
static const uchar utf8bom[]
static int compare(quint64 a, quint64 b)
\inmodule QtCore\reentrant
QString errorString() const
\variable QJsonParseError::error
QStringView asStringView() const
QUtf8StringView asUtf8StringView() const
QCborContainerPrivate * container