@@ -2,9 +2,34 @@ using BinDeps
22
33@BinDeps . setup
44
5+ # Check for an iconv implementation with the GNU (non-POSIX) behavior:
6+ # EILSEQ is returned when a sequence cannot be converted to target encoding,
7+ # instead of succeeding and only returning the number of invalid conversions
8+ # This non-standard behavior is required to allow replacing invalid sequences
9+ # with a user-defined character. glibc, GNU libiconv and win_iconv behave that way.
10+ function validate_iconv (n, h)
11+ Libdl. dlsym_e (h, " iconv_open" ) == C_NULL && return false
12+
13+ cd = ccall ((:iconv_open , h), Ptr{Void}, (Cstring, Cstring), " ASCII" , " UTF-8" )
14+ cd == Ptr {Void} (- 1 ) && return false
15+
16+ s = " café"
17+ a = similar (s. data)
18+ inbufptr = Ref {Ptr{UInt8}} (pointer (s. data))
19+ inbytesleft = Ref {Csize_t} (length (s. data))
20+ outbufptr = Ref {Ptr{UInt8}} (pointer (a))
21+ outbytesleft = Ref {Csize_t} (length (a))
22+ ret = ccall ((:iconv , h), Csize_t,
23+ (Ptr{Void}, Ptr{Ptr{UInt8}}, Ref{Csize_t}, Ptr{Ptr{UInt8}}, Ref{Csize_t}),
24+ cd, inbufptr, inbytesleft, outbufptr, outbytesleft)
25+ ccall ((:iconv_close , h), Void, (Ptr{Void},), cd) == - 1 && return false
26+
27+ return ret == - 1 % Csize_t && Base. Libc. errno () == Base. Libc. EILSEQ
28+ end
29+
530libiconv = library_dependency (" libiconv" , aliases = [" libc" , " iconv" ],
631 # Check whether libc provides iconv_open (as on Linux)
7- validate = (n, h) -> Libdl . dlsym_e (h, " iconv_open " ) != C_NULL )
32+ validate = validate_iconv )
833
934@windows_only begin
1035 using WinRPM
0 commit comments