@@ -39,6 +39,8 @@ type StringEncoder{S<:IO} <: IO
3939 cd:: Ptr{Void}
4040 inbuf:: Vector{UInt8}
4141 outbuf:: Vector{UInt8}
42+ inbufptr:: Ref{Ptr{UInt8}}
43+ outbufptr:: Ref{Ptr{UInt8}}
4244 inbytesleft:: Ref{Csize_t}
4345 outbytesleft:: Ref{Csize_t}
4446end
@@ -48,25 +50,25 @@ type StringDecoder{S<:IO} <: IO
4850 cd:: Ptr{Void}
4951 inbuf:: Vector{UInt8}
5052 outbuf:: Vector{UInt8}
53+ inbufptr:: Ref{Ptr{UInt8}}
54+ outbufptr:: Ref{Ptr{UInt8}}
5155 inbytesleft:: Ref{Csize_t}
5256 outbytesleft:: Ref{Csize_t}
5357 skip:: Int
5458end
5559
5660function iconv! (cd:: Ptr{Void} , inbuf:: Vector{UInt8} , outbuf:: Vector{UInt8} ,
61+ inbufptr:: Ref{Ptr{UInt8}} , outbufptr:: Ref{Ptr{UInt8}} ,
5762 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)
6065
6166 inbytesleft_orig = inbytesleft[]
6267 outbytesleft[] = BUFSIZE
6368
64- inbuf2 = Ptr{UInt8}[inbuf2_orig]
65- outbuf2 = Ptr{UInt8}[outbuf2_orig]
66-
6769 ret = ccall ((:iconv , :libc ), Csize_t,
6870 (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)
7072
7173 if ret == reinterpret (Csize_t, - 1 )
7274 err = errno ()
@@ -98,11 +100,11 @@ function iconv_reset!(s::Union{StringEncoder, StringDecoder})
98100 s. skip = 0
99101 end
100102
101- outbuf2 = Ptr{UInt8}[ pointer (s. outbuf, 1 )]
103+ s . outbufptr[] = pointer (s. outbuf)
102104 s. outbytesleft[] = BUFSIZE
103105 ret = ccall ((:iconv , :libc ), Csize_t,
104106 (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)
106108
107109 if ret == reinterpret (Csize_t, - 1 )
108110 err = errno ()
@@ -134,7 +136,9 @@ function StringEncoder(ostream::IO, to::ASCIIString, from::ASCIIString="UTF-8")
134136 cd = iconv_open (to, from)
135137 inbuf = Vector {UInt8} (BUFSIZE)
136138 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))
138142 finalizer (s, close)
139143 s
140144end
@@ -149,7 +153,7 @@ function flush(s::StringEncoder)
149153 # until more data is written, which will only trigger an error on close().
150154 s. outbytesleft[] = 0
151155 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)
153157 write (s. ostream, sub (s. outbuf, 1 : (BUFSIZE - s. outbytesleft[])))
154158 end
155159
@@ -185,7 +189,9 @@ function StringDecoder(istream::IO, from::ASCIIString, to::ASCIIString="UTF-8")
185189 cd = iconv_open (to, from)
186190 inbuf = Vector {UInt8} (BUFSIZE)
187191 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 )
189195 finalizer (s, close)
190196 s
191197end
@@ -204,7 +210,7 @@ function fill_buffer!(s::StringDecoder)
204210 end
205211
206212 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)
208214end
209215
210216# In order to know whether more data is available, we need to:
0 commit comments