| /* Copyright (C) 2008, 2018, 2022 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 Lesser General Public | |
| License as published by the Free Software Foundation; either version 2.1 | |
| 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 | |
| Lesser General Public License for more details. | |
| You should have received a copy of the GNU Lesser General Public | |
| License along with the GNU LIBICONV Library; see the file COPYING.LIB. | |
| If not, see <https://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 <https://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[20] = "+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; | |
| } |