
1: /* Release any resource associated with given conversion descriptor. 2: Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. 5: 6: The GNU C Library is free software; you can redistribute it and/or 7: modify it under the terms of the GNU Lesser General Public 8: License as published by the Free Software Foundation; either 9: version 2.1 of the License, or (at your option) any later version. 10: 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: Lesser General Public License for more details. 15: 16: You should have received a copy of the GNU Lesser General Public 17: License along with the GNU C Library; if not, write to the Free 18: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19: 02111-1307 USA. */ 20: 21: #include <stdlib.h> 22: 23: #include <gconv_int.h> 24: 25: 26: int 27: internal_function 28: __gconv_close (__gconv_t cd) 29: { 30: struct __gconv_step *srunp; 31: struct __gconv_step_data *drunp; 32: size_t nsteps; 33: 34: /* Free all resources by calling destructor functions and release 35: the implementations. */ 36: srunp = cd->__steps; 37: nsteps = cd->__nsteps; 38: drunp = cd->__data; 39: do 40: { 41: struct __gconv_trans_data *transp; 42: 43: transp = drunp->__trans; 44: while (transp != NULL) 45: { 46: struct __gconv_trans_data *curp = transp; 47: transp = transp->__next; 48: 49: if (__builtin_expect (curp->__trans_end_fct != NULL, 0)) 50: curp->__trans_end_fct (curp->__data); 51: 52: free (curp); 53: } 54: 55: if (!(drunp->__flags & __GCONV_IS_LAST) && drunp->__outbuf != NULL) 56: free (drunp->__outbuf); 57: } 58: while (!((drunp++)->__flags & __GCONV_IS_LAST)); 59: 60: /* Free the data allocated for the descriptor. */ 61: free (cd); 62: 63: /* Close the participating modules. */ 64: return __gconv_close_transform (srunp, nsteps); 65: }