From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/iconv/tests/test-shiftseq.c | 119 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 jni/iconv/tests/test-shiftseq.c (limited to 'jni/iconv/tests/test-shiftseq.c') diff --git a/jni/iconv/tests/test-shiftseq.c b/jni/iconv/tests/test-shiftseq.c new file mode 100644 index 0000000..acf5564 --- /dev/null +++ b/jni/iconv/tests/test-shiftseq.c @@ -0,0 +1,119 @@ +/* Copyright (C) 2008 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, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" + +#include +#include +#include + +/* 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 + at . */ + +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; +} -- cgit v1.2.3