mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 14:00:30 +00:00
* 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.
This commit is contained in:
parent
477aa8698f
commit
915a6c51c5
16
ChangeLog
16
ChangeLog
@ -1,5 +1,21 @@
|
||||
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.
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* 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.
|
||||
|
||||
@ -20,10 +20,13 @@
|
||||
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
|
||||
@ -45,9 +48,15 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
|
||||
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));
|
||||
@ -60,7 +69,7 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
|
||||
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));
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
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>
|
||||
@ -28,6 +29,7 @@
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <gconv_int.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
|
||||
/* Simple data structure for alias mapping. We have two names, `from'
|
||||
@ -180,7 +182,15 @@ free_derivation (void *p)
|
||||
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);
|
||||
@ -196,22 +206,30 @@ void
|
||||
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));
|
||||
{
|
||||
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
|
||||
/* 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;
|
||||
}
|
||||
/* 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
|
||||
@ -272,10 +290,15 @@ gen_steps (struct derivation_step *best, const char *toset,
|
||||
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)
|
||||
{
|
||||
@ -285,6 +308,11 @@ gen_steps (struct derivation_step *best, const char *toset,
|
||||
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
|
||||
@ -362,8 +390,19 @@ increment_counter (struct __gconv_step *steps, size_t nsteps)
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
@ -29,6 +29,7 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <gconv_int.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -130,6 +131,14 @@ __gconv_find_shlib (const char *name)
|
||||
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;
|
||||
}
|
||||
|
@ -144,6 +144,8 @@
|
||||
# include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifndef DL_CALL_FCT
|
||||
# define DL_CALL_FCT(fct, args) fct args
|
||||
#endif
|
||||
@ -393,10 +395,17 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
||||
{
|
||||
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
|
||||
|
@ -40,6 +40,7 @@
|
||||
# include <wcsmbs/wcsmbsload.h>
|
||||
# include <iconv/gconv_int.h>
|
||||
# include <shlib-compat.h>
|
||||
# include <sysdep.h>
|
||||
#endif
|
||||
|
||||
|
||||
@ -126,12 +127,11 @@ _IO_fwide (fp, mode)
|
||||
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);
|
||||
@ -159,7 +159,8 @@ _IO_fwide (fp, mode)
|
||||
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
|
||||
@ -232,7 +233,13 @@ do_out (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
||||
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));
|
||||
@ -298,7 +305,13 @@ do_unshift (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
||||
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));
|
||||
|
||||
@ -361,7 +374,13 @@ do_in (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
||||
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));
|
||||
@ -459,7 +478,13 @@ do_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
||||
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));
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <wcsmbsload.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
|
||||
wint_t
|
||||
__btowc (c)
|
||||
@ -45,13 +47,17 @@ __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
|
||||
{
|
||||
@ -78,9 +84,13 @@ __btowc (c)
|
||||
/* 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)
|
||||
|
@ -18,13 +18,14 @@
|
||||
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
|
||||
@ -73,9 +74,13 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||
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
|
||||
|
@ -17,6 +17,7 @@
|
||||
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>
|
||||
@ -24,7 +25,7 @@
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
# define EILSEQ EINVAL
|
||||
@ -69,6 +70,11 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
||||
|
||||
/* 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)
|
||||
@ -82,9 +88,8 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
||||
{
|
||||
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;
|
||||
}
|
||||
@ -103,7 +108,7 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
||||
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));
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
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"
|
||||
@ -28,7 +29,7 @@
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
# define EILSEQ EINVAL
|
||||
@ -63,6 +64,11 @@ __mbsrtowcs_l (dst, src, len, ps, l)
|
||||
|
||||
/* 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)
|
||||
@ -81,9 +87,8 @@ __mbsrtowcs_l (dst, src, len, ps, l)
|
||||
{
|
||||
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;
|
||||
}
|
||||
@ -116,9 +121,8 @@ __mbsrtowcs_l (dst, src, len, ps, l)
|
||||
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. */
|
||||
|
@ -17,6 +17,7 @@
|
||||
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>
|
||||
@ -24,7 +25,7 @@
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
# define EILSEQ EINVAL
|
||||
@ -65,15 +66,19 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
|
||||
|
||||
/* 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';
|
||||
@ -83,7 +88,7 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
|
||||
/* 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));
|
||||
}
|
||||
|
@ -17,13 +17,14 @@
|
||||
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
|
||||
@ -67,6 +68,11 @@ __wcsnrtombs (dst, src, nwc, len, ps)
|
||||
|
||||
/* 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)
|
||||
@ -82,10 +88,9 @@ __wcsnrtombs (dst, src, nwc, len, ps)
|
||||
{
|
||||
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;
|
||||
@ -107,10 +112,9 @@ __wcsnrtombs (dst, src, nwc, len, ps)
|
||||
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;
|
||||
|
@ -17,6 +17,7 @@
|
||||
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>
|
||||
@ -24,7 +25,7 @@
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
# define EILSEQ EINVAL
|
||||
@ -59,6 +60,11 @@ __wcsrtombs (dst, src, len, ps)
|
||||
|
||||
/* 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)
|
||||
@ -79,10 +85,9 @@ __wcsrtombs (dst, src, len, ps)
|
||||
{
|
||||
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;
|
||||
@ -108,10 +113,9 @@ __wcsrtombs (dst, src, len, ps)
|
||||
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;
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
|
||||
int
|
||||
wctob (c)
|
||||
@ -64,7 +66,12 @@ 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));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user