Introduced own automacro LIBBURNIA_CHECK_ICONV to handle iconv() peculiarities

This commit is contained in:
Thomas Schmitt 2009-07-01 13:16:29 +02:00
parent e52b5e7f2a
commit 9c2bf0197b
3 changed files with 56 additions and 4 deletions

View File

@ -24,3 +24,44 @@ AC_DEFUN([TARGET_SHIZZLE],
AC_MSG_RESULT([$ARCH]) AC_MSG_RESULT([$ARCH])
]) ])
dnl LIBBURNIA_CHECK_ICONV is by Thomas Schmitt, libburnia project
dnl It is based on gestures from:
dnl iconv.m4 serial AM7 (gettext-0.18)
dnl Copyright (C) 2000-2002, 2007-2009 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible.
dnl
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
[
dnl Check whether it is allowed to link with -liconv
AC_MSG_CHECKING([for separate -liconv ])
libburnia_liconv="no"
libburnia_save_LIBS="$LIBS"
LIBS="$LIBS -liconv"
AC_TRY_LINK([#include <stdlib.h>
#include <iconv.h>],
[iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);],
[libburnia_liconv="yes"],
[LIBS="$libburnia_save_LIBS"]
)
AC_MSG_RESULT([$libburnia_liconv])
dnl Check for iconv(..., const char **inbuf, ...)
AC_MSG_CHECKING([for const qualifier with iconv() ])
AC_TRY_COMPILE([
#include <stdlib.h>
#include <iconv.h>
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
], [], [libburnia_iconv_const=""], [libburnia_iconv_const="const"]
)
AC_DEFINE_UNQUOTED([ICONV_CONST], [$libburnia_iconv_const])
test -z "$libburnia_iconv_const" && libburnia_iconv_const="no"
AC_MSG_RESULT([$libburnia_iconv_const])
])

View File

@ -91,9 +91,11 @@ dnl test ticket 151
### LIBICONV= ### LIBICONV=
### ifdef(AM_ICONV, AM_ICONV, AC_CHECK_LIB(iconv, iconv, , )) ### ifdef(AM_ICONV, AM_ICONV, AC_CHECK_LIB(iconv, iconv, , ))
### LIBS="$LIBS $LIBICONV" ### LIBS="$LIBS $LIBICONV"
AC_CHECK_LIB(iconv, iconv, , ) ## AC_CHECK_LIB(iconv, iconv, , )
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv() ## dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
AC_CHECK_LIB(iconv, libiconv, , ) ## AC_CHECK_LIB(iconv, libiconv, , )
LIBBURNIA_CHECK_ICONV
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS) AC_SUBST(LIBTOOL_DEPS)

View File

@ -75,6 +75,15 @@ size_t iso_iconv(struct iso_iconv_handle *handle,
char **outbuf, size_t *outbytesleft, int flag) char **outbuf, size_t *outbytesleft, int flag)
{ {
size_t ret; size_t ret;
/* The build system might indicate iconv(,const char **inbuf,) by
defining ICONV_CONST const
*/
#ifndef ICONV_CONST
#define ICONV_CONST
#endif
ICONV_CONST char **local_inbuf;
local_inbuf = (ICONV_CONST char **) inbuf;
if (!(handle->status & 1)) { if (!(handle->status & 1)) {
if (iso_iconv_debug) if (iso_iconv_debug)
@ -101,7 +110,7 @@ null_buf:;
return (size_t) -1; return (size_t) -1;
return (size_t) 0; return (size_t) 0;
} }
ret = iconv(handle->descr, inbuf, inbytesleft, outbuf, outbytesleft); ret = iconv(handle->descr, local_inbuf, inbytesleft, outbuf, outbytesleft);
if (ret == (size_t) -1) { if (ret == (size_t) -1) {
if (iso_iconv_debug) if (iso_iconv_debug)
fprintf(stderr, "libisofs_DEBUG: iconv() failed: errno= %d %s\n", fprintf(stderr, "libisofs_DEBUG: iconv() failed: errno= %d %s\n",