+// Derived from BZ #9793
#include <errno.h>
#include <iconv.h>
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
static int
do_test (void)
{
- iconv_t cd = iconv_open ("ISO-8859-1", "UNICODE");
+ iconv_t cd = iconv_open ("ASCII//TRANSLIT", "UTF-8");
if (cd == (iconv_t) -1)
{
- printf ("iconv_open failed: %m\n");
- exit (EXIT_FAILURE);
+ puts ("iconv_open failed");
+ return 1;
}
- char instr[] = "a";
- char *inptr = instr;
- size_t inlen = strlen (instr);
- char buf[200];
- char *outptr = buf;
- size_t outlen = sizeof (outptr);
+ char input[2] = { 0xc2, 0xae }; /* Registered trademark */
+ char *inptr = input;
+ size_t insize = sizeof (input);
+ char output[2]; /* Too short to contain "(R)". */
+ char *outptr = output;
+ size_t outsize = sizeof (output);
- errno = 0;
- size_t n = iconv (cd, &inptr, &inlen, &outptr, &outlen);
- if (n != (size_t) -1)
+ size_t ret = iconv (cd, &inptr, &insize, &outptr, &outsize);
+ if (ret != (size_t) -1)
{
- printf ("n (= %zu) != (size_t) -1\n", n);
- exit (EXIT_FAILURE);
+ puts ("iconv succeeded");
+ return 1;
}
- if (errno != EINVAL)
+ if (errno != E2BIG)
{
- printf ("errno = %m, not EINVAL\n");
- exit (EXIT_FAILURE);
+ puts ("iconv did not set errno to E2BIG");
+ return 1;
}
-
- iconv_close (cd);
-
- return 0;
+ int res = 0;
+ if (inptr != input)
+ {
+ puts ("inptr changed");
+ res = 1;
+ }
+ if (insize != sizeof (input))
+ {
+ puts ("insize changed");
+ res = 1;
+ }
+ if (outptr != output)
+ {
+ puts ("outptr changed");
+ res = 1;
+ }
+ if (outsize != sizeof (output))
+ {
+ puts ("outsize changed");
+ res = 1;
+ }
+ if (iconv_close (cd) == -1)
+ {
+ puts ("iconv_close failed");
+ res = 1;
+ }
+ return res;
}
#define TEST_FUNCTION do_test ()