|
33 | 33 | (parse-result (.decode decoder in out false)))
|
34 | 34 |
|
35 | 35 | (defn flush
|
36 |
| - [^CharsetDecoder decoder ^CharBuffer out] |
37 |
| - (and |
38 |
| - (parse-result (.decode decoder (ByteBuffer/allocate 0) out true)) |
39 |
| - (parse-result (.flush decoder out)))) |
| 36 | + ([decoder out] (flush decoder (ByteBuffer/allocate 0) out)) |
| 37 | + ([^CharsetDecoder decoder ^ByteBuffer in ^CharBuffer out] |
| 38 | + (and |
| 39 | + (parse-result (.decode decoder in out true)) |
| 40 | + (parse-result (.flush decoder out))))) |
| 41 | + |
| 42 | +(defn has-remaining-bytes? [^ByteBuffer byte-buffer] |
| 43 | + {:pre [(some? byte-buffer)]} |
| 44 | + (.hasRemaining byte-buffer)) |
| 45 | + |
| 46 | +(defn merge-byte-buffers [^ByteBuffer l ^ByteBuffer r] |
| 47 | + {:pre [(some? l) (some? r)]} |
| 48 | + (-> (ByteBuffer/allocate (+ (.remaining l) (.remaining r))) |
| 49 | + (.put l) |
| 50 | + (.put r) |
| 51 | + .flip)) |
40 | 52 |
|
41 | 53 | (defn lazy-char-buffer-sequence
|
42 | 54 | [^CharsetDecoder decoder
|
|
64 | 76 | (lazy-char-buffer-sequence decoder chunk-size extra-bytes close-fn byte-source))
|
65 | 77 |
|
66 | 78 | (if-let [in (byte-source chunk-size)]
|
67 |
| - (let [result (decode decoder in out)] |
| 79 | + (let [expanded-in (if (some-> extra-bytes has-remaining-bytes?) |
| 80 | + ;; in case of underflow we need to pass new buffer |
| 81 | + ;; containing remaining bytes from the initial input |
| 82 | + ;; along with some new bytes to the CharsetDecoder |
| 83 | + (merge-byte-buffers extra-bytes in) |
| 84 | + in) |
| 85 | + result (decode decoder expanded-in out)] |
68 | 86 | (cons
|
69 | 87 | (.flip out)
|
70 | 88 | (lazy-char-buffer-sequence
|
71 | 89 | decoder
|
72 | 90 | chunk-size
|
73 |
| - (when (= :overflow result) in) |
| 91 | + (when (has-remaining-bytes? expanded-in) |
| 92 | + expanded-in) |
74 | 93 | close-fn
|
75 | 94 | byte-source)))
|
76 | 95 | (do
|
77 |
| - (flush decoder out) |
| 96 | + (if (some? extra-bytes) |
| 97 | + (flush decoder extra-bytes out) |
| 98 | + (flush decoder out)) |
78 | 99 | (when close-fn (close-fn))
|
79 | 100 | (.flip out)))))))
|
80 | 101 |
|
|
0 commit comments