@@ -39,6 +39,8 @@ type StringEncoder{S<:IO} <: IO
39
39
cd:: Ptr{Void}
40
40
inbuf:: Vector{UInt8}
41
41
outbuf:: Vector{UInt8}
42
+ inbufptr:: Ref{Ptr{UInt8}}
43
+ outbufptr:: Ref{Ptr{UInt8}}
42
44
inbytesleft:: Ref{Csize_t}
43
45
outbytesleft:: Ref{Csize_t}
44
46
end
@@ -48,25 +50,25 @@ type StringDecoder{S<:IO} <: IO
48
50
cd:: Ptr{Void}
49
51
inbuf:: Vector{UInt8}
50
52
outbuf:: Vector{UInt8}
53
+ inbufptr:: Ref{Ptr{UInt8}}
54
+ outbufptr:: Ref{Ptr{UInt8}}
51
55
inbytesleft:: Ref{Csize_t}
52
56
outbytesleft:: Ref{Csize_t}
53
57
skip:: Int
54
58
end
55
59
56
60
function iconv! (cd:: Ptr{Void} , inbuf:: Vector{UInt8} , outbuf:: Vector{UInt8} ,
61
+ inbufptr:: Ref{Ptr{UInt8}} , outbufptr:: Ref{Ptr{UInt8}} ,
57
62
inbytesleft:: Ref{Csize_t} , outbytesleft:: Ref{Csize_t} )
58
- inbuf2_orig = pointer (inbuf, 1 )
59
- outbuf2_orig = pointer (outbuf, 1 )
63
+ inbufptr[] = pointer (inbuf)
64
+ outbufptr[] = pointer (outbuf)
60
65
61
66
inbytesleft_orig = inbytesleft[]
62
67
outbytesleft[] = BUFSIZE
63
68
64
- inbuf2 = Ptr{UInt8}[inbuf2_orig]
65
- outbuf2 = Ptr{UInt8}[outbuf2_orig]
66
-
67
69
ret = ccall ((:iconv , :libc ), Csize_t,
68
70
(Ptr{Void}, Ptr{Ptr{UInt8}}, Ref{Csize_t}, Ptr{Ptr{UInt8}}, Ref{Csize_t}),
69
- cd, pointer (inbuf2, 1 ), inbytesleft, pointer (outbuf2, 1 ) , outbytesleft)
71
+ cd, inbufptr, inbytesleft, outbufptr , outbytesleft)
70
72
71
73
if ret == reinterpret (Csize_t, - 1 )
72
74
err = errno ()
@@ -98,11 +100,11 @@ function iconv_reset!(s::Union{StringEncoder, StringDecoder})
98
100
s. skip = 0
99
101
end
100
102
101
- outbuf2 = Ptr{UInt8}[ pointer (s. outbuf, 1 )]
103
+ s . outbufptr[] = pointer (s. outbuf)
102
104
s. outbytesleft[] = BUFSIZE
103
105
ret = ccall ((:iconv , :libc ), Csize_t,
104
106
(Ptr{Void}, Ptr{Ptr{UInt8}}, Ref{Csize_t}, Ptr{Ptr{UInt8}}, Ref{Csize_t}),
105
- s. cd, C_NULL , C_NULL , pointer (outbuf2, 1 ) , s. outbytesleft)
107
+ s. cd, C_NULL , C_NULL , s . outbufptr , s. outbytesleft)
106
108
107
109
if ret == reinterpret (Csize_t, - 1 )
108
110
err = errno ()
@@ -134,7 +136,9 @@ function StringEncoder(ostream::IO, to::ASCIIString, from::ASCIIString="UTF-8")
134
136
cd = iconv_open (to, from)
135
137
inbuf = Vector {UInt8} (BUFSIZE)
136
138
outbuf = Vector {UInt8} (BUFSIZE)
137
- s = StringEncoder (ostream, cd, inbuf, outbuf, Ref {Csize_t} (0 ), Ref {Csize_t} (BUFSIZE))
139
+ s = StringEncoder (ostream, cd, inbuf, outbuf,
140
+ Ref {Ptr{UInt8}} (pointer (inbuf)), Ref {Ptr{UInt8}} (pointer (outbuf)),
141
+ Ref {Csize_t} (0 ), Ref {Csize_t} (BUFSIZE))
138
142
finalizer (s, close)
139
143
s
140
144
end
@@ -149,7 +153,7 @@ function flush(s::StringEncoder)
149
153
# until more data is written, which will only trigger an error on close().
150
154
s. outbytesleft[] = 0
151
155
while s. outbytesleft[] < BUFSIZE
152
- iconv! (s. cd, s. inbuf, s. outbuf, s. inbytesleft, s. outbytesleft)
156
+ iconv! (s. cd, s. inbuf, s. outbuf, s. inbufptr, s . outbufptr, s . inbytesleft, s. outbytesleft)
153
157
write (s. ostream, sub (s. outbuf, 1 : (BUFSIZE - s. outbytesleft[])))
154
158
end
155
159
@@ -185,7 +189,9 @@ function StringDecoder(istream::IO, from::ASCIIString, to::ASCIIString="UTF-8")
185
189
cd = iconv_open (to, from)
186
190
inbuf = Vector {UInt8} (BUFSIZE)
187
191
outbuf = Vector {UInt8} (BUFSIZE)
188
- s = StringDecoder (istream, cd, inbuf, outbuf, Ref {Csize_t} (0 ), Ref {Csize_t} (BUFSIZE), 0 )
192
+ s = StringDecoder (istream, cd, inbuf, outbuf,
193
+ Ref {Ptr{UInt8}} (pointer (inbuf)), Ref {Ptr{UInt8}} (pointer (outbuf)),
194
+ Ref {Csize_t} (0 ), Ref {Csize_t} (BUFSIZE), 0 )
189
195
finalizer (s, close)
190
196
s
191
197
end
@@ -204,7 +210,7 @@ function fill_buffer!(s::StringDecoder)
204
210
end
205
211
206
212
s. inbytesleft[] += readbytes! (s. istream, sub (s. inbuf, (s. inbytesleft[]+ 1 ): BUFSIZE))
207
- iconv! (s. cd, s. inbuf, s. outbuf, s. inbytesleft, s. outbytesleft)
213
+ iconv! (s. cd, s. inbuf, s. outbuf, s. inbufptr, s . outbufptr, s . inbytesleft, s. outbytesleft)
208
214
end
209
215
210
216
# In order to know whether more data is available, we need to:
0 commit comments