1/* Conversion from UTF-16/UTF-32 to legacy encodings. 2 Copyright (C) 2002, 2006-2007, 2009-2010 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify it 5 under the terms of the GNU Lesser General Public License as published 6 by the Free Software Foundation; either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17char * 18FUNC (const UNIT *string, 19 const char *tocode, 20 enum iconv_ilseq_handler handler) 21{ 22#if HAVE_UTF_NAME 23 char *result = NULL; 24 size_t length = 0; 25 26 if (mem_iconveha ((const char *) string, (U_STRLEN (string) + 1) * sizeof (UNIT), 27 UTF_NAME, tocode, 28 handler == iconveh_question_mark, handler, 29 NULL, &result, &length) < 0) 30 return NULL; 31 /* Verify the result has exactly one NUL byte, at the end. */ 32 if (!(length > 0 && result[length-1] == '\0' && strlen (result) == length-1)) 33 { 34 free (result); 35 errno = EILSEQ; 36 return NULL; 37 } 38 return result; 39#else 40 uint8_t tmpbuf[4096]; 41 size_t tmpbufsize = SIZEOF (tmpbuf); 42 uint8_t *utf8_string; 43 char *result; 44 45 utf8_string = U_TO_U8 (string, U_STRLEN (string) + 1, tmpbuf, &tmpbufsize); 46 if (utf8_string == NULL) 47 return NULL; 48 result = u8_strconv_to_encoding (utf8_string, tocode, handler); 49 if (result == NULL) 50 { 51 if (utf8_string != tmpbuf) 52 { 53 int saved_errno = errno; 54 free (utf8_string); 55 errno = saved_errno; 56 } 57 return NULL; 58 } 59 if (utf8_string != tmpbuf) 60 free (utf8_string); 61 return result; 62#endif 63} 64