1 /* Conversion from UTF-8 to legacy encodings.
2 Copyright (C) 2002, 2006-2007, 2009-2024 Free Software Foundation, Inc.
4 This file is free software.
5 It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
6 You can redistribute it and/or modify it under either
7 - the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation, either version 3, or (at your
9 option) any later version, or
10 - the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option)
13 - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
15 This file is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License and the GNU General Public License
21 You should have received a copy of the GNU Lesser General Public
22 License and of the GNU General Public License along with this
23 program. If not, see <https://www.gnu.org/licenses/>. */
25 /* Written by Bruno Haible <bruno@clisp.org>. */
36 #include "c-strcaseeq.h"
37 #include "striconveha.h"
41 u8_strconv_to_encoding (const uint8_t *string
,
43 enum iconv_ilseq_handler handler
)
48 if (STRCASEEQ (tocode
, "UTF-8", 'U','T','F','-','8',0,0,0,0))
50 /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
51 length
= u8_strlen (string
) + 1;
52 if (u8_check (string
, length
))
57 result
= (char *) malloc (length
);
63 memcpy (result
, (const char *) string
, length
);
70 if (mem_iconveha ((const char *) string
, u8_strlen (string
) + 1,
72 handler
== iconveh_question_mark
, handler
,
73 NULL
, &result
, &length
) < 0)
75 /* Verify the result has exactly one NUL byte, at the end. */
76 if (!(length
> 0 && result
[length
-1] == '\0'
77 && strlen (result
) == length
-1))