Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: iconv(3) protype mismatch with POSIX

3 views
Skip to first unread message

Kamil Rytarowski

unread,
Jul 23, 2016, 4:11:23 AM7/23/16
to
Still valid.

For example portable multi-system wrapper for OS interfaces glib doesn't
know that there might be constified iconv(3).

gconvert.c:279:21: warning: passing argument 2 of 'iconv' from
incompatible pointer type [-Wincompatible-pointer-types]
return iconv (cd, inbuf, inbytes_left, outbuf, outbytes_left);
^
In file included from gconvert.c:25:0:
/usr/include/iconv.h:46:8: note: expected 'const char ** restrict' but
argument is of type 'gchar ** {aka char **}'
size_t iconv(iconv_t, const char ** __restrict,
^


On 16.06.2016 23:24, Kamil Rytarowski wrote:
>
>
> On 16.06.2016 20:16, David Holland wrote:
>> On Thu, Jun 16, 2016 at 12:27:47PM +0200, Kamil Rytarowski wrote:
>> > > > This is an interesting exercise to use C11.. however:
>> > > > 1. Not all ports moved to gcc 4.9+,
>> > > > 2. pcc doesn't support it,
>> > > > 3. it won't work as a valid and acceptable C++ code.
>> > > > 4. Many software expects system headers to be C89, GNU89 etc, and
>> > > > doesn't request C11.
>> > >
>> > > None of that matters, it just needs to be wrapped in suitable ifdefs.
>> >
>> > All of them matters to me and C11 in a public-header is no-go.
>>
>> Uh, I don't follow. What's wrong with
>>
>> #if defined(_NETBSD_SOURCE_) && \
>> defined(__GNUC_PREREQ__(5,3)) && !defined(__cplusplus)
>> (polymorphic iconv as suggested)
>> #else
>> (posix iconv)
>> #endif
>>
>> ?
>>
>
> I understood that the default-fallback one will be the non complainant one.
>
> Is it going to be a temporary solution?
>
> _Generic is available since GCC-4.9, a more portable implementation is
> to use __builtin_constant_p + __builtin_choose_expr... however there are
> still plenty of compilers without support for similar features (like PCC).
>
> In C++ there is a polymorphic solution out-of-the-box in C++98 with
> function overloading.
>
>> > > "extern" option?
>> >
>> > NAME
>> >
>> > iconv - code conversion function
>> >
>> > SYNOPSIS
>> >
>> > Default
>> >
>> > #include <iconv.h>
>> >
>> > extern size_t iconv(iconv_t cd, const char **restrict inbuf,
>> > size_t *restrict inbytesleft, char **restrict outbuf,
>> > size_t *restrict outbytesleft);
>> >
>> >
>> > SUSv3
>> > #include <iconv.h>
>> >
>> > size_t iconv(iconv_t cd, char **restrict inbuf,
>> > size_t *restrict inbytesleft, char **restrict outbuf,
>> > size_t *restrict outbytesleft);
>>
>> Uh, I have no idea what you're getting at.
>>
>
> I'm not familiar with opensolaris development.. I got an example:
>
> #ifdef _XPG6
> extern size_t iconv(iconv_t, char **_RESTRICT_KYWD,
> size_t *_RESTRICT_KYWD, char **_RESTRICT_KYWD,
> size_t *_RESTRICT_KYWD);
> #else
> extern size_t iconv(iconv_t, const char **_RESTRICT_KYWD,
> size_t *_RESTRICT_KYWD, char **_RESTRICT_KYWD,
> size_t *_RESTRICT_KYWD);
> #endif
>
> --
> https://github.com/illumos/illumos-gate/blob/5a4ef21a18dfdc65328821a265582d03e85a97c9/usr/src/head/iconv.h
>
>
> Assuming that the POSIX version has been already proposed as the default
> one, how about:
>
> #if defined(_NETBSD_SOURCE) && defined(_CONSTIFIED_ICONV)
> size_t iconv(iconv_t, const char ** __restrict,
> size_t * __restrict, char ** __restrict,
> size_t * __restrict);
> #else
> size_t iconv(iconv_t, const char ** __restrict,
> size_t * __restrict, char ** __restrict,
> size_t * __restrict);
> #endif
>
> It will work for all c(89+)/c++(98+)/objc/.. compilers.
>
> With that we could build software with additional CPPFLAGS defines when
> needed.
>
> Next step is to detect what fails to build in pkgsrc and adjust it
> accordingly.
>

signature.asc
0 new messages