Favor non-hex string escapes over hex escapes when writing strings
authorMichael Gran <spk121@yahoo.com>
Sun, 26 Sep 2010 19:25:18 +0000 (12:25 -0700)
committerMichael Gran <spk121@yahoo.com>
Sun, 26 Sep 2010 19:25:18 +0000 (12:25 -0700)
The characters U+0007 to U+000D have non-hex forms for their
escapes when in written strings.

* libguile/print.c (write_character): use non-hex escapes
* test-suite/tests/reader.test (write R6RS string escapes): adjust test

libguile/print.c
test-suite/tests/reader.test

index bdc6c9f..ad3e8c0 100644 (file)
@@ -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)
                {
index 6fe7a23..6686ca2 100644 (file)
     (pass-if "write R6RS string escapes"
        (let* ((s1 (apply string
                          (map integer->char '(#x8 ; backspace
+                                              #x18 ; cancel
                                               #x20 ; space
                                               #x30 ; zero
                                               #x40 ; at sign
                         (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=?