/* Copyright (C) 2008, 2018, 2022 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 Lesser General Public
   License as published by the Free Software Foundation; either version 2.1
   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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser 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[20] = "+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;
}
