diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-07-13 01:58:04 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-07-13 01:58:04 +0000 |
commit | 405b8c60d0b63d21f3a1e185eddc321c842b5a9d (patch) | |
tree | fac022206af85ed84600c154a4ce98c24842c306 /iconv | |
parent | 7039a4c9129931023b60df2ef8b232e6d4ac7ca9 (diff) | |
download | glibc-405b8c60d0b63d21f3a1e185eddc321c842b5a9d.tar.gz |
Update.
* iconv/gconv_db.c (gen_steps): Always initialize __data field of
step.
* iconv/gconv_open.c (__gconv_open): Reapply
2000-07-12 Bruno Haible <haible@clisp.cons.org>
* iconv/gconv_open.c (__gconv_open): Merge duplicated
code.
Diffstat (limited to 'iconv')
-rw-r--r-- | iconv/gconv_db.c | 1 | ||||
-rw-r--r-- | iconv/gconv_open.c | 76 |
2 files changed, 19 insertions, 58 deletions
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c index 4aac076538..0caf310b91 100644 --- a/iconv/gconv_db.c +++ b/iconv/gconv_db.c @@ -234,6 +234,7 @@ gen_steps (struct derivation_step *best, const char *toset, &result[step_cnt]); /* Call the init function. */ + result[step_cnt].__data = NULL; if (result[step_cnt].__init_fct != NULL) { status = DL_CALL_FCT (result[step_cnt].__init_fct, diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c index c54054a3e5..cf4397eca2 100644 --- a/iconv/gconv_open.c +++ b/iconv/gconv_open.c @@ -184,14 +184,10 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, /* Call all initialization functions for the transformation step implementations. */ - for (cnt = 0; cnt < nsteps - 1; ++cnt) + for (cnt = 0; cnt < nsteps; ++cnt) { size_t size; - /* If this is the last step we must not allocate an - output buffer. */ - result->__data[cnt].__flags = conv_flags; - /* Would have to be done if we would not clear the whole array above. */ #if 0 @@ -205,16 +201,6 @@ __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; - /* Allocate the buffer. */ - size = (GCONV_NCHAR_GOAL * steps[cnt].__max_needed_to); - - result->__data[cnt].__outbuf = (char *) malloc (size); - if (result->__data[cnt].__outbuf == NULL) - goto bail; - - result->__data[cnt].__outbufend = - result->__data[cnt].__outbuf + size; - /* Now see whether we can use any of the transliteration modules for this step. */ for (runp = trans; runp != NULL; runp = runp->next) @@ -255,57 +241,31 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, } break; } - } - /* Now handle the last entry. */ - result->__data[cnt].__flags = conv_flags | __GCONV_IS_LAST; - /* Would have to be done if we would not clear the whole - array above. */ -#if 0 - result->__data[cnt].__invocation_counter = 0; - result->__data[cnt].__internal_use = 0; -#endif - result->__data[cnt].__statep = &result->__data[cnt].__state; - - /* Now see whether we can use the transliteration module - for this step. */ - for (runp = trans; runp != NULL; runp = runp->next) - for (n = 0; n < runp->ncsnames; ++n) - if (__strcasecmp (steps[cnt].__from_name, runp->csnames[n]) == 0) + /* If this is the last step we must not allocate an + output buffer. */ + if (cnt < nsteps - 1) { - 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 *endp; - struct __gconv_trans_data *lastp; + result->__data[cnt].__flags = conv_flags; - newp = (struct __gconv_trans_data *) - malloc (sizeof (struct __gconv_trans_data)); - if (newp == NULL) - goto bail; + /* Allocate the buffer. */ + size = (GCONV_NCHAR_GOAL * steps[cnt].__max_needed_to); - newp->__trans_fct = runp->trans_fct; - newp->__trans_context_fct = runp->trans_context_fct; - newp->__trans_end_fct = runp->trans_end_fct; + result->__data[cnt].__outbuf = (char *) malloc (size); + if (result->__data[cnt].__outbuf == NULL) + goto bail; - lastp = NULL; - for (endp = result->__data[cnt].__trans; - endp != NULL; endp = endp->__next) - lastp = endp; + result->__data[cnt].__outbufend = + result->__data[cnt].__outbuf + size; + } + else + { + /* Handle the last entry. */ + result->__data[cnt].__flags = conv_flags | __GCONV_IS_LAST; - if (lastp == NULL) - result->__data[cnt].__trans = newp; - else - lastp->__next = newp; - } break; } + } } if (res != __GCONV_OK) |