summaryrefslogtreecommitdiff
path: root/jni/iconv/tests/test-shiftseq.c
diff options
context:
space:
mode:
authorJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-16 18:49:26 +0900
committerJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-30 00:39:06 +0900
commitfcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch)
tree64cb17de3f41a2b6fef2368028fbd00349946994 /jni/iconv/tests/test-shiftseq.c
Fresh start
Diffstat (limited to 'jni/iconv/tests/test-shiftseq.c')
-rw-r--r--jni/iconv/tests/test-shiftseq.c119
1 files changed, 119 insertions, 0 deletions
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 <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 <http://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;
+}