Skip to content

Commit bcc7913

Browse files
committed
LN_CORE: Add u8vector->utf8string and u8vector->unicode-vector
1 parent 8d01421 commit bcc7913

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

modules/ln_core/u8vector.scm

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#|
22
LambdaNative - a cross-platform Scheme framework
3-
Copyright (c) 2009-2013, University of British Columbia
3+
Copyright (c) 2009-2020, University of British Columbia
44
All rights reserved.
55

66
Redistribution and use in source and binary forms, with or
@@ -80,6 +80,54 @@ end-of-c-declare
8080
(loop (substring s 2 (string-length s))
8181
(append res (list (substring s 0 2)))))))))
8282

83+
;;u8vectors that need unicode conversion
84+
(define (u8vector->unicode-vector invec)
85+
(let* ((inveclen (u8vector-length invec))
86+
(outvec (make-vector inveclen))
87+
(outveclen 0)
88+
(armed? #f))
89+
(let loop ((i 0))
90+
(if (fx= i inveclen)
91+
(subvector outvec 0 outveclen)
92+
(begin
93+
(if armed?
94+
(case (u8vector-ref invec i)
95+
((117)
96+
(let loop ((k 0) (val 0))
97+
(if (fx= k 4)
98+
(begin
99+
(vector-set! outvec outveclen val)
100+
(set! outveclen (fx+ outveclen 1))
101+
(set! i (fx+ i 4))
102+
)
103+
(loop (fx+ k 1) (fx+ val (* (expt 16 (fx- 3 k))
104+
(let ((v (u8vector-ref invec (fx+ k i 1))))
105+
(if (fx>= v 97) (fx- v 87) (fx- v 48))))))
106+
)))
107+
((92)
108+
(vector-set! outvec outveclen (u8vector-ref invec i))
109+
(set! outveclen (fx+ outveclen 1))
110+
(vector-set! outvec outveclen (u8vector-ref invec i))
111+
(set! outveclen (fx+ outveclen 1))
112+
)
113+
(else
114+
(vector-set! outvec outveclen 92)
115+
(set! outveclen (fx+ outveclen 1))
116+
(vector-set! outvec outveclen (u8vector-ref invec i))
117+
(set! outveclen (fx+ outveclen 1))
118+
)
119+
)
120+
(if (not (fx= (u8vector-ref invec i) 92)) (begin
121+
(vector-set! outvec outveclen (u8vector-ref invec i))
122+
(set! outveclen (fx+ outveclen 1))
123+
))
124+
)
125+
(set! armed? (fx= (u8vector-ref invec i) 92))
126+
(loop (fx+ i 1))
127+
)
128+
)
129+
)))
130+
83131
;;write a u8vector to a file
84132
(define (u8vector->file u8v filename)
85133
(let ((file (open-output-file filename)))

modules/ln_core/utf8string.scm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#|
22
LambdaNative - a cross-platform Scheme framework
3-
Copyright (c) 2009-2013, University of British Columbia
3+
Copyright (c) 2009-2020, University of British Columbia
44
All rights reserved.
55

66
Redistribution and use in source and binary forms, with or
@@ -291,4 +291,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
291291
(else (apply string-append (map unicode->utf8string src)))
292292
))
293293

294+
;;u8vectors that need unicode conversion
295+
(define (u8vector->utf8string vec)
296+
(unicode->utf8string (vector->list (u8vector->unicode-vector (subu8vector vec 0
297+
(let loop ((i 0))
298+
(if (or (fx= i (u8vector-length vec)) (fx= (u8vector-ref vec i) 0)) i
299+
(loop (+ i 1)))
300+
))))))
301+
294302
;; eof

0 commit comments

Comments
 (0)