summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Courtes2006-02-25 13:02:20 +0000
committerLudovic Courtes2006-02-25 13:02:20 +0000
commita0d8397787ffcaaec7c885542fb5e7f3de3fdc9a (patch)
tree08bc6c0701a8a00cf260928bd719c306b4ed9b67 /src
parentae7f43fb57d1e8a7df040c372cc4d2b7e4532ad7 (diff)
downloadskribilo-a0d8397787ffcaaec7c885542fb5e7f3de3fdc9a.tar.gz
skribilo-a0d8397787ffcaaec7c885542fb5e7f3de3fdc9a.tar.lz
skribilo-a0d8397787ffcaaec7c885542fb5e7f3de3fdc9a.zip
Made `make-string-replace' faster.
* src/guile/skribilo/runtime.scm (%make-general-string-replace): Use a hash table rather than a list. git-archimport-id: lcourtes@laas.fr--2005-mobile/skribilo--devel--1.2--patch-35
Diffstat (limited to 'src')
-rw-r--r--src/guile/skribilo/runtime.scm24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/guile/skribilo/runtime.scm b/src/guile/skribilo/runtime.scm
index bd8497f..da5c525 100644
--- a/src/guile/skribilo/runtime.scm
+++ b/src/guile/skribilo/runtime.scm
@@ -180,13 +180,23 @@
(define (%make-general-string-replace lst)
;; The general version
- (lambda (str)
- (let ((out (open-output-string)))
- (string-for-each (lambda (ch)
- (let ((res (assq ch lst)))
- (display (if res (cadr res) ch) out)))
- str)
- (get-output-string out))))
+ (let ((chars (make-hash-table)))
+
+ ;; Setup a hash table equivalent to LST.
+ (for-each (lambda (chr)
+ (hashq-set! chars (car chr) (cadr chr)))
+ lst)
+
+ ;; Help the GC.
+ (set! lst #f)
+
+ (lambda (str)
+ (let ((out (open-output-string)))
+ (string-for-each (lambda (ch)
+ (let ((res (hashq-ref chars ch #f)))
+ (display (if res res ch) out)))
+ str)
+ (get-output-string out)))))
(define string->html
(%make-general-string-replace '((#\" "&quot;") (#\& "&amp;") (#\< "&lt;")