mirror of
https://github.com/irmen/prog8.git
synced 2025-02-18 05:30:34 +00:00
added \xHH escape character to strings, allow strings of length zero.
This commit is contained in:
parent
a6427e0949
commit
956b0c3fa7
@ -647,7 +647,21 @@ private fun prog8Parser.VardeclContext.toAst(): VarDecl {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun escape(str: String) = str.replace("\t", "\\t").replace("\n", "\\n").replace("\r", "\\r")
|
internal fun escape(str: String): String {
|
||||||
|
val es2 = str.replace("\t", "\\t").replace("\n", "\\n").replace("\r", "\\r")
|
||||||
|
val es = str.map {
|
||||||
|
when(it) {
|
||||||
|
'\t' -> "\\t"
|
||||||
|
'\n' -> "\\n"
|
||||||
|
'\r' -> "\\r"
|
||||||
|
'"' -> "\\\""
|
||||||
|
in '\u8000'..'\u80ff' -> "\\x" + (it.toInt() - 0x8000).toString(16).padStart(2, '0')
|
||||||
|
in '\u0000'..'\u00ff' -> it.toString()
|
||||||
|
else -> "\\u" + it.toInt().toString(16).padStart(4, '0')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return es.joinToString("")
|
||||||
|
}
|
||||||
|
|
||||||
internal fun unescape(str: String, position: Position): String {
|
internal fun unescape(str: String, position: Position): String {
|
||||||
val result = mutableListOf<Char>()
|
val result = mutableListOf<Char>()
|
||||||
@ -664,7 +678,7 @@ internal fun unescape(str: String, position: Position): String {
|
|||||||
'u' -> {
|
'u' -> {
|
||||||
"${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}".toInt(16).toChar()
|
"${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}".toInt(16).toChar()
|
||||||
}
|
}
|
||||||
'$' -> {
|
'x' -> {
|
||||||
// special hack 0x8000..0x80ff will be outputted verbatim without encoding
|
// special hack 0x8000..0x80ff will be outputted verbatim without encoding
|
||||||
val hex = ("" + iter.nextChar() + iter.nextChar()).toInt(16)
|
val hex = ("" + iter.nextChar() + iter.nextChar()).toInt(16)
|
||||||
(0x8000 + hex).toChar()
|
(0x8000 + hex).toChar()
|
||||||
|
@ -143,8 +143,8 @@ internal class AstIdentifiersChecker(private val program: Program, private val e
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visit(string: StringLiteralValue) {
|
override fun visit(string: StringLiteralValue) {
|
||||||
if (string.value.length !in 1..255)
|
if (string.value.length > 255)
|
||||||
errors.err("string literal length must be between 1 and 255", string.position)
|
errors.err("string literal length max is 255", string.position)
|
||||||
|
|
||||||
super.visit(string)
|
super.visit(string)
|
||||||
}
|
}
|
||||||
|
@ -416,7 +416,7 @@ There are several escape sequences available to put special characters into your
|
|||||||
- ``\r`` - carriage return character (more or less the same as newline if printing to the screen)
|
- ``\r`` - carriage return character (more or less the same as newline if printing to the screen)
|
||||||
- ``\"`` - quote character (otherwise it would terminate the string)
|
- ``\"`` - quote character (otherwise it would terminate the string)
|
||||||
- ``\uHHHH`` - a unicode codepoint \u0000 - \uffff (16-bit hexadecimal)
|
- ``\uHHHH`` - a unicode codepoint \u0000 - \uffff (16-bit hexadecimal)
|
||||||
- ``\$HH`` - 8-bit hex value that will be copied verbatim *without encoding*
|
- ``\xHH`` - 8-bit hex value that will be copied verbatim *without encoding*
|
||||||
|
|
||||||
|
|
||||||
Operators
|
Operators
|
||||||
|
Loading…
x
Reference in New Issue
Block a user