Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Complete the removal of __gconv_translit_find
Prior to the 2.20 release, the function was just changed to fail
unconditionally, in commit a1a6a40.
This commit removes the function completely, including gconv bits
which depend on it.

This changes the gconv ABI, which is not a public interface.
  • Loading branch information
Florian Weimer committed Sep 12, 2014
1 parent 5379aeb commit ba7b4d2
Show file tree
Hide file tree
Showing 20 changed files with 75 additions and 287 deletions.
39 changes: 39 additions & 0 deletions ChangeLog
@@ -1,3 +1,42 @@
2014-08-12 Florian Weimer <fweimer@redhat.com>

* 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.

2014-09-12 Siddhesh Poyarekar <siddhesh@redhat.com>

[BZ #16194]
Expand Down
3 changes: 3 additions & 0 deletions iconv/Versions
Expand Up @@ -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;
}
}
48 changes: 11 additions & 37 deletions iconv/gconv.h
Expand Up @@ -56,15 +56,15 @@ enum
{
__GCONV_IS_LAST = 0x0001,
__GCONV_IGNORE_ERRORS = 0x0002,
__GCONV_SWAP = 0x0004
__GCONV_SWAP = 0x0004,
__GCONV_TRANSLIT = 0x0008
};


/* Forward declarations. */
struct __gconv_step;
struct __gconv_step_data;
struct __gconv_loaded_object;
struct __gconv_trans_data;


/* Type of a conversion function. */
Expand All @@ -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
{
Expand Down Expand Up @@ -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;
};


Expand All @@ -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 */
14 changes: 0 additions & 14 deletions iconv/gconv_close.c
Expand Up @@ -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);
}
Expand Down
30 changes: 1 addition & 29 deletions iconv/gconv_int.h
Expand Up @@ -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
{
Expand Down Expand Up @@ -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)
Expand Down
152 changes: 9 additions & 143 deletions iconv/gconv_open.c
Expand Up @@ -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, '/');
Expand All @@ -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);
}
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit ba7b4d2

Please sign in to comment.