136
136
case QTYPE_QSTRING: {
137
137
QString *val = qobject_to_qstring(obj);
140
143
ptr = qstring_get_str(val);
141
144
qstring_append(str, "\"");
143
if ((ptr[0] & 0xE0) == 0xE0 &&
144
(ptr[1] & 0x80) && (ptr[2] & 0x80)) {
148
wchar = (ptr[0] & 0x0F) << 12;
149
wchar |= (ptr[1] & 0x3F) << 6;
150
wchar |= (ptr[2] & 0x3F);
153
snprintf(escape, sizeof(escape), "\\u%04X", wchar);
154
qstring_append(str, escape);
155
} else if ((ptr[0] & 0xE0) == 0xC0 && (ptr[1] & 0x80)) {
159
wchar = (ptr[0] & 0x1F) << 6;
160
wchar |= (ptr[1] & 0x3F);
163
snprintf(escape, sizeof(escape), "\\u%04X", wchar);
164
qstring_append(str, escape);
165
} else switch (ptr[0]) {
167
qstring_append(str, "\\\"");
170
qstring_append(str, "\\\\");
173
qstring_append(str, "\\b");
176
qstring_append(str, "\\f");
179
qstring_append(str, "\\n");
182
qstring_append(str, "\\r");
185
qstring_append(str, "\\t");
188
if (ptr[0] <= 0x1F) {
190
snprintf(escape, sizeof(escape), "\\u%04X", ptr[0]);
191
qstring_append(str, escape);
193
char buf[2] = { ptr[0], 0 };
194
qstring_append(str, buf);
146
for (; *ptr; ptr = end) {
147
cp = mod_utf8_codepoint(ptr, 6, &end);
150
qstring_append(str, "\\\"");
153
qstring_append(str, "\\\\");
156
qstring_append(str, "\\b");
159
qstring_append(str, "\\f");
162
qstring_append(str, "\\n");
165
qstring_append(str, "\\r");
168
qstring_append(str, "\\t");
172
cp = 0xFFFD; /* replacement character */
175
/* beyond BMP; need a surrogate pair */
176
snprintf(buf, sizeof(buf), "\\u%04X\\u%04X",
177
0xD800 + ((cp - 0x10000) >> 10),
178
0xDC00 + ((cp - 0x10000) & 0x3FF));
179
} else if (cp < 0x20 || cp >= 0x7F) {
180
snprintf(buf, sizeof(buf), "\\u%04X", cp);
185
qstring_append(str, buf);
201
189
qstring_append(str, "\"");