1 /* Find matching transformation algorithms and initialize steps.
2 Copyright (C) 1997 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
16 You should have received a copy of the GNU Library General Public
17 License along with the GNU C Library; see the file COPYING.LIB. If not,
18 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
27 __gconv_open (const char *toset, const char *fromset, gconv_t *handle)
29 struct gconv_step *steps;
31 gconv_t result = NULL;
35 res = __gconv_find_transform (toset, fromset, &steps, &nsteps);
38 /* Allocate room for handle. */
39 result = (gconv_t) malloc (sizeof (struct gconv_info));
44 /* Remember the list of steps. */
45 result->steps = steps;
46 result->nsteps = nsteps;
48 /* Allocate array for the step data. */
49 result->data = (struct gconv_step_data *)
50 calloc (nsteps, sizeof (struct gconv_step_data));
52 if (result->data == NULL)
56 /* Call all initialization functions for the transformation
57 step implemenations. */
58 struct gconv_step_data *data = result->data;
60 for (cnt = 0; cnt < nsteps; ++cnt)
62 /* If this is the last step we must not allocate an output
63 buffer. Signal this to the initializer. */
64 data[cnt].is_last = cnt == nsteps - 1;
66 if (steps[cnt].init_fct != NULL)
68 res = (steps[cnt].init_fct) (&steps[cnt], &data[cnt]);
73 if (!data[cnt].is_last)
75 data[cnt].outbufsize = GCONV_DEFAULT_BUFSIZE;
77 (char *) malloc (data[cnt].outbufsize);
78 if (data[cnt].outbuf == NULL)
83 data[cnt].outbufavail = 0;
92 /* Something went wrong. Free all the resources. */
97 if (result->data != NULL)
100 if (steps[cnt].end_fct != NULL)
101 (*steps[cnt].end_fct) (&result->data[cnt]);
104 free (result->data[cnt].outbuf);
105 if (result->data[cnt].data != NULL)
106 free (result->data[cnt].data);
116 __gconv_close_transform (steps, nsteps);
118 __set_errno (serrno);