File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / tests / test-shiftseq.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:57:49 2012 UTC (12 years, 4 months ago) by misho
Branches: libiconv, MAIN
CVS tags: v1_14p0, v1_14, v1_13_1, HEAD
libiconv

    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>