~ chicken-core (chicken-5) 5cd403c419f083ef41dc5bb9be21804ac24eefe0


commit 5cd403c419f083ef41dc5bb9be21804ac24eefe0
Author:     Florian Zumbiehl <florz@florz.de>
AuthorDate: Tue Mar 5 18:48:58 2013 +0100
Commit:     Moritz Heidkamp <moritz@twoticketsplease.de>
CommitDate: Sun Mar 10 12:57:31 2013 +0100

    extras/pretty-print: escape control characters in strings
    
    Make pretty-print encode control characters in strings as escape sequences
    rather than as literal bytes, the same way write does it.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/extras.scm b/extras.scm
index 0e8b144e..f6daf1c2 100644
--- a/extras.scm
+++ b/extras.scm
@@ -331,31 +331,43 @@
 	       (##sys#print obj #t s)
 	       (out (get-output-string s) col) ) )
 	    ((procedure? obj)   (out (##sys#procedure->string obj) col))
-	    ((string? obj)      (if display?
-				    (out obj col)
-				    (let loop ((i 0) (j 0) (col (out "\"" col)))
-				      (if (and col (fx< j (string-length obj)))
-					  (let ((c (string-ref obj j)))
-                                            (if (or (char=? c #\\)
-                                                    (char=? c #\"))
-                                                (loop j
-                                                      (+ j 1)
-                                                      (out "\\"
-                                                           (out (##sys#substring obj i j)
-                                                                col)))
-                                                (cond ((assq c '((#\tab . "\\t")
-                                                                 (#\newline . "\\n")
-                                                                 (#\return . "\\r")))
-                                                       =>
-                                                       (lambda (a)
-                                                         (let ((col2
-                                                                (out (##sys#substring obj i j) col)))
-                                                           (loop (fx+ j 1)
-                                                                 (fx+ j 1)
-                                                                 (out (cdr a) col2)))))
-                                                      (else (loop i (fx+ j 1) col)))))
-					  (out "\""
-					       (out (##sys#substring obj i j) col))))))
+	    ((string? obj)
+             (if display?
+		 (out obj col)
+		 (let loop ((i 0) (j 0) (col (out "\"" col)))
+		   (if (and col (fx< j (string-length obj)))
+		       (let ((c (string-ref obj j)))
+			 (cond
+			  ((or (char=? c #\\)
+			       (char=? c #\"))
+			   (loop j
+				 (+ j 1)
+				 (out "\\"
+				      (out (##sys#substring obj i j)
+					   col))))
+			  ((or (char<? c #\x20)
+			       (char=? c #\x7f))
+			   (loop (fx+ j 1)
+				 (fx+ j 1)
+				 (let ((col2
+					(out (##sys#substring obj i j) col)))
+				   (cond ((assq c '((#\tab . "\\t")
+						    (#\newline . "\\n")
+						    (#\return . "\\r")
+						    (#\vtab . "\\v")
+						    (#\page . "\\f")
+						    (#\alarm . "\\a")
+						    (#\backspace . "\\b")))
+					  =>
+					  (lambda (a)
+					    (out (cdr a) col2)))
+					 (else
+					  (out (number->string (char->integer c) 16)
+					       (out (if (char<? c #\x10) "0" "")
+						    (out "\\x" col2))))))))
+			  (else (loop i (fx+ j 1) col))))
+		       (out "\""
+			    (out (##sys#substring obj i j) col))))))
 	    ((char? obj)        (if display?
 				    (out (make-string 1 obj) col)
 				    (let ([code (char->integer obj)])
diff --git a/tests/pp-test.scm b/tests/pp-test.scm
index 318c982e..0af80e43 100644
--- a/tests/pp-test.scm
+++ b/tests/pp-test.scm
@@ -13,4 +13,5 @@
 (test "\"\\\\\\\"\"\n" (pp->string "\\\""))
 (test "\"\\\\\\\\\\\\\\\"\"\n" (pp->string "\\\\\\\""))
 (test "\"\\\"\\\"\\\"\"\n" (pp->string "\"\"\""))
-(test "\\" "\\")
+(test "\"\\n\\t\\r\\b\\a\\v\\f\"\n" (pp->string "\n\t\r\b\a\v\f"))
+(test "\\" "\\")                        ; XXX?
Trap