|
1 | 1 | #| |
2 | 2 | LambdaNative - a cross-platform Scheme framework |
3 | | -Copyright (c) 2009-2013, University of British Columbia |
| 3 | +Copyright (c) 2009-2020, University of British Columbia |
4 | 4 | All rights reserved. |
5 | 5 |
|
6 | 6 | Redistribution and use in source and binary forms, with or |
@@ -80,6 +80,54 @@ end-of-c-declare |
80 | 80 | (loop (substring s 2 (string-length s)) |
81 | 81 | (append res (list (substring s 0 2))))))))) |
82 | 82 |
|
| 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 | + |
83 | 131 | ;;write a u8vector to a file |
84 | 132 | (define (u8vector->file u8v filename) |
85 | 133 | (let ((file (open-output-file filename))) |
|
0 commit comments