json/qjsonwriter.cpp

Source codeSwitch to Preprocessed file
LineSource CodeCoverage
1/**************************************************************************** -
2** -
3** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -
4** Contact: http://www.qt-project.org/legal -
5** -
6** This file is part of the QtCore module of the Qt Toolkit. -
7** -
8** $QT_BEGIN_LICENSE:LGPL$ -
9** Commercial License Usage -
10** Licensees holding valid commercial Qt licenses may use this file in -
11** accordance with the commercial license agreement provided with the -
12** Software or, alternatively, in accordance with the terms contained in -
13** a written agreement between you and Digia. For licensing terms and -
14** conditions see http://qt.digia.com/licensing. For further information -
15** use the contact form at http://qt.digia.com/contact-us. -
16** -
17** GNU Lesser General Public License Usage -
18** Alternatively, this file may be used under the terms of the GNU Lesser -
19** General Public License version 2.1 as published by the Free Software -
20** Foundation and appearing in the file LICENSE.LGPL included in the -
21** packaging of this file. Please review the following information to -
22** ensure the GNU Lesser General Public License version 2.1 requirements -
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -
24** -
25** In addition, as a special exception, Digia gives you certain additional -
26** rights. These rights are described in the Digia Qt LGPL Exception -
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -
28** -
29** GNU General Public License Usage -
30** Alternatively, this file may be used under the terms of the GNU -
31** General Public License version 3.0 as published by the Free Software -
32** Foundation and appearing in the file LICENSE.GPL included in the -
33** packaging of this file. Please review the following information to -
34** ensure the GNU General Public License version 3.0 requirements will be -
35** met: http://www.gnu.org/copyleft/gpl.html. -
36** -
37** -
38** $QT_END_LICENSE$ -
39** -
40****************************************************************************/ -
41 -
42#include "qjsonwriter_p.h" -
43#include "qjson_p.h" -
44 -
45QT_BEGIN_NAMESPACE -
46 -
47using namespace QJsonPrivate; -
48 -
49static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact); -
50static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact); -
51 -
52static inline uchar hexdig(uint u) -
53{ -
54 return (u < 0xa ? '0' + u : 'a' + u - 0xa);
executed: return (u < 0xa ? '0' + u : 'a' + u - 0xa);
Execution Count:10542
10542
55} -
56 -
57static QByteArray escapedString(const QString &s) -
58{ -
59 const uchar replacement = '?';
executed (the execution status of this line is deduced): const uchar replacement = '?';
-
60 QByteArray ba(s.length(), Qt::Uninitialized);
executed (the execution status of this line is deduced): QByteArray ba(s.length(), Qt::Uninitialized);
-
61 -
62 uchar *cursor = (uchar *)ba.data();
executed (the execution status of this line is deduced): uchar *cursor = (uchar *)ba.data();
-
63 const uchar *ba_end = cursor + ba.length();
executed (the execution status of this line is deduced): const uchar *ba_end = cursor + ba.length();
-
64 -
65 const QChar *ch = (const QChar *)s.constData();
executed (the execution status of this line is deduced): const QChar *ch = (const QChar *)s.constData();
-
66 const QChar *end = ch + s.length();
executed (the execution status of this line is deduced): const QChar *end = ch + s.length();
-
67 -
68 int surrogate_high = -1;
executed (the execution status of this line is deduced): int surrogate_high = -1;
-
69 -
70 while (ch < end) {
evaluated: ch < end
TRUEFALSE
yes
Evaluation Count:27278864
yes
Evaluation Count:1332760
1332760-27278864
71 if (cursor >= ba_end - 6) {
evaluated: cursor >= ba_end - 6
TRUEFALSE
yes
Evaluation Count:1996087
yes
Evaluation Count:25282777
1996087-25282777
72 // ensure we have enough space -
73 int pos = cursor - (const uchar *)ba.constData();
executed (the execution status of this line is deduced): int pos = cursor - (const uchar *)ba.constData();
-
74 ba.resize(ba.size()*2);
executed (the execution status of this line is deduced): ba.resize(ba.size()*2);
-
75 cursor = (uchar *)ba.data() + pos;
executed (the execution status of this line is deduced): cursor = (uchar *)ba.data() + pos;
-
76 ba_end = (const uchar *)ba.constData() + ba.length();
executed (the execution status of this line is deduced): ba_end = (const uchar *)ba.constData() + ba.length();
-
77 }
executed: }
Execution Count:1996087
1996087
78 -
79 uint u = ch->unicode();
executed (the execution status of this line is deduced): uint u = ch->unicode();
-
80 if (surrogate_high >= 0) {
partially evaluated: surrogate_high >= 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:27278864
0-27278864
81 if (ch->isLowSurrogate()) {
never evaluated: ch->isLowSurrogate()
0
82 u = QChar::surrogateToUcs4(surrogate_high, u);
never executed (the execution status of this line is deduced): u = QChar::surrogateToUcs4(surrogate_high, u);
-
83 surrogate_high = -1;
never executed (the execution status of this line is deduced): surrogate_high = -1;
-
84 } else {
never executed: }
0
85 // high surrogate without low -
86 *cursor = replacement;
never executed (the execution status of this line is deduced): *cursor = replacement;
-
87 ++ch;
never executed (the execution status of this line is deduced): ++ch;
-
88 surrogate_high = -1;
never executed (the execution status of this line is deduced): surrogate_high = -1;
-
89 continue;
never executed: continue;
0
90 } -
91 } else if (ch->isLowSurrogate()) {
partially evaluated: ch->isLowSurrogate()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:27278864
0-27278864
92 // low surrogate without high -
93 *cursor = replacement;
never executed (the execution status of this line is deduced): *cursor = replacement;
-
94 ++ch;
never executed (the execution status of this line is deduced): ++ch;
-
95 continue;
never executed: continue;
0
96 } else if (ch->isHighSurrogate()) {
partially evaluated: ch->isHighSurrogate()
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:27278864
0-27278864
97 surrogate_high = u;
never executed (the execution status of this line is deduced): surrogate_high = u;
-
98 ++ch;
never executed (the execution status of this line is deduced): ++ch;
-
99 continue;
never executed: continue;
0
100 } -
101 -
102 if (u < 0x80) {
evaluated: u < 0x80
TRUEFALSE
yes
Evaluation Count:27262928
yes
Evaluation Count:15936
15936-27262928
103 if (u < 0x20 || u == 0x22 || u == 0x5c) {
evaluated: u < 0x20
TRUEFALSE
yes
Evaluation Count:12955
yes
Evaluation Count:27249973
evaluated: u == 0x22
TRUEFALSE
yes
Evaluation Count:5208
yes
Evaluation Count:27244765
evaluated: u == 0x5c
TRUEFALSE
yes
Evaluation Count:751
yes
Evaluation Count:27244014
751-27249973
104 *cursor++ = '\\';
executed (the execution status of this line is deduced): *cursor++ = '\\';
-
105 switch (u) { -
106 case 0x22: -
107 *cursor++ = '"';
executed (the execution status of this line is deduced): *cursor++ = '"';
-
108 break;
executed: break;
Execution Count:5208
5208
109 case 0x5c: -
110 *cursor++ = '\\';
executed (the execution status of this line is deduced): *cursor++ = '\\';
-
111 break;
executed: break;
Execution Count:751
751
112 case 0x8: -
113 *cursor++ = 'b';
executed (the execution status of this line is deduced): *cursor++ = 'b';
-
114 break;
executed: break;
Execution Count:1525
1525
115 case 0xc: -
116 *cursor++ = 'f';
executed (the execution status of this line is deduced): *cursor++ = 'f';
-
117 break;
executed: break;
Execution Count:1564
1564
118 case 0xa: -
119 *cursor++ = 'n';
executed (the execution status of this line is deduced): *cursor++ = 'n';
-
120 break;
executed: break;
Execution Count:1547
1547
121 case 0xd: -
122 *cursor++ = 'r';
executed (the execution status of this line is deduced): *cursor++ = 'r';
-
123 break;
executed: break;
Execution Count:1536
1536
124 case 0x9: -
125 *cursor++ = 't';
executed (the execution status of this line is deduced): *cursor++ = 't';
-
126 break;
executed: break;
Execution Count:1512
1512
127 default: -
128 *cursor++ = 'u';
executed (the execution status of this line is deduced): *cursor++ = 'u';
-
129 *cursor++ = '0';
executed (the execution status of this line is deduced): *cursor++ = '0';
-
130 *cursor++ = '0';
executed (the execution status of this line is deduced): *cursor++ = '0';
-
131 *cursor++ = hexdig(u>>4);
executed (the execution status of this line is deduced): *cursor++ = hexdig(u>>4);
-
132 *cursor++ = hexdig(u & 0xf);
executed (the execution status of this line is deduced): *cursor++ = hexdig(u & 0xf);
-
133 }
executed: }
Execution Count:5271
5271
134 } else {
executed: }
Execution Count:18914
18914
135 *cursor++ = (uchar)u;
executed (the execution status of this line is deduced): *cursor++ = (uchar)u;
-
136 }
executed: }
Execution Count:27244014
27244014
137 } else { -
138 if (u < 0x0800) {
evaluated: u < 0x0800
TRUEFALSE
yes
Evaluation Count:7737
yes
Evaluation Count:8199
7737-8199
139 *cursor++ = 0xc0 | ((uchar) (u >> 6));
executed (the execution status of this line is deduced): *cursor++ = 0xc0 | ((uchar) (u >> 6));
-
140 } else {
executed: }
Execution Count:7737
7737
141 // is it one of the Unicode non-characters? -
142 if (QChar::isNonCharacter(u)) {
partially evaluated: QChar::isNonCharacter(u)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:8199
0-8199
143 *cursor++ = replacement;
never executed (the execution status of this line is deduced): *cursor++ = replacement;
-
144 ++ch;
never executed (the execution status of this line is deduced): ++ch;
-
145 continue;
never executed: continue;
0
146 } -
147 -
148 if (QChar::requiresSurrogates(u)) {
partially evaluated: QChar::requiresSurrogates(u)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:8199
0-8199
149 *cursor++ = 0xf0 | ((uchar) (u >> 18));
never executed (the execution status of this line is deduced): *cursor++ = 0xf0 | ((uchar) (u >> 18));
-
150 *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f);
never executed (the execution status of this line is deduced): *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f);
-
151 } else {
never executed: }
0
152 *cursor++ = 0xe0 | (((uchar) (u >> 12)) & 0x3f);
executed (the execution status of this line is deduced): *cursor++ = 0xe0 | (((uchar) (u >> 12)) & 0x3f);
-
153 }
executed: }
Execution Count:8199
8199
154 *cursor++ = 0x80 | (((uchar) (u >> 6)) & 0x3f);
executed (the execution status of this line is deduced): *cursor++ = 0x80 | (((uchar) (u >> 6)) & 0x3f);
-
155 }
executed: }
Execution Count:8199
8199
156 *cursor++ = 0x80 | ((uchar) (u&0x3f));
executed (the execution status of this line is deduced): *cursor++ = 0x80 | ((uchar) (u&0x3f));
-
157 }
executed: }
Execution Count:15936
15936
158 ++ch;
executed (the execution status of this line is deduced): ++ch;
-
159 }
executed: }
Execution Count:27278864
27278864
160 -
161 ba.resize(cursor - (const uchar *)ba.constData());
executed (the execution status of this line is deduced): ba.resize(cursor - (const uchar *)ba.constData());
-
162 return ba;
executed: return ba;
Execution Count:1332760
1332760
163} -
164 -
165static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &v, QByteArray &json, int indent, bool compact) -
166{ -
167 QJsonValue::Type type = (QJsonValue::Type)(uint)v.type;
executed (the execution status of this line is deduced): QJsonValue::Type type = (QJsonValue::Type)(uint)v.type;
-
168 switch (type) { -
169 case QJsonValue::Bool: -
170 json += v.toBoolean() ? "true" : "false";
evaluated: v.toBoolean()
TRUEFALSE
yes
Evaluation Count:1477
yes
Evaluation Count:1466
1466-1477
171 break;
executed: break;
Execution Count:2943
2943
172 case QJsonValue::Double: -
173 json += QByteArray::number(v.toDouble(b));
executed (the execution status of this line is deduced): json += QByteArray::number(v.toDouble(b));
-
174 break;
executed: break;
Execution Count:450215
450215
175 case QJsonValue::String: -
176 json += '"';
executed (the execution status of this line is deduced): json += '"';
-
177 json += escapedString(v.toString(b));
executed (the execution status of this line is deduced): json += escapedString(v.toString(b));
-
178 json += '"';
executed (the execution status of this line is deduced): json += '"';
-
179 break;
executed: break;
Execution Count:349688
349688
180 case QJsonValue::Array: -
181 json += compact ? "[" : "[\n";
partially evaluated: compact
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:36437
0-36437
182 arrayContentToJson(static_cast<QJsonPrivate::Array *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
executed (the execution status of this line is deduced): arrayContentToJson(static_cast<QJsonPrivate::Array *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
-
183 json += QByteArray(4*indent, ' ');
executed (the execution status of this line is deduced): json += QByteArray(4*indent, ' ');
-
184 json += "]";
executed (the execution status of this line is deduced): json += "]";
-
185 break;
executed: break;
Execution Count:36437
36437
186 case QJsonValue::Object: -
187 json += compact ? "{" : "{\n";
partially evaluated: compact
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:319522
0-319522
188 objectContentToJson(static_cast<QJsonPrivate::Object *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
executed (the execution status of this line is deduced): objectContentToJson(static_cast<QJsonPrivate::Object *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
-
189 json += QByteArray(4*indent, ' ');
executed (the execution status of this line is deduced): json += QByteArray(4*indent, ' ');
-
190 json += "}";
executed (the execution status of this line is deduced): json += "}";
-
191 break;
executed: break;
Execution Count:319522
319522
192 case QJsonValue::Null: -
193 default: -
194 json += "null";
executed (the execution status of this line is deduced): json += "null";
-
195 }
executed: }
Execution Count:1538
1538
196}
executed: }
Execution Count:1160343
1160343
197 -
198static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact) -
199{ -
200 if (!a || !a->length)
partially evaluated: !a
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:37193
evaluated: !a->length
TRUEFALSE
yes
Evaluation Count:1470
yes
Evaluation Count:35723
0-37193
201 return;
executed: return;
Execution Count:1470
1470
202 -
203 QByteArray indentString(4*indent, ' ');
executed (the execution status of this line is deduced): QByteArray indentString(4*indent, ' ');
-
204 -
205 uint i = 0;
executed (the execution status of this line is deduced): uint i = 0;
-
206 while (1) {
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:177271
no
Evaluation Count:0
0-177271
207 json += indentString;
executed (the execution status of this line is deduced): json += indentString;
-
208 valueToJson(a, a->at(i), json, indent, compact);
executed (the execution status of this line is deduced): valueToJson(a, a->at(i), json, indent, compact);
-
209 -
210 if (++i == a->length) {
evaluated: ++i == a->length
TRUEFALSE
yes
Evaluation Count:35723
yes
Evaluation Count:141548
35723-141548
211 if (!compact)
evaluated: !compact
TRUEFALSE
yes
Evaluation Count:35720
yes
Evaluation Count:3
3-35720
212 json += '\n';
executed: json += '\n';
Execution Count:35720
35720
213 break;
executed: break;
Execution Count:35723
35723
214 } -
215 -
216 json += compact ? "," : ",\n";
evaluated: compact
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:141545
3-141545
217 }
executed: }
Execution Count:141548
141548
218}
executed: }
Execution Count:35723
35723
219 -
220 -
221static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact) -
222{ -
223 if (!o || !o->length)
partially evaluated: !o
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:319956
evaluated: !o->length
TRUEFALSE
yes
Evaluation Count:1470
yes
Evaluation Count:318486
0-319956
224 return;
executed: return;
Execution Count:1470
1470
225 -
226 QByteArray indentString(4*indent, ' ');
executed (the execution status of this line is deduced): QByteArray indentString(4*indent, ' ');
-
227 -
228 uint i = 0;
executed (the execution status of this line is deduced): uint i = 0;
-
229 while (1) {
partially evaluated: 1
TRUEFALSE
yes
Evaluation Count:983072
no
Evaluation Count:0
0-983072
230 QJsonPrivate::Entry *e = o->entryAt(i);
executed (the execution status of this line is deduced): QJsonPrivate::Entry *e = o->entryAt(i);
-
231 json += indentString;
executed (the execution status of this line is deduced): json += indentString;
-
232 json += '"';
executed (the execution status of this line is deduced): json += '"';
-
233 json += escapedString(e->key());
executed (the execution status of this line is deduced): json += escapedString(e->key());
-
234 json += "\": ";
executed (the execution status of this line is deduced): json += "\": ";
-
235 valueToJson(o, e->value, json, indent, compact);
executed (the execution status of this line is deduced): valueToJson(o, e->value, json, indent, compact);
-
236 -
237 if (++i == o->length) {
evaluated: ++i == o->length
TRUEFALSE
yes
Evaluation Count:318486
yes
Evaluation Count:664586
318486-664586
238 if (!compact)
evaluated: !compact
TRUEFALSE
yes
Evaluation Count:318483
yes
Evaluation Count:3
3-318483
239 json += '\n';
executed: json += '\n';
Execution Count:318483
318483
240 break;
executed: break;
Execution Count:318486
318486
241 } -
242 -
243 json += compact ? "," : ",\n";
partially evaluated: compact
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:664586
0-664586
244 }
executed: }
Execution Count:664586
664586
245}
executed: }
Execution Count:318486
318486
246 -
247void Writer::objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact) -
248{ -
249 json.reserve(json.size() + (o ? (int)o->size : 16));
executed (the execution status of this line is deduced): json.reserve(json.size() + (o ? (int)o->size : 16));
-
250 json += compact ? "{" : "{\n";
evaluated: compact
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:431
3-431
251 objectContentToJson(o, json, indent + (compact ? 0 : 1), compact);
executed (the execution status of this line is deduced): objectContentToJson(o, json, indent + (compact ? 0 : 1), compact);
-
252 json += QByteArray(4*indent, ' ');
executed (the execution status of this line is deduced): json += QByteArray(4*indent, ' ');
-
253 json += compact ? "}" : "}\n";
evaluated: compact
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:431
3-431
254}
executed: }
Execution Count:434
434
255 -
256void Writer::arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact) -
257{ -
258 json.reserve(json.size() + (a ? (int)a->size : 16));
executed (the execution status of this line is deduced): json.reserve(json.size() + (a ? (int)a->size : 16));
-
259 json += compact ? "[" : "[\n";
evaluated: compact
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:753
3-753
260 arrayContentToJson(a, json, indent + (compact ? 0 : 1), compact);
executed (the execution status of this line is deduced): arrayContentToJson(a, json, indent + (compact ? 0 : 1), compact);
-
261 json += QByteArray(4*indent, ' ');
executed (the execution status of this line is deduced): json += QByteArray(4*indent, ' ');
-
262 json += compact ? "]" : "]\n";
evaluated: compact
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:753
3-753
263}
executed: }
Execution Count:756
756
264 -
265QT_END_NAMESPACE -
266 -
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial