blob: 99aed338eeea30910b1222730027384180d89fa1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/*
* Copyright 2017-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.serialization.json.internal
import kotlin.native.concurrent.*
private fun toHexChar(i: Int) : Char {
val d = i and 0xf
return if (d < 10) (d + '0'.code).toChar()
else (d - 10 + 'a'.code).toChar()
}
@SharedImmutable
internal val ESCAPE_STRINGS: Array<String?> = arrayOfNulls<String>(93).apply {
for (c in 0..0x1f) {
val c1 = toHexChar(c shr 12)
val c2 = toHexChar(c shr 8)
val c3 = toHexChar(c shr 4)
val c4 = toHexChar(c)
this[c] = "\\u$c1$c2$c3$c4"
}
this['"'.code] = "\\\""
this['\\'.code] = "\\\\"
this['\t'.code] = "\\t"
this['\b'.code] = "\\b"
this['\n'.code] = "\\n"
this['\r'.code] = "\\r"
this[0x0c] = "\\f"
}
@SharedImmutable
internal val ESCAPE_MARKERS: ByteArray = ByteArray(93).apply {
for (c in 0..0x1f) {
this[c] = 1.toByte()
}
this['"'.code] = '"'.code.toByte()
this['\\'.code] = '\\'.code.toByte()
this['\t'.code] = 't'.code.toByte()
this['\b'.code] = 'b'.code.toByte()
this['\n'.code] = 'n'.code.toByte()
this['\r'.code] = 'r'.code.toByte()
this[0x0c] = 'f'.code.toByte()
}
internal fun StringBuilder.printQuoted(value: String) {
append(STRING)
var lastPos = 0
for (i in value.indices) {
val c = value[i].code
if (c < ESCAPE_STRINGS.size && ESCAPE_STRINGS[c] != null) {
append(value, lastPos, i) // flush prev
append(ESCAPE_STRINGS[c])
lastPos = i + 1
}
}
if (lastPos != 0) append(value, lastPos, value.length)
else append(value)
append(STRING)
}
/**
* Returns `true` if the contents of this string is equal to the word "true", ignoring case, `false` if content equals "false",
* and returns `null` otherwise.
*/
internal fun String.toBooleanStrictOrNull(): Boolean? = when {
this.equals("true", ignoreCase = true) -> true
this.equals("false", ignoreCase = true) -> false
else -> null
}
|