diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | iconv/gconv_db.c | 1 | ||||
-rw-r--r-- | iconv/gconv_open.c | 76 |
3 files changed, 28 insertions, 58 deletions
diff --git a/ChangeLog b/ChangeLog index 7e5de468e5..bd4954f21c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2000-07-12 Ulrich Drepper <drepper@redhat.com> + * 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. + * iconv/gconv_open.c: Undo last two changes for now. They break everything. 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) |