From patchwork Wed Sep 10 11:37:22 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 387694 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 925ED14003E for ; Wed, 10 Sep 2014 21:37:39 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :content-type; q=dns; s=default; b=U8pTsZRP4aePpyOLmJ6HFhKvHBtg8 Jw/bciDp753WRtqkrbMu+DI8W/EPCCTfov6pW+eXL88wR54KaT5oZzgcI/srLnuU 08zTkqUb3crCSQO2AU7h0b1jhLTbm3u/F08tjOtpLsQe5CMcOtl6iKrZu6PrUbeQ SLu8AdWnwyEls0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :content-type; s=default; bh=F7Is+bKF2uJley+cjM4wN/5bhEM=; b=HrY c0O4p5biEJ69HZKXXQv+NvoHbBtb1mauRmNoi/7b2t5/CbNfIaqoZzo2Obh24zbZ WPO2ueYO2ohencKCr1+oI1sQu1c75ub6mRBfVCS0qNQISii3m6IiaAj4X/cJ+Wgy F++PF4BMHDI0Bk41jc4iUPUMiVUkuJyLA1sXID1I= Received: (qmail 28587 invoked by alias); 10 Sep 2014 11:37:33 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 28575 invoked by uid 89); 10 Sep 2014 11:37:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.5 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Message-ID: <541037F2.6000009@redhat.com> Date: Wed, 10 Sep 2014 13:37:22 +0200 From: Florian Weimer User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.1.0 MIME-Version: 1.0 To: GNU C Library Subject: [PATCH] Complete the removal of __gconv_translit_find This patch completely removes the gconv transliteration module support. It changes ABI for gconv modules. Based on a cursory glance, it now matches again what was documented in the manual. This was tested on Fedora 20 x86_64, without any regressions. There are no test suite removals because this functionality has been never tested. Related patches/discussions: https://sourceware.org/ml/libc-alpha/2014-08/msg00119.html https://sourceware.org/ml/libc-alpha/2014-08/msg00115.html https://sourceware.org/ml/libc-alpha/2014-08/msg00352.html From 91b24879847765257593f9572f93456c62190e06 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 10 Sep 2014 11:49:38 +0200 Subject: [PATCH] Complete the removal of __gconv_translit_find Prior to the 2.20 release, the function was just changed to fail unconditionally, in commit a1a6a401ab0a3c9f15fb7eaebbdcee24192254e8. This commit removes the function completely, including gconv bits which depend on it. This changes the gconv ABI, which is not a public interface. 2014-08-08 Florian Weimer * iconv/gconv_open.c (__gconv_open): Remove transliteration module loading. * iconv/Versions (__gconv_transliterate): Export for use from gconv modules. * iconv/gconv.h (__GCONV_TRANSLIT): New flag. (struct __gconv_trans_data, __gconv_trans_fct, __gconv_trans_context_fct, __gconv_trans_query_fct, __gconv_trans_init_fct, __gconv_trans_end_fct): Remove type definitions. (struct __gconv_step_data): Remove __trans member. (__gconv_transliterate): Declaration moved from gconv_int.h. No longer hidden. Remove unused trans_data argument. * iconv/gconv_int.h (struct trans_struct): Remove definition. (__gconv_translit_find): Remove declaration. (__gconv_transliterate): Declaration moved to gconv.h. Add hidden prototype. * iconv/gconv_close.c (__gconv_close): Remove __trans cleanup. * iconv/gconv_trans.c (__gconv_transliterate): Remove unused trans_data argument. Add hidden definition. (__gconv_translit_find): Remove. * iconv/loop.c (STANDARD_TO_LOOP_ERR_HANDLER): Call __gconv_transliterate directly if __GCONV_TRANSLIT is set. * iconv/skeleton.c: Remove transliteration initialization. * libio/fileops.c (_IO_new_file_fopen): Adjust struct __gconv_step_data initialization. * libio/iofwide.c (__libio_translit_): Remove. (_IO_fwide): Adjust struct __gconv_step_data initialization. * wcsmbs/btowc.c (__btowc): Likewise. * wcsmbs/mbrtoc16.c (mbrtoc16): Likewise. * wcsmbs/mbrtowc.c (__mbrtowc): Likewise. * wcsmbs/mbsnrtowcs.c (__mbsnrtowcs): Likewise. * wcsmbs/mbsrtowcs_l.c (__mbsrtowcs_l): Likewise. * wcsmbs/wcrtomb.c (__wcrtomb): Likewise. * wcsmbs/wcsnrtombs.c (__wcsnrtombs): Likewise. * wcsmbs/wcsrtombs.c (__wcsrtombs): Likewise. * wcsmbs/wctob.c (wctob): Likewise. diff --git a/iconv/Versions b/iconv/Versions index 5d50cf1..60ab10a 100644 --- a/iconv/Versions +++ b/iconv/Versions @@ -6,5 +6,8 @@ libc { GLIBC_PRIVATE { # functions shared with iconv program __gconv_get_alias_db; __gconv_get_cache; __gconv_get_modules_db; + + # function used by the gconv modules + __gconv_transliterate; } } diff --git a/iconv/gconv.h b/iconv/gconv.h index 108dccb..7d59bb0 100644 --- a/iconv/gconv.h +++ b/iconv/gconv.h @@ -56,7 +56,8 @@ enum { __GCONV_IS_LAST = 0x0001, __GCONV_IGNORE_ERRORS = 0x0002, - __GCONV_SWAP = 0x0004 + __GCONV_SWAP = 0x0004, + __GCONV_TRANSLIT = 0x0008 }; @@ -64,7 +65,6 @@ enum struct __gconv_step; struct __gconv_step_data; struct __gconv_loaded_object; -struct __gconv_trans_data; /* Type of a conversion function. */ @@ -80,38 +80,6 @@ typedef int (*__gconv_init_fct) (struct __gconv_step *); typedef void (*__gconv_end_fct) (struct __gconv_step *); -/* Type of a transliteration/transscription function. */ -typedef int (*__gconv_trans_fct) (struct __gconv_step *, - struct __gconv_step_data *, void *, - const unsigned char *, - const unsigned char **, - const unsigned char *, unsigned char **, - size_t *); - -/* Function to call to provide transliteration module with context. */ -typedef int (*__gconv_trans_context_fct) (void *, const unsigned char *, - const unsigned char *, - unsigned char *, unsigned char *); - -/* Function to query module about supported encoded character sets. */ -typedef int (*__gconv_trans_query_fct) (const char *, const char ***, - size_t *); - -/* Constructor and destructor for local data for transliteration. */ -typedef int (*__gconv_trans_init_fct) (void **, const char *); -typedef void (*__gconv_trans_end_fct) (void *); - -struct __gconv_trans_data -{ - /* Transliteration/Transscription function. */ - __gconv_trans_fct __trans_fct; - __gconv_trans_context_fct __trans_context_fct; - __gconv_trans_end_fct __trans_end_fct; - void *__data; - struct __gconv_trans_data *__next; -}; - - /* Description of a conversion step. */ struct __gconv_step { @@ -163,9 +131,6 @@ struct __gconv_step_data __mbstate_t *__statep; __mbstate_t __state; /* This element must not be used directly by any module; always use STATEP! */ - - /* Transliteration information. */ - struct __gconv_trans_data *__trans; }; @@ -177,4 +142,13 @@ typedef struct __gconv_info __extension__ struct __gconv_step_data __data __flexarr; } *__gconv_t; +/* Transliteration using the locale's data. */ +extern int __gconv_transliterate (struct __gconv_step *step, + struct __gconv_step_data *step_data, + const unsigned char *inbufstart, + const unsigned char **inbufp, + const unsigned char *inbufend, + unsigned char **outbufstart, + size_t *irreversible); + #endif /* gconv.h */ diff --git a/iconv/gconv_close.c b/iconv/gconv_close.c index 81f0e0b..f6394af 100644 --- a/iconv/gconv_close.c +++ b/iconv/gconv_close.c @@ -37,20 +37,6 @@ __gconv_close (__gconv_t cd) drunp = cd->__data; do { - struct __gconv_trans_data *transp; - - transp = drunp->__trans; - while (transp != NULL) - { - struct __gconv_trans_data *curp = transp; - transp = transp->__next; - - if (__glibc_unlikely (curp->__trans_end_fct != NULL)) - curp->__trans_end_fct (curp->__data); - - free (curp); - } - if (!(drunp->__flags & __GCONV_IS_LAST) && drunp->__outbuf != NULL) free (drunp->__outbuf); } diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h index ace076b..13b0e99 100644 --- a/iconv/gconv_int.h +++ b/iconv/gconv_int.h @@ -92,21 +92,6 @@ struct gconv_module }; -/* Internal data structure to represent transliteration module. */ -struct trans_struct -{ - const char *name; - struct trans_struct *next; - - const char **csnames; - size_t ncsnames; - __gconv_trans_fct trans_fct; - __gconv_trans_context_fct trans_context_fct; - __gconv_trans_init_fct trans_init_fct; - __gconv_trans_end_fct trans_end_fct; -}; - - /* Flags for `gconv_open'. */ enum { @@ -258,20 +243,7 @@ extern void __gconv_get_builtin_trans (const char *name, struct __gconv_step *step) internal_function; -/* Try to load transliteration step module. */ -extern int __gconv_translit_find (struct trans_struct *trans) - internal_function; - -/* Transliteration using the locale's data. */ -extern int __gconv_transliterate (struct __gconv_step *step, - struct __gconv_step_data *step_data, - void *trans_data, - const unsigned char *inbufstart, - const unsigned char **inbufp, - const unsigned char *inbufend, - unsigned char **outbufstart, - size_t *irreversible) attribute_hidden; - +libc_hidden_proto (__gconv_transliterate) /* If NAME is an codeset alias expand it. */ extern int __gconv_compare_alias (const char *name1, const char *name2) diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c index bfbe22b..615f33d 100644 --- a/iconv/gconv_open.c +++ b/iconv/gconv_open.c @@ -39,7 +39,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, int conv_flags = 0; const char *errhand; const char *ignore; - struct trans_struct *trans = NULL; + bool translit = false; /* Find out whether any error handling method is specified. */ errhand = strchr (toset, '/'); @@ -66,72 +66,10 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, while (tok != NULL) { if (__strcasecmp_l (tok, "TRANSLIT", _nl_C_locobj_ptr) == 0) - { - /* It's the builtin transliteration handling. We only - support it for working on the internal encoding. */ - static const char *const internal_trans_names[1] - = { "INTERNAL" }; - struct trans_struct *lastp = NULL; - struct trans_struct *runp; - - for (runp = trans; runp != NULL; runp = runp->next) - if (runp->trans_fct == __gconv_transliterate) - break; - else - lastp = runp; - - if (runp == NULL) - { - struct trans_struct *newp; - - newp = (struct trans_struct *) alloca (sizeof (*newp)); - memset (newp, '\0', sizeof (*newp)); - - /* We leave the `name' field zero to signal that - this is an internal transliteration step. */ - newp->csnames = (const char **) internal_trans_names; - newp->ncsnames = 1; - newp->trans_fct = __gconv_transliterate; - - if (lastp == NULL) - trans = newp; - else - lastp->next = newp; - } - } + translit = true; else if (__strcasecmp_l (tok, "IGNORE", _nl_C_locobj_ptr) == 0) /* Set the flag to ignore all errors. */ conv_flags |= __GCONV_IGNORE_ERRORS; - else - { - /* `tok' is possibly a module name. We'll see later - whether we can find it. But first see that we do - not already a module of this name. */ - struct trans_struct *lastp = NULL; - struct trans_struct *runp; - - for (runp = trans; runp != NULL; runp = runp->next) - if (runp->name != NULL - && __strcasecmp_l (tok, runp->name, - _nl_C_locobj_ptr) == 0) - break; - else - lastp = runp; - - if (runp == NULL) - { - struct trans_struct *newp; - - newp = (struct trans_struct *) alloca (sizeof (*newp)); - memset (newp, '\0', sizeof (*newp)); - newp->name = tok; - - if (lastp == NULL) - trans = newp; - else - lastp->next = newp; - } - } tok = __strtok_r (NULL, ",", &ptr); } @@ -172,25 +110,6 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, res = __gconv_find_transform (toset, fromset, &steps, &nsteps, flags); if (res == __GCONV_OK) { - /* Find the modules. */ - struct trans_struct *lastp = NULL; - struct trans_struct *runp; - - for (runp = trans; runp != NULL; runp = runp->next) - { - if (runp->name == NULL - || __builtin_expect (__gconv_translit_find (runp), 0) == 0) - lastp = runp; - else - { - /* This means we haven't found the module. Remove it. */ - if (lastp == NULL) - trans = runp->next; - else - lastp->next = runp->next; - } - } - /* Allocate room for handle. */ result = (__gconv_t) malloc (sizeof (struct __gconv_info) + (nsteps @@ -199,8 +118,6 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, res = __GCONV_NOMEM; else { - size_t n; - /* Remember the list of steps. */ result->__steps = steps; result->__nsteps = nsteps; @@ -228,47 +145,12 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, /* We use the `mbstate_t' member in DATA. */ result->__data[cnt].__statep = &result->__data[cnt].__state; - /* Now see whether we can use any of the transliteration - modules for this step. */ - for (runp = trans; runp != NULL; runp = runp->next) - for (n = 0; n < runp->ncsnames; ++n) - if (__strcasecmp_l (steps[cnt].__from_name, - runp->csnames[n], _nl_C_locobj_ptr) == 0) - { - void *data = NULL; - - /* Match! Now try the initializer. */ - if (runp->trans_init_fct == NULL - || (runp->trans_init_fct (&data, - steps[cnt].__to_name) - == __GCONV_OK)) - { - /* Append at the end of the list. */ - struct __gconv_trans_data *newp; - struct __gconv_trans_data **lastp; - - newp = (struct __gconv_trans_data *) - malloc (sizeof (struct __gconv_trans_data)); - if (newp == NULL) - { - res = __GCONV_NOMEM; - goto bail; - } - - newp->__trans_fct = runp->trans_fct; - newp->__trans_context_fct = runp->trans_context_fct; - newp->__trans_end_fct = runp->trans_end_fct; - newp->__data = data; - newp->__next = NULL; - - lastp = &result->__data[cnt].__trans; - while (*lastp != NULL) - lastp = &(*lastp)->__next; - - *lastp = newp; - } - break; - } + /* The builtin transliteration handling only + supports the internal encoding. */ + if (translit + && __strcasecmp_l (steps[cnt].__from_name, + "INTERNAL", _nl_C_locobj_ptr) == 0) + conv_flags |= __GCONV_TRANSLIT; /* If this is the last step we must not allocate an output buffer. */ @@ -309,23 +191,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, if (result != NULL) { while (cnt-- > 0) - { - struct __gconv_trans_data *transp; - - transp = result->__data[cnt].__trans; - while (transp != NULL) - { - struct __gconv_trans_data *curp = transp; - transp = transp->__next; - - if (__glibc_unlikely (curp->__trans_end_fct != NULL)) - curp->__trans_end_fct (curp->__data); - - free (curp); - } - - free (result->__data[cnt].__outbuf); - } + free (result->__data[cnt].__outbuf); free (result); result = NULL; diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c index e0835fc..65b5539 100644 --- a/iconv/gconv_trans.c +++ b/iconv/gconv_trans.c @@ -32,7 +32,6 @@ int __gconv_transliterate (struct __gconv_step *step, struct __gconv_step_data *step_data, - void *trans_data __attribute__ ((unused)), const unsigned char *inbufstart, const unsigned char **inbufp, const unsigned char *inbufend, @@ -237,13 +236,4 @@ __gconv_transliterate (struct __gconv_step *step, /* Haven't found a match. */ return __GCONV_ILLEGAL_INPUT; } - -int -internal_function -__gconv_translit_find (struct trans_struct *trans) -{ - /* Transliteration module loading has been removed because it never - worked as intended and suffered from a security vulnerability. - Consequently, this function always fails. */ - return 1; -} +libc_hidden_def (__gconv_transliterate) diff --git a/iconv/loop.c b/iconv/loop.c index a480c0c..f4430ed 100644 --- a/iconv/loop.c +++ b/iconv/loop.c @@ -213,8 +213,6 @@ points. */ #define STANDARD_TO_LOOP_ERR_HANDLER(Incr) \ { \ - struct __gconv_trans_data *trans; \ - \ result = __GCONV_ILLEGAL_INPUT; \ \ if (irreversible == NULL) \ @@ -227,14 +225,10 @@ UPDATE_PARAMS; \ \ /* First try the transliteration methods. */ \ - for (trans = step_data->__trans; trans != NULL; trans = trans->__next) \ - { \ - result = DL_CALL_FCT (trans->__trans_fct, \ - (step, step_data, trans->__data, *inptrp, \ - &inptr, inend, &outptr, irreversible)); \ - if (result != __GCONV_ILLEGAL_INPUT) \ - break; \ - } \ + if ((step_data->__flags & __GCONV_TRANSLIT) != 0) \ + result = __gconv_transliterate \ + (step, step_data, *inptrp, \ + &inptr, inend, &outptr, irreversible); \ \ REINIT_PARAMS; \ \ diff --git a/iconv/skeleton.c b/iconv/skeleton.c index 73dc186..acd60e2 100644 --- a/iconv/skeleton.c +++ b/iconv/skeleton.c @@ -501,8 +501,9 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data, } else { - /* We preserve the initial values of the pointer variables. */ - const unsigned char *inptr = *inptrp; + /* We preserve the initial values of the pointer variables, + but only some conversion modules need it. */ + const unsigned char *inptr __attribute__ ((__unused__)) = *inptrp; unsigned char *outbuf = (__builtin_expect (outbufstart == NULL, 1) ? data->__outbuf : *outbufstart); unsigned char *outend = data->__outbufend; @@ -592,8 +593,6 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data, while (1) { - struct __gconv_trans_data *trans; - /* Remember the start value for this round. */ inptr = *inptrp; /* The outbuf buffer is empty. */ @@ -640,13 +639,6 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data, return status; } - /* Give the transliteration module the chance to store the - original text and the result in case it needs a context. */ - for (trans = data->__trans; trans != NULL; trans = trans->__next) - if (trans->__trans_context_fct != NULL) - DL_CALL_FCT (trans->__trans_context_fct, - (trans->__data, inptr, *inptrp, outstart, outbuf)); - /* We finished one use of the loops. */ ++data->__invocation_counter; diff --git a/libio/fileops.c b/libio/fileops.c index 204cfea..e0d7b76 100644 --- a/libio/fileops.c +++ b/libio/fileops.c @@ -403,21 +403,16 @@ _IO_new_file_fopen (fp, filename, mode, is32not64) cc->__cd_in.__cd.__data[0].__flags = __GCONV_IS_LAST; cc->__cd_in.__cd.__data[0].__statep = &result->_wide_data->_IO_state; - /* XXX For now no transliteration. */ - cc->__cd_in.__cd.__data[0].__trans = NULL; - cc->__cd_out.__cd.__nsteps = fcts.tomb_nsteps; cc->__cd_out.__cd.__steps = fcts.tomb; cc->__cd_out.__cd.__data[0].__invocation_counter = 0; cc->__cd_out.__cd.__data[0].__internal_use = 1; - cc->__cd_out.__cd.__data[0].__flags = __GCONV_IS_LAST; + cc->__cd_out.__cd.__data[0].__flags + = __GCONV_IS_LAST | __GCONV_TRANSLIT; cc->__cd_out.__cd.__data[0].__statep = &result->_wide_data->_IO_state; - /* And now the transliteration. */ - cc->__cd_out.__cd.__data[0].__trans = &__libio_translit; - /* From now on use the wide character callback functions. */ ((struct _IO_FILE_plus *) fp)->vtable = fp->_wide_data->_wide_vtable; diff --git a/libio/iofwide.c b/libio/iofwide.c index 64187e4..ecf5819 100644 --- a/libio/iofwide.c +++ b/libio/iofwide.c @@ -81,14 +81,6 @@ const struct _IO_codecvt __libio_codecvt = }; -#ifdef _LIBC -const struct __gconv_trans_data __libio_translit attribute_hidden = -{ - .__trans_fct = __gconv_transliterate -}; -#endif - - /* Return orientation of stream. If mode is nonzero try to change the orientation first. */ #undef _IO_fwide @@ -146,20 +138,14 @@ _IO_fwide (fp, mode) cc->__cd_in.__cd.__data[0].__flags = __GCONV_IS_LAST; cc->__cd_in.__cd.__data[0].__statep = &fp->_wide_data->_IO_state; - /* XXX For now no transliteration. */ - cc->__cd_in.__cd.__data[0].__trans = NULL; - cc->__cd_out.__cd.__nsteps = fcts.tomb_nsteps; cc->__cd_out.__cd.__steps = fcts.tomb; cc->__cd_out.__cd.__data[0].__invocation_counter = 0; cc->__cd_out.__cd.__data[0].__internal_use = 1; - cc->__cd_out.__cd.__data[0].__flags = __GCONV_IS_LAST; + cc->__cd_out.__cd.__data[0].__flags + = __GCONV_IS_LAST | __GCONV_TRANSLIT; cc->__cd_out.__cd.__data[0].__statep = &fp->_wide_data->_IO_state; - - /* And now the transliteration. */ - cc->__cd_out.__cd.__data[0].__trans - = (struct __gconv_trans_data *) &__libio_translit; } #else # ifdef _GLIBCPP_USE_WCHAR_T diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c index 289736f..aafb392 100644 --- a/wcsmbs/btowc.c +++ b/wcsmbs/btowc.c @@ -75,7 +75,6 @@ __btowc (c) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = &data.__state; - data.__trans = NULL; /* Make sure we start in the initial state. */ memset (&data.__state, '\0', sizeof (mbstate_t)); diff --git a/wcsmbs/mbrtoc16.c b/wcsmbs/mbrtoc16.c index 643aaf5..69105ba 100644 --- a/wcsmbs/mbrtoc16.c +++ b/wcsmbs/mbrtoc16.c @@ -67,7 +67,6 @@ mbrtoc16 (char16_t *pc16, const char *s, size_t n, mbstate_t *ps) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps; - data.__trans = NULL; /* A first special case is if S is NULL. This means put PS in the initial state. */ diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c index c57217a..8070bd8 100644 --- a/wcsmbs/mbrtowc.c +++ b/wcsmbs/mbrtowc.c @@ -49,7 +49,6 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps ?: &state; - data.__trans = NULL; /* A first special case is if S is NULL. This means put PS in the initial state. */ diff --git a/wcsmbs/mbsnrtowcs.c b/wcsmbs/mbsnrtowcs.c index f91e580..e611dde 100644 --- a/wcsmbs/mbsnrtowcs.c +++ b/wcsmbs/mbsnrtowcs.c @@ -58,7 +58,6 @@ __mbsnrtowcs (dst, src, nmc, len, ps) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps ?: &state; - data.__trans = NULL; if (nmc == 0) return 0; diff --git a/wcsmbs/mbsrtowcs_l.c b/wcsmbs/mbsrtowcs_l.c index 08ff3c9..5e10a7e 100644 --- a/wcsmbs/mbsrtowcs_l.c +++ b/wcsmbs/mbsrtowcs_l.c @@ -56,7 +56,6 @@ __mbsrtowcs_l (dst, src, len, ps, l) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps; - data.__trans = NULL; /* Get the conversion functions. */ fcts = get_gconv_fcts (l->__locales[LC_CTYPE]); diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c index be93877..67c68d3 100644 --- a/wcsmbs/wcrtomb.c +++ b/wcsmbs/wcrtomb.c @@ -49,7 +49,6 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps ?: &state; - data.__trans = NULL; /* A first special case is if S is NULL. This means put PS in the initial state. */ diff --git a/wcsmbs/wcsnrtombs.c b/wcsmbs/wcsnrtombs.c index 6fe718d..015d08c 100644 --- a/wcsmbs/wcsnrtombs.c +++ b/wcsmbs/wcsnrtombs.c @@ -56,7 +56,6 @@ __wcsnrtombs (dst, src, nwc, len, ps) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps ?: &state; - data.__trans = NULL; if (nwc == 0) return 0; diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c index 24e249c..988b468 100644 --- a/wcsmbs/wcsrtombs.c +++ b/wcsmbs/wcsrtombs.c @@ -52,7 +52,6 @@ __wcsrtombs (dst, src, len, ps) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = ps ?: &state; - data.__trans = NULL; /* Get the conversion functions. */ fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c index 24c33ce..8e65738 100644 --- a/wcsmbs/wctob.c +++ b/wcsmbs/wctob.c @@ -53,7 +53,6 @@ wctob (c) data.__internal_use = 1; data.__flags = __GCONV_IS_LAST; data.__statep = &data.__state; - data.__trans = NULL; /* Make sure we start in the initial state. */ memset (&data.__state, '\0', sizeof (mbstate_t)); -- 1.9.3