* iconv/gconv_cache.c: Likewise.
* iconv/skeleton.c: Likewise.
* libio/iofwide.c: Likewise.
* wcsmbs/btowc.c: Likewise.
* wcsmbs/mbrtowc.c: Likewise.
* wcsmbs/mbsnrtowcs.c: Likewise.
* wcsmbs/mbsrtowcs_l.c: Likewise.
* wcsmbs/wcrtomb.c: Likewise.
* wcsmbs/wcsnrtombs.c: Likewise.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/wctob.c: Likewise.
* iconv_gconv_db.c: Likewise. After init functions returns mangle
btowc pointer if necessary.
* iconv/gconv_dl.c: Mangle function pointers retrieved from dlsym.
2005-12-18 Ulrich Drepper <drepper@redhat.com>
+ * iconv/gconv.c: Demangle pointers before use if necessary.
+ * iconv/gconv_cache.c: Likewise.
+ * iconv/skeleton.c: Likewise.
+ * libio/iofwide.c: Likewise.
+ * wcsmbs/btowc.c: Likewise.
+ * wcsmbs/mbrtowc.c: Likewise.
+ * wcsmbs/mbsnrtowcs.c: Likewise.
+ * wcsmbs/mbsrtowcs_l.c: Likewise.
+ * wcsmbs/wcrtomb.c: Likewise.
+ * wcsmbs/wcsnrtombs.c: Likewise.
+ * wcsmbs/wcsrtombs.c: Likewise.
+ * wcsmbs/wctob.c: Likewise.
+ * iconv_gconv_db.c: Likewise. After init functions returns mangle
+ btowc pointer if necessary.
+ * iconv/gconv_dl.c: Mangle function pointers retrieved from dlsym.
+
* iconv/gconv_builtin.c (builtin_map): Change type of size
information fields to int8_t.
/* Convert characters in input buffer using conversion descriptor to
output buffer.
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997-2001, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
02111-1307 USA. */
#include <assert.h>
-#include <gconv_int.h>
-#include <sys/param.h>
#include <dlfcn.h>
#include <stddef.h>
+#include <sys/param.h>
+
+#include <gconv_int.h>
+#include <sysdep.h>
+
int
internal_function
cd->__data[last_step].__outbuf = outbuf != NULL ? *outbuf : NULL;
cd->__data[last_step].__outbufend = outbufend;
+ __gconv_fct fct = cd->__steps->__fct;
+#ifdef PTR_DEMANGLE
+ if (cd->__steps->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+
if (inbuf == NULL || *inbuf == NULL)
/* We just flush. */
- result = DL_CALL_FCT (cd->__steps->__fct,
+ result = DL_CALL_FCT (fct,
(cd->__steps, cd->__data, NULL, NULL, NULL,
irreversible,
cd->__data[last_step].__outbuf == NULL ? 2 : 1, 0));
do
{
last_start = *inbuf;
- result = DL_CALL_FCT (cd->__steps->__fct,
+ result = DL_CALL_FCT (fct,
(cd->__steps, cd->__data, inbuf, inbufend,
NULL, irreversible, 0, 0));
}
/* Provide access to the collection of available transformation modules.
- Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1997-2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <limits.h>
#include <search.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <gconv_int.h>
+#include <sysdep.h>
/* Simple data structure for alias mapping. We have two names, `from'
for (cnt = 0; cnt < deriv->nsteps; ++cnt)
if (deriv->steps[cnt].__counter > 0
&& deriv->steps[cnt].__end_fct != NULL)
- DL_CALL_FCT (deriv->steps[cnt].__end_fct, (&deriv->steps[cnt]));
+ {
+ assert (deriv->steps[cnt].__shlib_handle != NULL);
+
+ __gconv_end_fct end_fct = deriv->steps[cnt].__end_fct;
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (end_fct);
+#endif
+ DL_CALL_FCT (end_fct, (&deriv->steps[cnt]));
+ }
/* Free the name strings. */
free ((char *) deriv->steps[0].__from_name);
internal_function
__gconv_release_step (struct __gconv_step *step)
{
- if (--step->__counter == 0)
+ /* Skip builtin modules; they are not reference counted. */
+ if (step->__shlib_handle != NULL && --step->__counter == 0)
{
/* Call the destructor. */
if (step->__end_fct != NULL)
- DL_CALL_FCT (step->__end_fct, (step));
-
-#ifndef STATIC_GCONV
- /* Skip builtin modules; they are not reference counted. */
- if (step->__shlib_handle != NULL)
{
- /* Release the loaded module. */
- __gconv_release_shlib (step->__shlib_handle);
- step->__shlib_handle = NULL;
+ assert (step->__shlib_handle != NULL);
+
+ __gconv_end_fct end_fct = step->__end_fct;
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (end_fct);
+#endif
+ DL_CALL_FCT (end_fct, (step));
}
+
+#ifndef STATIC_GCONV
+ /* Release the loaded module. */
+ __gconv_release_shlib (step->__shlib_handle);
+ step->__shlib_handle = NULL;
#endif
}
+ else
+ /* Builtin modules should not have end functions. */
+ assert (step->__end_fct == NULL);
}
static int
result[step_cnt].__btowc_fct = NULL;
/* Call the init function. */
- if (result[step_cnt].__init_fct != NULL)
+ __gconv_init_fct init_fct = result[step_cnt].__init_fct;
+ if (init_fct != NULL)
{
- status = DL_CALL_FCT (result[step_cnt].__init_fct,
- (&result[step_cnt]));
+ assert (result[step_cnt].__shlib_handle != NULL);
+
+# ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (init_fct);
+# endif
+ status = DL_CALL_FCT (init_fct, (&result[step_cnt]));
if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
{
result[step_cnt].__end_fct = NULL;
break;
}
+
+# ifdef PTR_MANGLE
+ if (result[step_cnt].__btowc_fct != NULL)
+ PTR_MANGLE (result[step_cnt].__btowc_fct);
+# endif
}
}
else
}
/* Call the init function. */
- if (step->__init_fct != NULL)
- DL_CALL_FCT (step->__init_fct, (step));
+ __gconv_init_fct init_fct = step->__init_fct;
+ if (init_fct != NULL)
+ {
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (init_fct);
+#endif
+ DL_CALL_FCT (init_fct, (step));
+
+#ifdef PTR_MANGLE
+ if (step->__btowc_fct != NULL)
+ PTR_MANGLE (step->__btowc_fct);
+#endif
+ }
}
}
return result;
/* Handle loading/unloading of shared object for transformation.
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
#include <sys/param.h>
#include <gconv_int.h>
+#include <sysdep.h>
#ifdef DEBUG
found->init_fct = __libc_dlsym (found->handle, "gconv_init");
found->end_fct = __libc_dlsym (found->handle, "gconv_end");
+#ifdef PTR_MANGLE
+ PTR_MANGLE (found->fct);
+ if (found->init_fct != NULL)
+ PTR_MANGLE (found->init_fct);
+ if (found->end_fct != NULL)
+ PTR_MANGLE (found->end_fct);
+#endif
+
/* We have succeeded in loading the shared object. */
found->counter = 1;
}
# include <dlfcn.h>
#endif
+#include <sysdep.h>
+
#ifndef DL_CALL_FCT
# define DL_CALL_FCT(fct, args) fct args
#endif
{
struct __gconv_step *next_step = step + 1;
struct __gconv_step_data *next_data = data + 1;
- __gconv_fct fct;
+ __gconv_fct fct = NULL;
int status;
- fct = (data->__flags & __GCONV_IS_LAST) ? NULL : next_step->__fct;
+ if ((data->__flags & __GCONV_IS_LAST) == 0)
+ {
+ fct = next_step->__fct;
+#ifdef PTR_DEMANGLE
+ if (next_step->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+ }
/* If the function is called with no input this means we have to reset
to the initial state. The possibly partly converted input is
# include <wcsmbs/wcsmbsload.h>
# include <iconv/gconv_int.h>
# include <shlib-compat.h>
+# include <sysdep.h>
#endif
selected locale for LC_CTYPE. */
#ifdef _LIBC
{
- struct gconv_fcts fcts;
-
/* Clear the state. We start all over again. */
memset (&fp->_wide_data->_IO_state, '\0', sizeof (__mbstate_t));
memset (&fp->_wide_data->_IO_last_state, '\0', sizeof (__mbstate_t));
+ struct gconv_fcts fcts;
__wcsmbs_clone_conv (&fcts);
assert (fcts.towc_nsteps == 1);
assert (fcts.tomb_nsteps == 1);
cc->__cd_out.__cd.__data[0].__statep = &fp->_wide_data->_IO_state;
/* And now the transliteration. */
- cc->__cd_out.__cd.__data[0].__trans = &__libio_translit;
+ cc->__cd_out.__cd.__data[0].__trans
+ = (struct __gconv_trans_data *) &__libio_translit;
}
#else
# ifdef _GLIBCPP_USE_WCHAR_T
codecvt->__cd_out.__cd.__data[0].__outbufend = (unsigned char *) to_end;
codecvt->__cd_out.__cd.__data[0].__statep = statep;
- status = DL_CALL_FCT (gs->__fct,
+ __gconv_fct fct = gs->__fct;
+#ifdef PTR_DEMANGLE
+ if (gs->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+
+ status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_out.__cd.__data, &from_start_copy,
(const unsigned char *) from_end, NULL,
&dummy, 0, 0));
codecvt->__cd_out.__cd.__data[0].__outbufend = (unsigned char *) to_end;
codecvt->__cd_out.__cd.__data[0].__statep = statep;
- status = DL_CALL_FCT (gs->__fct,
+ __gconv_fct fct = gs->__fct;
+#ifdef PTR_DEMANGLE
+ if (gs->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+
+ status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_out.__cd.__data, NULL, NULL,
NULL, &dummy, 1, 0));
codecvt->__cd_in.__cd.__data[0].__outbufend = (unsigned char *) to_end;
codecvt->__cd_in.__cd.__data[0].__statep = statep;
- status = DL_CALL_FCT (gs->__fct,
+ __gconv_fct fct = gs->__fct;
+#ifdef PTR_DEMANGLE
+ if (gs->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+
+ status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_in.__cd.__data, &from_start_copy,
(const unsigned char *) from_end, NULL,
&dummy, 0, 0));
codecvt->__cd_in.__cd.__data[0].__outbufend = (unsigned char *) &to_buf[max];
codecvt->__cd_in.__cd.__data[0].__statep = statep;
- status = DL_CALL_FCT (gs->__fct,
+ __gconv_fct fct = gs->__fct;
+#ifdef PTR_DEMANGLE
+ if (gs->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+
+ status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_in.__cd.__data, &cp,
(const unsigned char *) from_end, NULL,
&dummy, 0, 0));
#include <wcsmbsload.h>
#include <limits.h>
+#include <sysdep.h>
+
wint_t
__btowc (c)
/* Get the conversion functions. */
fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE));
+ __gconv_btowc_fct btowc_fct = fcts->towc->__btowc_fct;
if (__builtin_expect (fcts->towc_nsteps == 1, 1)
- && __builtin_expect (fcts->towc->__btowc_fct != NULL, 1))
+ && __builtin_expect (btowc_fct != NULL, 1))
{
/* Use the shortcut function. */
- return DL_CALL_FCT (fcts->towc->__btowc_fct,
- (fcts->towc, (unsigned char) c));
+#ifdef PTR_DEMANGLE
+ if (fcts->towc->__shlib_handle != NULL)
+ PTR_DEMANGLE (btowc_fct);
+#endif
+ return DL_CALL_FCT (btowc_fct, (fcts->towc, (unsigned char) c));
}
else
{
/* Create the input string. */
inbuf[0] = c;
- status = DL_CALL_FCT (fcts->towc->__fct,
- (fcts->towc, &data, &inptr, inptr + 1,
- NULL, &dummy, 0, 1));
+ __gconv_fct fct = fcts->towc->__fct;
+#ifdef PTR_DEMANGLE
+ if (fcts->towc->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+ status = DL_CALL_FCT (fct, (fcts->towc, &data, &inptr, inptr + 1,
+ NULL, &dummy, 0, 1));
if (status != __GCONV_OK && status != __GCONV_FULL_OUTPUT
&& status != __GCONV_EMPTY_INPUT)
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <gconv.h>
#include <wchar.h>
#include <wcsmbsload.h>
-#include <assert.h>
+#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
endbuf = inbuf + n;
if (__builtin_expect (endbuf < inbuf, 0))
endbuf = (const unsigned char *) ~(uintptr_t) 0;
- status = DL_CALL_FCT (fcts->towc->__fct,
- (fcts->towc, &data, &inbuf, endbuf,
- NULL, &dummy, 0, 1));
+ __gconv_fct fct = fcts->towc->__fct;
+#ifdef PTR_DEMANGLE
+ if (fcts->towc->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+ status = DL_CALL_FCT (fct, (fcts->towc, &data, &inbuf, endbuf,
+ NULL, &dummy, 0, 1));
/* There must not be any problems with the conversion but illegal input
characters. The output buffer must be large enough, otherwise the
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <gconv.h>
#include <wchar.h>
#include <wcsmbsload.h>
-#include <assert.h>
+#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
/* Get the structure with the function pointers. */
towc = fcts->towc;
+ __gconv_fct fct = towc->__fct;
+#ifdef PTR_DEMANGLE
+ if (towc->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
/* We have to handle DST == NULL special. */
if (dst == NULL)
{
data.__outbuf = (unsigned char *) buf;
- status = DL_CALL_FCT (towc->__fct,
- (towc, &data, &inbuf, srcend, NULL,
- &dummy, 0, 1));
+ status = DL_CALL_FCT (fct, (towc, &data, &inbuf, srcend, NULL,
+ &dummy, 0, 1));
result += (wchar_t *) data.__outbuf - buf;
}
data.__outbuf = (unsigned char *) dst;
data.__outbufend = data.__outbuf + len * sizeof (wchar_t);
- status = DL_CALL_FCT (towc->__fct,
+ status = DL_CALL_FCT (fct,
(towc, &data, (const unsigned char **) src, srcend,
NULL, &dummy, 0, 1));
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <ctype.h>
#include <string.h>
#include "wcsmbsload.h"
#include <wchar.h>
#include <wcsmbsload.h>
-#include <assert.h>
+#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
/* Get the structure with the function pointers. */
towc = fcts->towc;
+ __gconv_fct fct = towc->__fct;
+#ifdef PTR_DEMANGLE
+ if (towc->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
/* We have to handle DST == NULL special. */
if (dst == NULL)
{
data.__outbuf = (unsigned char *) buf;
- status = DL_CALL_FCT (towc->__fct,
- (towc, &data, &inbuf, srcend, NULL,
- &non_reversible, 0, 1));
+ status = DL_CALL_FCT (fct, (towc, &data, &inbuf, srcend, NULL,
+ &non_reversible, 0, 1));
result += (wchar_t *) data.__outbuf - buf;
}
worst case we need one input byte for one output wchar_t. */
srcend = srcp + __strnlen ((const char *) srcp, len) + 1;
- status = DL_CALL_FCT (towc->__fct,
- (towc, &data, &srcp, srcend, NULL,
- &non_reversible, 0, 1));
+ status = DL_CALL_FCT (fct, (towc, &data, &srcp, srcend, NULL,
+ &non_reversible, 0, 1));
if ((status != __GCONV_EMPTY_INPUT
&& status != __GCONV_INCOMPLETE_INPUT)
/* Not all input read. */
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <gconv.h>
#include <wchar.h>
#include <wcsmbsload.h>
-#include <assert.h>
+#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
/* Get the conversion functions. */
fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE));
+ __gconv_fct fct = fcts->tomb->__fct;
+#ifdef PTR_DEMANGLE
+ if (fcts->tomb->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
/* If WC is the NUL character we write into the output buffer the byte
sequence necessary for PS to get into the initial state, followed
by a NUL byte. */
if (wc == L'\0')
{
- status = DL_CALL_FCT (fcts->tomb->__fct,
- (fcts->tomb, &data, NULL, NULL,
- NULL, &dummy, 1, 1));
+ status = DL_CALL_FCT (fct, (fcts->tomb, &data, NULL, NULL,
+ NULL, &dummy, 1, 1));
if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT)
*data.__outbuf++ = '\0';
/* Do a normal conversion. */
const unsigned char *inbuf = (const unsigned char *) &wc;
- status = DL_CALL_FCT (fcts->tomb->__fct,
+ status = DL_CALL_FCT (fct,
(fcts->tomb, &data, &inbuf,
inbuf + sizeof (wchar_t), NULL, &dummy, 0, 1));
}
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <gconv.h>
#include <wchar.h>
#include <wcsmbsload.h>
-#include <assert.h>
+#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
/* Get the structure with the function pointers. */
tomb = fcts->tomb;
+ __gconv_fct fct = tomb->__fct;
+#ifdef PTR_DEMANGLE
+ if (tomb->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
/* We have to handle DST == NULL special. */
if (dst == NULL)
{
data.__outbuf = buf;
- status = DL_CALL_FCT (tomb->__fct,
- (tomb, &data, &inbuf,
- (const unsigned char *) srcend, NULL,
- &dummy, 0, 1));
+ status = DL_CALL_FCT (fct, (tomb, &data, &inbuf,
+ (const unsigned char *) srcend, NULL,
+ &dummy, 0, 1));
/* Count the number of bytes. */
result += data.__outbuf - buf;
data.__outbuf = (unsigned char *) dst;
data.__outbufend = (unsigned char *) dst + len;
- status = DL_CALL_FCT (tomb->__fct,
- (tomb, &data, (const unsigned char **) src,
- (const unsigned char *) srcend, NULL,
- &dummy, 0, 1));
+ status = DL_CALL_FCT (fct, (tomb, &data, (const unsigned char **) src,
+ (const unsigned char *) srcend, NULL,
+ &dummy, 0, 1));
/* Count the number of bytes. */
result = data.__outbuf - (unsigned char *) dst;
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <dlfcn.h>
#include <errno.h>
#include <stdlib.h>
#include <wchar.h>
#include <wcsmbsload.h>
-#include <assert.h>
+#include <sysdep.h>
#ifndef EILSEQ
# define EILSEQ EINVAL
/* Get the structure with the function pointers. */
tomb = fcts->tomb;
+ __gconv_fct fct = tomb->__fct;
+#ifdef PTR_DEMANGLE
+ if (tomb->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
/* We have to handle DST == NULL special. */
if (dst == NULL)
{
data.__outbuf = buf;
- status = DL_CALL_FCT (tomb->__fct,
- (tomb, &data, &inbuf,
- (const unsigned char *) srcend, NULL,
- &dummy, 0, 1));
+ status = DL_CALL_FCT (fct, (tomb, &data, &inbuf,
+ (const unsigned char *) srcend, NULL,
+ &dummy, 0, 1));
/* Count the number of bytes. */
result += data.__outbuf - buf;
data.__outbuf = (unsigned char *) dst;
data.__outbufend = (unsigned char *) dst + len;
- status = DL_CALL_FCT (tomb->__fct,
- (tomb, &data, (const unsigned char **) src,
- (const unsigned char *) srcend, NULL,
- &dummy, 0, 1));
+ status = DL_CALL_FCT (fct, (tomb, &data, (const unsigned char **) src,
+ (const unsigned char *) srcend, NULL,
+ &dummy, 0, 1));
/* Count the number of bytes. */
result = data.__outbuf - (unsigned char *) dst;
#include <wchar.h>
#include <wcsmbsload.h>
+#include <sysdep.h>
+
int
wctob (c)
inbuf[0] = c;
const unsigned char *argptr = (const unsigned char *) inptr;
- status = DL_CALL_FCT (fcts->tomb->__fct,
+ __gconv_fct fct = fcts->tomb->__fct;
+#ifdef PTR_DEMANGLE
+ if (fcts->tomb->__shlib_handle != NULL)
+ PTR_DEMANGLE (fct);
+#endif
+ status = DL_CALL_FCT (fct,
(fcts->tomb, &data, &argptr,
argptr + sizeof (inbuf[0]), NULL, &dummy, 0, 1));