From 72971fd4f4da4d24f1abad7658705572c55fdab3 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 23 Sep 2019 11:53:54 +0800 Subject: [PATCH] pipes should be escaped in symbols (fixes issue #571) --- sexp.c | 6 +++--- tests/r7rs-tests.scm | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/sexp.c b/sexp.c index 8ceef0e1..647865ac 100644 --- a/sexp.c +++ b/sexp.c @@ -1457,7 +1457,7 @@ sexp sexp_intern(sexp ctx, const char *str, sexp_sint_t len) { goto normal_intern; for ( ; i 127 || c == '\\' || c == '.' || c =='#' || sexp_is_separator(c)) + if ((unsigned char)c <= 32 || (unsigned char)c > 127 || c == '\\' || c == '|' || c == '.' || c =='#' || sexp_is_separator(c)) goto normal_intern; he = huff_table[(unsigned char)c]; newbits = he.len; @@ -2201,11 +2201,11 @@ sexp sexp_write_one (sexp ctx, sexp obj, sexp out, sexp_sint_t bound) { sexp_tolower((unsigned char)str[3]) == 'n'))))) ? '|' : EOF; for (i=sexp_lsymbol_length(obj)-1; i>=0; i--) - if (str[i] <= ' ' || str[i] == '\\' || str[i] == '#' || sexp_is_separator(str[i])) + if (str[i] <= ' ' || str[i] == '\\' || str[i] == '|' || str[i] == '#' || sexp_is_separator(str[i])) c = '|'; if (c!=EOF) sexp_write_char(ctx, c, out); for (i=sexp_lsymbol_length(obj); i>0; str++, i--) { - if (str[0] == '\\') sexp_write_char(ctx, '\\', out); + if (str[0] == '\\' || str[0] == '|') sexp_write_char(ctx, '\\', out); sexp_write_char(ctx, str[0], out); } if (c!=EOF) sexp_write_char(ctx, c, out); diff --git a/tests/r7rs-tests.scm b/tests/r7rs-tests.scm index 49cb5086..47db3165 100644 --- a/tests/r7rs-tests.scm +++ b/tests/r7rs-tests.scm @@ -2232,6 +2232,9 @@ (test-write-syntax "|a b|" '|a b|) (test-write-syntax "|,a|" '|,a|) (test-write-syntax "|\"|" '|\"|) +(test-write-syntax "|\\||" '|\||) +(test-write-syntax "||" '||) +(test-write-syntax "|\\\\123|" '|\\123|) (test-write-syntax "a" '|a|) ;; (test-write-syntax "a.b" '|a.b|) (test-write-syntax "|2|" '|2|)