You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.4 KiB
118 lines
3.4 KiB
/* 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, see <http://www.gnu.org/licenses/>. */ |
|
|
|
#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; |
|
}
|
|
|