From 9fa66850719ba450f27a6789ff912685e77f4ee6 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Mon, 12 Jun 2023 21:01:26 +0100 Subject: [PATCH] Add escaping to $ operator for Symbol --- preserves.nimble | 2 +- src/preserves.nim | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/preserves.nimble b/preserves.nimble index 336760e..a75fd09 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "20230611" +version = "20230612" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves.nim b/src/preserves.nim index a788589..4f2e09a 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -33,7 +33,33 @@ proc hash*(s: Symbol): Hash {.borrow.} proc len*(s: Symbol): int {.borrow.} proc `$`*(s: Symbol): string = - if s.len == 0: "||" else: string(s) + let sym = string s + if sym.len > 0 and sym.string[0] in {'A'..'z'} and not sym.anyIt(char(it) in { '\x00'..'\x19', '"', '\\', '|' }): + result = string sym + else: + result = newStringOfCap(sym.len shl 1) + result.add('|') + for c in sym.string: + case c + of '\\': + result.add("\\\\") + of '/': + result.add("\\/") + of '\x08': + result.add("\\b") + of '\x0c': + result.add("\\f") + of '\x0a': + result.add("\\n") + of '\x0d': + result.add("\\r") + of '\x09': + result.add("\\t") + of '|': + result.add("\\|") + else: + result.add(c) + result.add('|') type Preserve*[E] = object