~ chicken-core (chicken-5) fd156beb0771532b1a06c5764b8565e8bd4463b0


commit fd156beb0771532b1a06c5764b8565e8bd4463b0
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Dec 18 12:52:40 2010 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Dec 18 12:52:40 2010 +0100

    better string->c-identifier

diff --git a/eval.scm b/eval.scm
index 32d71301..1f7ceb46 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1289,16 +1289,19 @@
 
 ;;; Convert string into valid C-identifier:
 
-(define ##sys#string->c-identifier
-  (let ([string-copy string-copy])
-    (lambda (str)
-      (let* ([s2 (string-copy str)]
-	     [n (##sys#size s2)] )
-	(do ([i 0 (fx+ i 1)])
-	    ((fx>= i n) s2)
-	  (let ([c (##core#inline "C_subchar" s2 i)])
-	    (when (and (not (char-alphabetic? c)) (or (not (char-numeric? c)) (fx= i 0)))
-	      (##core#inline "C_setsubchar" s2 i #\_) ) ) ) ) ) ) )
+(define (##sys#string->c-identifier str)
+  (let ((out (open-output-string))
+	(n (string-length str)))
+    (do ((i 0 (fx+ i 1)))
+	((fx>= i n) (get-output-string out))
+      (let ((c (string-ref str i)))
+	(if (and (not (char-alphabetic? c)) 
+		 (or (not (char-numeric? c)) (fx= i 0)))
+	    (let ((i (char->integer c)))
+	      (write-char #\_ out)
+	      (when (fx< i 16) (write-char #\0 out))
+	      (display (number->string i 16) out))
+	    (write-char c out))))))
 
 
 ;;; Environments:
Trap