11#include "private/qstringconverter_p.h"
12#include "private/qcborvalue_p.h"
13#include "private/qnumeric_p.h"
14#include <private/qtools_p.h>
18# error currently broken after `current` was moved to StashedContainer
19Q_CONSTINIT
static int indent = 0;
20# define QT_PARSER_TRACING_BEGIN \
21 qDebug() << QByteArray(4 * indent++, ' ').constData() << "pos=" << current
22# define QT_PARSER_TRACING_END --indent
23# define QT_PARSER_TRACING_DEBUG qDebug() << QByteArray(4 * indent, ' ').constData()
25# define QT_PARSER_TRACING_BEGIN QT_NO_QDEBUG_MACRO()
26# define QT_PARSER_TRACING_END \
29# define QT_PARSER_TRACING_DEBUG QT_NO_QDEBUG_MACRO()
39#define JSONERR_OK QT_TRANSLATE_NOOP("QJsonParseError", "no error occurred")
40#define JSONERR_UNTERM_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "unterminated object")
41#define JSONERR_MISS_NSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing name separator")
42#define JSONERR_UNTERM_AR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated array")
43#define JSONERR_MISS_VSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing value separator")
44#define JSONERR_ILLEGAL_VAL QT_TRANSLATE_NOOP("QJsonParseError", "illegal value")
45#define JSONERR_END_OF_NUM QT_TRANSLATE_NOOP("QJsonParseError", "invalid termination by number")
46#define JSONERR_ILLEGAL_NUM QT_TRANSLATE_NOOP("QJsonParseError", "illegal number")
47#define JSONERR_STR_ESC_SEQ QT_TRANSLATE_NOOP("QJsonParseError", "invalid escape sequence")
48#define JSONERR_STR_UTF8 QT_TRANSLATE_NOOP("QJsonParseError", "invalid UTF8 string")
49#define JSONERR_UTERM_STR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated string")
50#define JSONERR_MISS_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "object is missing after a comma")
51#define JSONERR_DEEP_NEST QT_TRANSLATE_NOOP("QJsonParseError", "too deeply nested document")
52#define JSONERR_DOC_LARGE QT_TRANSLATE_NOOP("QJsonParseError", "too large document")
53#define JSONERR_GARBAGEEND QT_TRANSLATE_NOOP("QJsonParseError", "garbage at the end of the document")
165#ifndef QT_BOOTSTRAPPED
180 :
type(
type), stashed(
std::move(*container)), current(container)
188 *current = std::move(stashed);
193 QExplicitlySharedDataPointer<QCborContainerPrivate> stashed;
194 QExplicitlySharedDataPointer<QCborContainerPrivate> *current;
198 :
head(json), json(json)
251 if (
end - json > 3 &&
258bool Parser::eatSpace()
263 if (*json !=
Space &&
273char Parser::nextToken()
277 char token = *json++;
301 qDebug(
">>>>> parser begin");
304 char token = nextToken();
344 qDebug(
">>>>> parser error");
348 error->offset = json - head;
349 error->error = lastError;
356template<
typename Iterator,
typename Compare,
typename Assign>
371 while (++
first != last) {
390 using Value = Forward::value_type;
394 const auto &aKey =
a.key();
395 const auto &bKey =
b.key();
397 Q_ASSERT(aKey.flags & QtCbor::Element::HasByteData);
398 Q_ASSERT(bKey.flags & QtCbor::Element::HasByteData);
404 return bData ? -1 : 0;
411 if (aKey.flags & QtCbor::Element::StringIsUtf16) {
412 if (bKey.flags & QtCbor::Element::StringIsUtf16)
417 if (bKey.flags & QtCbor::Element::StringIsUtf16)
425 auto move = [](Forward::reference
target, Forward::reference
source)
430 if (targetValue.
flags & QtCbor::Element::IsContainer)
457bool Parser::parseObject()
466 char token = nextToken();
500bool Parser::parseMember()
506 char token = nextToken();
525bool Parser::parseArray()
550 char token = nextToken();
576bool Parser::parseValue()
582 if (
end - json < 4) {
586 if (*json++ ==
'u' &&
597 if (
end - json < 4) {
601 if (*json++ ==
'r' &&
612 if (
end - json < 5) {
616 if (*json++ ==
'a' &&
688bool Parser::parseNumber()
692 const char *
start = json;
696 if (json <
end && *json ==
'-')
700 if (json <
end && *json ==
'0') {
708 if (json <
end && *json ==
'.') {
711 isInt = isInt && *json ==
'0';
717 if (json <
end && (*json ==
'e' || *json ==
'E')) {
720 if (json <
end && (*json ==
'-' || *json ==
'+'))
753 if (convertDoubleTo(
d, &
n))
803 uchar escaped = *json++;
825 for (
int i = 0;
i < 4; ++
i) {
843 const auto *usrc =
reinterpret_cast<const uchar *
>(json);
844 const auto *uend =
reinterpret_cast<const uchar *
>(
end);
850 json =
reinterpret_cast<const char *
>(usrc);
854bool Parser::parseString()
856 const char *
start = json;
909 else if (*json ==
'\\') {
937#undef QT_PARSER_TRACING_BEGIN
938#undef QT_PARSER_TRACING_END
939#undef QT_PARSER_TRACING_DEBUG
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 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 noexcept
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 QT_PARSER_TRACING_BEGIN
#define JSONERR_MISS_VSEP
#define JSONERR_UNTERM_OBJ
static bool scanEscapeSequence(const char *&json, const char *end, char32_t *ch)
#define QT_PARSER_TRACING_END
#define JSONERR_ILLEGAL_NUM
#define JSONERR_DOC_LARGE
#define JSONERR_DEEP_NEST
#define QT_PARSER_TRACING_DEBUG
#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)
QCborValue(QCborTag(2), QByteArray("\x01\0\0\0\0\0\0\0\0", 9))
[0]
manager head(request, this, [this](QRestReply &reply) { if(reply.isSuccess()) })
[6]
\inmodule QtCore\reentrant
QString errorString() const
\variable QJsonParseError::error
QStringView asStringView() const
QUtf8StringView asUtf8StringView() const
QCborContainerPrivate * container