|
Packit |
709fb3 |
/* Test of character set conversion.
|
|
Packit |
709fb3 |
Copyright (C) 2007-2017 Free Software Foundation, Inc.
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
709fb3 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
709fb3 |
the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
709fb3 |
(at your option) any later version.
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
709fb3 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
709fb3 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
709fb3 |
GNU General Public License for more details.
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
You should have received a copy of the GNU General Public License
|
|
Packit |
709fb3 |
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
#include <config.h>
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
#include "striconv.h"
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
#if HAVE_ICONV
|
|
Packit |
709fb3 |
# include <iconv.h>
|
|
Packit |
709fb3 |
#endif
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
#include <errno.h>
|
|
Packit |
709fb3 |
#include <stdlib.h>
|
|
Packit |
709fb3 |
#include <string.h>
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
#include "macros.h"
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
int
|
|
Packit |
709fb3 |
main ()
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
#if HAVE_ICONV
|
|
Packit |
709fb3 |
/* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
|
|
Packit |
709fb3 |
and UTF-8. */
|
|
Packit |
709fb3 |
iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
|
|
Packit |
709fb3 |
iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
|
|
Packit |
709fb3 |
ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* ------------------------- Test mem_cd_iconv() ------------------------- */
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
|
Packit |
709fb3 |
static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
|
|
Packit |
709fb3 |
char *result = NULL;
|
|
Packit |
709fb3 |
size_t length = 0;
|
|
Packit |
709fb3 |
int retval = mem_cd_iconv (input, strlen (input), cd_88591_to_utf8,
|
|
Packit |
709fb3 |
&result, &length);
|
|
Packit |
709fb3 |
ASSERT (retval == 0);
|
|
Packit |
709fb3 |
ASSERT (length == strlen (expected));
|
|
Packit |
709fb3 |
ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
|
|
Packit |
709fb3 |
static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
|
Packit |
709fb3 |
char *result = NULL;
|
|
Packit |
709fb3 |
size_t length = 0;
|
|
Packit |
709fb3 |
int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
|
|
Packit |
709fb3 |
&result, &length);
|
|
Packit |
709fb3 |
ASSERT (retval == 0);
|
|
Packit |
709fb3 |
ASSERT (length == strlen (expected));
|
|
Packit |
709fb3 |
ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\342\202\254"; /* EURO SIGN */
|
|
Packit |
709fb3 |
char *result = NULL;
|
|
Packit |
709fb3 |
size_t length = 0;
|
|
Packit |
709fb3 |
int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
|
|
Packit |
709fb3 |
&result, &length);
|
|
Packit |
709fb3 |
ASSERT (retval == -1 && errno == EILSEQ);
|
|
Packit |
709fb3 |
ASSERT (result == NULL);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\342";
|
|
Packit |
709fb3 |
char *result = NULL;
|
|
Packit |
709fb3 |
size_t length = 0;
|
|
Packit |
709fb3 |
int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
|
|
Packit |
709fb3 |
&result, &length);
|
|
Packit |
709fb3 |
ASSERT (retval == 0);
|
|
Packit |
709fb3 |
ASSERT (length == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* ------------------------- Test str_cd_iconv() ------------------------- */
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
|
Packit |
709fb3 |
static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
|
|
Packit |
709fb3 |
char *result = str_cd_iconv (input, cd_88591_to_utf8);
|
|
Packit |
709fb3 |
ASSERT (result != NULL);
|
|
Packit |
709fb3 |
ASSERT (strcmp (result, expected) == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
|
|
Packit |
709fb3 |
static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
|
Packit |
709fb3 |
char *result = str_cd_iconv (input, cd_utf8_to_88591);
|
|
Packit |
709fb3 |
ASSERT (result != NULL);
|
|
Packit |
709fb3 |
ASSERT (strcmp (result, expected) == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
|
|
Packit |
709fb3 |
char *result = str_cd_iconv (input, cd_utf8_to_88591);
|
|
Packit |
709fb3 |
ASSERT (result == NULL && errno == EILSEQ);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\342";
|
|
Packit |
709fb3 |
char *result = str_cd_iconv (input, cd_utf8_to_88591);
|
|
Packit |
709fb3 |
ASSERT (result != NULL);
|
|
Packit |
709fb3 |
ASSERT (strcmp (result, "") == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
iconv_close (cd_88591_to_utf8);
|
|
Packit |
709fb3 |
iconv_close (cd_utf8_to_88591);
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* -------------------------- Test str_iconv() -------------------------- */
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
|
Packit |
709fb3 |
static const char expected[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
|
|
Packit |
709fb3 |
char *result = str_iconv (input, "ISO-8859-1", "UTF-8");
|
|
Packit |
709fb3 |
ASSERT (result != NULL);
|
|
Packit |
709fb3 |
ASSERT (strcmp (result, expected) == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\303\204rger mit b\303\266sen B\303\274bchen ohne Augenma\303\237";
|
|
Packit |
709fb3 |
static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
|
|
Packit |
709fb3 |
char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
|
|
Packit |
709fb3 |
ASSERT (result != NULL);
|
|
Packit |
709fb3 |
ASSERT (strcmp (result, expected) == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "Costs: 27 \342\202\254"; /* EURO SIGN */
|
|
Packit |
709fb3 |
char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
|
|
Packit |
709fb3 |
ASSERT (result == NULL && errno == EILSEQ);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
/* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
|
|
Packit |
709fb3 |
{
|
|
Packit |
709fb3 |
static const char input[] = "\342";
|
|
Packit |
709fb3 |
char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
|
|
Packit |
709fb3 |
ASSERT (result != NULL);
|
|
Packit |
709fb3 |
ASSERT (strcmp (result, "") == 0);
|
|
Packit |
709fb3 |
free (result);
|
|
Packit |
709fb3 |
}
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
#endif
|
|
Packit |
709fb3 |
|
|
Packit |
709fb3 |
return 0;
|
|
Packit |
709fb3 |
}
|