trawick 01/02/07 18:37:30 Modified: . apr_common.m4 configure.in i18n/unix xlate.c Log: Handle the second parameter to iconv() differently, respecting that some systems declare it "const char **" while other systems (and current Single UNIX Spec.) declare it "char **". We'll still have to add some hints for some platforms to avoid warnings. Revision Changes Path 1.12 +33 -0 apr/apr_common.m4 Index: apr_common.m4 =================================================================== RCS file: /home/cvs/apr/apr_common.m4,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- apr_common.m4 2001/01/11 13:55:58 1.11 +++ apr_common.m4 2001/02/08 02:37:29 1.12 @@ -285,3 +285,36 @@ $1="$$1 $2"; export $1 ]) +dnl +dnl APR_CHECK_ICONV_INBUF +dnl +dnl Decide whether or not the inbuf parameter to iconv() is const. +dnl +dnl We try to compile something without const. If it fails to +dnl compile, we assume that the system's iconv() has const. +dnl Unfortunately, we won't realize when there was a compile +dnl warning, so we allow a variable -- apr_iconv_inbuf_const -- to +dnl be set in hints.m4 to specify whether or not iconv() has const +dnl on this parameter. +dnl +AC_DEFUN(APR_CHECK_ICONV_INBUF,[ +AC_MSG_CHECKING(for type of inbuf parameter to iconv) +if test "x$apr_iconv_inbuf_const" = "x"; then + AC_TRY_COMPILE([ + #include + #include + ],[ + #if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR < 2 + #error We know this version of glibc has const char **, so fail this compile + #endif + iconv(0,(char **)0,(size_t *)0,(char **)0,(size_t *)0); + ], apr_iconv_inbuf_const="0", apr_iconv_inbuf_const="1") +fi +if test "$apr_iconv_inbuf_const" = "1"; then + AC_DEFINE(APR_ICONV_INBUF_CONST, 1, [Define if the inbuf parm to iconv() is const char **]) + msg="const char **" +else + msg="char **" +fi +AC_MSG_RESULT([$msg]) +]) 1.221 +3 -0 apr/configure.in Index: configure.in =================================================================== RCS file: /home/cvs/apr/configure.in,v retrieving revision 1.220 retrieving revision 1.221 diff -u -r1.220 -r1.221 --- configure.in 2001/01/28 12:18:38 1.220 +++ configure.in 2001/02/08 02:37:29 1.221 @@ -245,6 +245,9 @@ AC_CHECK_FUNC(_getch) AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CHECK_FUNCS(iconv, [ iconv="1" ], [ iconv="0" ]) +if test "$iconv" = "1"; then + APR_CHECK_ICONV_INBUF +fi AC_CHECK_FUNCS(mmap, [ mmap="1" ], [ mmap="0" ]) if test "$native_mmap_emul" = "1"; then mmap="1" 1.19 +9 -3 apr/i18n/unix/xlate.c Index: xlate.c =================================================================== RCS file: /home/cvs/apr/i18n/unix/xlate.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- xlate.c 2001/01/28 11:33:52 1.18 +++ xlate.c 2001/02/08 02:37:29 1.19 @@ -80,6 +80,12 @@ #include #endif +#ifdef APR_ICONV_INBUF_CONST +#define ICONV_INBUF_TYPE const char ** +#else +#define ICONV_INBUF_TYPE char ** +#endif + #ifndef min #define min(x,y) ((x) <= (y) ? (x) : (y)) #endif @@ -194,7 +200,7 @@ } inbytes_left = outbytes_left = sizeof(inbuf); - translated = iconv(convset->ich, &inbufptr, + translated = iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr, &inbytes_left, &outbufptr, &outbytes_left); if (translated != (size_t) -1 && inbytes_left == 0 && @@ -285,10 +291,10 @@ size_t translated; if (convset->ich != (iconv_t)-1) { - char *inbufptr = (char *)inbuf; + const char *inbufptr = inbuf; char *outbufptr = outbuf; - translated = iconv(convset->ich, &inbufptr, + translated = iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr, inbytes_left, &outbufptr, outbytes_left); /* If everything went fine but we ran out of buffer, don't * report it as an error. Caller needs to look at the two