From e73fcefe8fa80f8674710a0d42186a52381fb1df Mon Sep 17 00:00:00 2001 From: Dov Murik Date: Wed, 27 Sep 2017 07:02:07 +0000 Subject: [PATCH] Fix unescaping in rexx, skew, vimscript --- rexx/reader.rexx | 3 ++- skew/reader.sk | 2 +- vimscript/reader.vim | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/rexx/reader.rexx b/rexx/reader.rexx index 3afc8620..3b992f96 100644 --- a/rexx/reader.rexx +++ b/rexx/reader.rexx @@ -95,9 +95,10 @@ is_number: procedure /* is_number(token) */ parse_string: procedure /* parse_string(token) */ token = arg(1) res = substr(token, 2, length(token) - 2) /* Remove quotes */ + res = changestr("\\", res, '01'x) res = changestr("\n", res, '0A'x) res = changestr('\"', res, '"') - res = changestr("\\", res, '5C'x) + res = changestr('01'x, res, '5C'x) return res parse_keyword: procedure /* parse_keyword(token) */ diff --git a/skew/reader.sk b/skew/reader.sk index 457e8886..0aa723ba 100644 --- a/skew/reader.sk +++ b/skew/reader.sk @@ -30,7 +30,7 @@ def tokenize(str string) List { } def unescape(s string) string { - return s.replaceAll("\\\"", "\"").replaceAll("\\n", "\n").replaceAll("\\\\", "\\") + return s.replaceAll("\\\\", "\x01").replaceAll("\\\"", "\"").replaceAll("\\n", "\n").replaceAll("\x01", "\\") } def read_atom(rdr Reader) MalVal { diff --git a/vimscript/reader.vim b/vimscript/reader.vim index 38510cd4..f22debe6 100644 --- a/vimscript/reader.vim +++ b/vimscript/reader.vim @@ -42,12 +42,20 @@ function Tokenize(str) return tokens endfunction +function UnescapeChar(seq) + if a:seq == '\"' + return '"' + elseif a:seq == '\n' + return "\n" + elseif a:seq == '\\' + return '\' + else + return a:seq + endif +endfunction + function ParseString(token) - let str = a:token[1:-2] - let str = substitute(str, '\\"', '"', "g") - let str = substitute(str, '\\n', "\n", "g") - let str = substitute(str, '\\\\', "\\", "g") - return str + return substitute(a:token[1:-2], '\\.', '\=UnescapeChar(submatch(0))', "g") endfunction function ReadAtom(rdr)