/* Copyright (C) 2008, 2018 Free Software Foundation, Inc.
   This file is part of the GNU LIBICONV Library.

   The GNU LIBICONV Library is free software; you can redistribute it
   and/or modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either version 2
   of the License, or (at your option) any later version.

   The GNU LIBICONV Library is distributed in the hope that it will be
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with the GNU LIBICONV Library; see the file COPYING.LIB.
   If not, see <https://www.gnu.org/licenses/>.  */

#include "config.h"

#include <stdlib.h>
#include <iconv.h>
#include <errno.h>

/* This test checks that the behaviour of iconv() in the situation of an
   invalid multibyte character after a shift sequence is consistent whether
   the entire buffer is passed at once, or whether it is passed in two
   subsequent calls.  Based on a bug report from
   Roman Rybalko <roman_rybalko@users.sourceforge.net>
   at <https://savannah.gnu.org/bugs/?24216>.  */

void main1 (void)
{
  static const char input[] = "+2D/YQNhB";
  iconv_t cd;
  char buf[20];

  const char * inptr;
  size_t inleft;
  char * outptr;
  size_t outleft;

  cd = iconv_open ("UTF-8", "UTF-7");
  {
    size_t r;

    inptr = input;
    inleft = 9;
    outptr = buf;
    outleft = sizeof (buf);
    r = iconv (cd, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft);
    /*
    printf ("r = %d  errno = %d  inconsumed = %d outproduced = %d\n",
            r, errno, inptr - input, outptr - buf);
    // glibc:
    //   r = -1  errno = 84  inconsumed = 4 outproduced = 0
    // libiconv:
    //   r = -1  errno = 84  inconsumed = 1 outproduced = 0
    */
    if (!(r == (size_t)(-1) && errno == EILSEQ
          && inptr - input == 1 && outptr - buf == 0))
      abort();
  }
}

void main2 (void)
{
  static const char input[] = "+2D/YQNhB";
  iconv_t cd;
  char buf[20];

  const char * inptr;
  size_t inleft;
  char * outptr;
  size_t outleft;

  cd = iconv_open ("UTF-8", "UTF-7");
  {
    size_t r;

    inptr = input;
    inleft = 5;
    outptr = buf;
    outleft = sizeof (buf);
    r = iconv (cd, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft);
    /*
    printf ("r = %d  errno = %d  inconsumed = %d outproduced = %d\n",
            r, errno, inptr - input, outptr - buf);
    // glibc:
    //   r = -1  errno = 84 (EILSEQ)  inconsumed = 4 outproduced = 0
    // libiconv:
    //   r = -1  errno = 22 (EINVAL)  inconsumed = 1 outproduced = 0
    */
    if (!(r == (size_t)(-1) && errno == EINVAL
          && inptr - input == 1 && outptr - buf == 0))
      abort();

    inleft = input + 20 - inptr;
    r = iconv (cd, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft);
    /*
    printf ("r = %d  errno = %d  inconsumed = %d outproduced = %d\n",
            r, errno, inptr - input, outptr - buf);
    // glibc:
    //   r = -1  errno = 84 (EILSEQ)  inconsumed = 4 outproduced = 0
    // libiconv:
    //   r = -1  errno = 84 (EILSEQ)  inconsumed = 1 outproduced = 0
    */
    if (!(r == (size_t)(-1) && errno == EILSEQ
          && inptr - input == 1 && outptr - buf == 0))
      abort();
  }
}

int main ()
{
  main1 ();
  main2 ();
  return 0;
}
