diff --git a/libguile/print.c b/libguile/print.c index bdc6c9f20..ad3e8c09a 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -904,9 +904,17 @@ write_character (scm_t_wchar ch, SCM port, int string_escapes_p) /* Represent CH using the in-string escape syntax. */ static const char hex[] = "0123456789abcdef"; + static const char escapes[7] = "abtnvfr"; char buf[9]; - if (!SCM_R6RS_ESCAPES_P) + if (ch >= 0x07 && ch <= 0x0D && ch != 0x0A) + { + /* Use special escapes for some C0 controls. */ + buf[0] = '\\'; + buf[1] = escapes[ch - 0x07]; + scm_lfwrite (buf, 2, port); + } + else if (!SCM_R6RS_ESCAPES_P) { if (ch <= 0xFF) { diff --git a/test-suite/tests/reader.test b/test-suite/tests/reader.test index 6fe7a23bc..6686ca2be 100644 --- a/test-suite/tests/reader.test +++ b/test-suite/tests/reader.test @@ -309,6 +309,7 @@ (pass-if "write R6RS string escapes" (let* ((s1 (apply string (map integer->char '(#x8 ; backspace + #x18 ; cancel #x20 ; space #x30 ; zero #x40 ; at sign @@ -319,7 +320,7 @@ (lambda () (write s1))))))) (lset= eqv? (string->list s2) - (list #\" #\\ #\x #\8 #\; #\space #\0 #\@ #\")))) + (list #\" #\\ #\b #\\ #\x #\1 #\8 #\; #\space #\0 #\@ #\")))) (pass-if "display R6RS string escapes" (string=?