Annotation of embedaddon/libiconv/tests/test-shiftseq.c, revision 1.1.1.1
1.1 misho 1: /* Copyright (C) 2008 Free Software Foundation, Inc.
2: This file is part of the GNU LIBICONV Library.
3:
4: The GNU LIBICONV Library is free software; you can redistribute it
5: and/or modify it under the terms of the GNU Library General Public
6: License as published by the Free Software Foundation; either version 2
7: of the License, or (at your option) any later version.
8:
9: The GNU LIBICONV Library is distributed in the hope that it will be
10: useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: Library General Public License for more details.
13:
14: You should have received a copy of the GNU Library General Public
15: License along with the GNU LIBICONV Library; see the file COPYING.LIB.
16: If not, write to the Free Software Foundation, Inc., 51 Franklin Street,
17: Fifth Floor, Boston, MA 02110-1301, USA. */
18:
19: #include "config.h"
20:
21: #include <stdlib.h>
22: #include <iconv.h>
23: #include <errno.h>
24:
25: /* This test checks that the behaviour of iconv() in the situation of an
26: invalid multibyte character after a shift sequence is consistent whether
27: the entire buffer is passed at once, or whether it is passed in two
28: subsequent calls. Based on a bug report from
29: Roman Rybalko <roman_rybalko@users.sourceforge.net>
30: at <http://savannah.gnu.org/bugs/?24216>. */
31:
32: void main1 (void)
33: {
34: static const char input[] = "+2D/YQNhB";
35: iconv_t cd;
36: char buf[20];
37:
38: const char * inptr;
39: size_t inleft;
40: char * outptr;
41: size_t outleft;
42:
43: cd = iconv_open ("UTF-8", "UTF-7");
44: {
45: size_t r;
46:
47: inptr = input;
48: inleft = 9;
49: outptr = buf;
50: outleft = sizeof (buf);
51: r = iconv (cd, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft);
52: /*
53: printf ("r = %d errno = %d inconsumed = %d outproduced = %d\n",
54: r, errno, inptr - input, outptr - buf);
55: // glibc:
56: // r = -1 errno = 84 inconsumed = 4 outproduced = 0
57: // libiconv:
58: // r = -1 errno = 84 inconsumed = 1 outproduced = 0
59: */
60: if (!(r == (size_t)(-1) && errno == EILSEQ
61: && inptr - input == 1 && outptr - buf == 0))
62: abort();
63: }
64: }
65:
66: void main2 (void)
67: {
68: static const char input[] = "+2D/YQNhB";
69: iconv_t cd;
70: char buf[20];
71:
72: const char * inptr;
73: size_t inleft;
74: char * outptr;
75: size_t outleft;
76:
77: cd = iconv_open ("UTF-8", "UTF-7");
78: {
79: size_t r;
80:
81: inptr = input;
82: inleft = 5;
83: outptr = buf;
84: outleft = sizeof (buf);
85: r = iconv (cd, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft);
86: /*
87: printf ("r = %d errno = %d inconsumed = %d outproduced = %d\n",
88: r, errno, inptr - input, outptr - buf);
89: // glibc:
90: // r = -1 errno = 84 (EILSEQ) inconsumed = 4 outproduced = 0
91: // libiconv:
92: // r = -1 errno = 22 (EINVAL) inconsumed = 1 outproduced = 0
93: */
94: if (!(r == (size_t)(-1) && errno == EINVAL
95: && inptr - input == 1 && outptr - buf == 0))
96: abort();
97:
98: inleft = input + 20 - inptr;
99: r = iconv (cd, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft);
100: /*
101: printf ("r = %d errno = %d inconsumed = %d outproduced = %d\n",
102: r, errno, inptr - input, outptr - buf);
103: // glibc:
104: // r = -1 errno = 84 (EILSEQ) inconsumed = 4 outproduced = 0
105: // libiconv:
106: // r = -1 errno = 84 (EILSEQ) inconsumed = 1 outproduced = 0
107: */
108: if (!(r == (size_t)(-1) && errno == EILSEQ
109: && inptr - input == 1 && outptr - buf == 0))
110: abort();
111: }
112: }
113:
114: int main ()
115: {
116: main1 ();
117: main2 ();
118: return 0;
119: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>