Annotation of embedaddon/libiconv/tests/test-shiftseq.c, revision 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>