Blame iconvdata/tst-e2big.c

Packit Service 82fcde
/* Test for a tricky E2BIG situation.
Packit Service 82fcde
   Copyright (C) 2002-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Bruno Haible <bruno@clisp.org>, 2002.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <alloca.h>
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <iconv.h>
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
Packit Service 82fcde
/* In EUC-JISX0213 and TSCII, a single input character can convert to
Packit Service 82fcde
   a sequence of two or more Unicode characters.  When the output buffer
Packit Service 82fcde
   has room for less Unicode characters than would be produced with an
Packit Service 82fcde
   unconstrained output buffer, the conversion must give errno = E2BIG.  */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
test (const char *encoding, char *inbuf, size_t inbufsize, size_t outbufsize)
Packit Service 82fcde
{
Packit Service 82fcde
  char *outbuf = alloca (outbufsize);
Packit Service 82fcde
  iconv_t cd;
Packit Service 82fcde
  char *inptr;
Packit Service 82fcde
  size_t inlen;
Packit Service 82fcde
  char *outptr;
Packit Service 82fcde
  size_t outlen;
Packit Service 82fcde
  int result;
Packit Service 82fcde
  bool empty_input;
Packit Service 82fcde
  bool empty_output;
Packit Service 82fcde
Packit Service 82fcde
  cd = iconv_open ("UTF-8", encoding);
Packit Service 82fcde
  if (cd == (iconv_t) -1)
Packit Service 82fcde
    {
Packit Service 82fcde
      fprintf (stderr, "cannot convert from %s\n", encoding);
Packit Service 82fcde
      exit (1);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  inptr = inbuf;
Packit Service 82fcde
  inlen = inbufsize;
Packit Service 82fcde
  outptr = outbuf;
Packit Service 82fcde
  outlen = outbufsize;
Packit Service 82fcde
Packit Service 82fcde
  result = iconv (cd, &inptr, &inlen, &outptr, &outlen);
Packit Service 82fcde
  if (!(result == -1 && errno == E2BIG))
Packit Service 82fcde
    {
Packit Service 82fcde
      fprintf (stderr, "%s: wrong iconv result: %d/%d (%m)\n",
Packit Service 82fcde
	       encoding, result, errno);
Packit Service 82fcde
      exit (1);
Packit Service 82fcde
    }
Packit Service 82fcde
  empty_input = (inptr == inbuf && inlen == inbufsize);
Packit Service 82fcde
  empty_output = (outptr == outbuf && outlen == outbufsize);
Packit Service 82fcde
Packit Service 82fcde
  if (!empty_input && empty_output)
Packit Service 82fcde
    {
Packit Service 82fcde
      fprintf (stderr, "%s: ate %td input bytes\n", encoding, inptr - inbuf);
Packit Service 82fcde
      exit (1);
Packit Service 82fcde
    }
Packit Service 82fcde
  if (empty_input && !empty_output)
Packit Service 82fcde
    {
Packit Service 82fcde
      fprintf (stderr, "%s: produced %td output bytes\n",
Packit Service 82fcde
	       encoding, outptr - outbuf);
Packit Service 82fcde
      exit (1);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  iconv_close (cd);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
test_euc_jisx0213 (void)
Packit Service 82fcde
{
Packit Service 82fcde
  char inbuf[2] = { 0xa4, 0xf7 };
Packit Service 82fcde
  test ("EUC-JISX0213", inbuf, sizeof (inbuf), 3);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
test_tscii (void)
Packit Service 82fcde
{
Packit Service 82fcde
  char inbuf[1] = { 0x82 };
Packit Service 82fcde
  test ("TSCII", inbuf, sizeof (inbuf), 3);
Packit Service 82fcde
  test ("TSCII", inbuf, sizeof (inbuf), 6);
Packit Service 82fcde
  test ("TSCII", inbuf, sizeof (inbuf), 9);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  test_euc_jisx0213 ();
Packit Service 82fcde
  test_tscii ();
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define TEST_FUNCTION do_test ()
Packit Service 82fcde
#include "../test-skeleton.c"