Blame gnulib/tests/test-mbrtowc-w32.c

Packit Service a2ae7a
/* Test of conversion of multibyte character to wide character.
Packit Service a2ae7a
   Copyright (C) 2008-2019 Free Software Foundation, Inc.
Packit Service a2ae7a
Packit Service a2ae7a
   This program is free software: you can redistribute it and/or modify
Packit Service a2ae7a
   it under the terms of the GNU General Public License as published by
Packit Service a2ae7a
   the Free Software Foundation; either version 3 of the License, or
Packit Service a2ae7a
   (at your option) any later version.
Packit Service a2ae7a
Packit Service a2ae7a
   This program is distributed in the hope that it will be useful,
Packit Service a2ae7a
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a2ae7a
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a2ae7a
   GNU General Public License for more details.
Packit Service a2ae7a
Packit Service a2ae7a
   You should have received a copy of the GNU General Public License
Packit Service a2ae7a
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit Service a2ae7a
Packit Service a2ae7a
#include <config.h>
Packit Service a2ae7a
Packit Service a2ae7a
#include <wchar.h>
Packit Service a2ae7a
Packit Service a2ae7a
#include <errno.h>
Packit Service a2ae7a
#include <locale.h>
Packit Service a2ae7a
#include <stdio.h>
Packit Service a2ae7a
#include <stdlib.h>
Packit Service a2ae7a
#include <string.h>
Packit Service a2ae7a
Packit Service a2ae7a
#include "macros.h"
Packit Service a2ae7a
Packit Service a2ae7a
#if defined _WIN32 && !defined __CYGWIN__
Packit Service a2ae7a
Packit Service a2ae7a
static int
Packit Service a2ae7a
test_one_locale (const char *name, int codepage)
Packit Service a2ae7a
{
Packit Service a2ae7a
  mbstate_t state;
Packit Service a2ae7a
  wchar_t wc;
Packit Service a2ae7a
  size_t ret;
Packit Service a2ae7a
Packit Service a2ae7a
# if 1
Packit Service a2ae7a
  /* Portable code to set the locale.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    char name_with_codepage[1024];
Packit Service a2ae7a
Packit Service a2ae7a
    sprintf (name_with_codepage, "%s.%d", name, codepage);
Packit Service a2ae7a
Packit Service a2ae7a
    /* Set the locale.  */
Packit Service a2ae7a
    if (setlocale (LC_ALL, name_with_codepage) == NULL)
Packit Service a2ae7a
      return 77;
Packit Service a2ae7a
  }
Packit Service a2ae7a
# else
Packit Service a2ae7a
  /* Hacky way to set a locale.codepage combination that setlocale() refuses
Packit Service a2ae7a
     to set.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    /* Codepage of the current locale, set with setlocale().
Packit Service a2ae7a
       Not necessarily the same as GetACP().  */
Packit Service a2ae7a
    extern __declspec(dllimport) unsigned int __lc_codepage;
Packit Service a2ae7a
Packit Service a2ae7a
    /* Set the locale.  */
Packit Service a2ae7a
    if (setlocale (LC_ALL, name) == NULL)
Packit Service a2ae7a
      return 77;
Packit Service a2ae7a
Packit Service a2ae7a
    /* Clobber the codepage and MB_CUR_MAX, both set by setlocale().  */
Packit Service a2ae7a
    __lc_codepage = codepage;
Packit Service a2ae7a
    switch (codepage)
Packit Service a2ae7a
      {
Packit Service a2ae7a
      case 1252:
Packit Service a2ae7a
      case 1256:
Packit Service a2ae7a
        MB_CUR_MAX = 1;
Packit Service a2ae7a
        break;
Packit Service a2ae7a
      case 932:
Packit Service a2ae7a
      case 950:
Packit Service a2ae7a
      case 936:
Packit Service a2ae7a
        MB_CUR_MAX = 2;
Packit Service a2ae7a
        break;
Packit Service a2ae7a
      case 54936:
Packit Service a2ae7a
      case 65001:
Packit Service a2ae7a
        MB_CUR_MAX = 4;
Packit Service a2ae7a
        break;
Packit Service a2ae7a
      }
Packit Service a2ae7a
Packit Service a2ae7a
    /* Test whether the codepage is really available.  */
Packit Service a2ae7a
    memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
    if (mbrtowc (&wc, " ", 1, &state) == (size_t)(-1))
Packit Service a2ae7a
      return 77;
Packit Service a2ae7a
  }
Packit Service a2ae7a
# endif
Packit Service a2ae7a
Packit Service a2ae7a
  /* Test zero-length input.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
    wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
    ret = mbrtowc (&wc, "x", 0, &state);
Packit Service a2ae7a
    /* gnulib's implementation returns (size_t)(-2).
Packit Service a2ae7a
       The AIX 5.1 implementation returns (size_t)(-1).
Packit Service a2ae7a
       glibc's implementation returns 0.  */
Packit Service a2ae7a
    ASSERT (ret == (size_t)(-2) || ret == (size_t)(-1) || ret == 0);
Packit Service a2ae7a
    ASSERT (mbsinit (&state));
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
  /* Test NUL byte input.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
    wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
    ret = mbrtowc (&wc, "", 1, &state);
Packit Service a2ae7a
    ASSERT (ret == 0);
Packit Service a2ae7a
    ASSERT (wc == 0);
Packit Service a2ae7a
    ASSERT (mbsinit (&state));
Packit Service a2ae7a
    ret = mbrtowc (NULL, "", 1, &state);
Packit Service a2ae7a
    ASSERT (ret == 0);
Packit Service a2ae7a
    ASSERT (mbsinit (&state));
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
  /* Test single-byte input.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    int c;
Packit Service a2ae7a
    char buf[1];
Packit Service a2ae7a
Packit Service a2ae7a
    memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
    for (c = 0; c < 0x100; c++)
Packit Service a2ae7a
      switch (c)
Packit Service a2ae7a
        {
Packit Service a2ae7a
        case '\t': case '\v': case '\f':
Packit Service a2ae7a
        case ' ': case '!': case '"': case '#': case '%':
Packit Service a2ae7a
        case '&': case '\'': case '(': case ')': case '*':
Packit Service a2ae7a
        case '+': case ',': case '-': case '.': case '/':
Packit Service a2ae7a
        case '0': case '1': case '2': case '3': case '4':
Packit Service a2ae7a
        case '5': case '6': case '7': case '8': case '9':
Packit Service a2ae7a
        case ':': case ';': case '<': case '=': case '>':
Packit Service a2ae7a
        case '?':
Packit Service a2ae7a
        case 'A': case 'B': case 'C': case 'D': case 'E':
Packit Service a2ae7a
        case 'F': case 'G': case 'H': case 'I': case 'J':
Packit Service a2ae7a
        case 'K': case 'L': case 'M': case 'N': case 'O':
Packit Service a2ae7a
        case 'P': case 'Q': case 'R': case 'S': case 'T':
Packit Service a2ae7a
        case 'U': case 'V': case 'W': case 'X': case 'Y':
Packit Service a2ae7a
        case 'Z':
Packit Service a2ae7a
        case '[': case '\\': case ']': case '^': case '_':
Packit Service a2ae7a
        case 'a': case 'b': case 'c': case 'd': case 'e':
Packit Service a2ae7a
        case 'f': case 'g': case 'h': case 'i': case 'j':
Packit Service a2ae7a
        case 'k': case 'l': case 'm': case 'n': case 'o':
Packit Service a2ae7a
        case 'p': case 'q': case 'r': case 's': case 't':
Packit Service a2ae7a
        case 'u': case 'v': case 'w': case 'x': case 'y':
Packit Service a2ae7a
        case 'z': case '{': case '|': case '}': case '~':
Packit Service a2ae7a
          /* c is in the ISO C "basic character set".  */
Packit Service a2ae7a
          buf[0] = c;
Packit Service a2ae7a
          wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
          ret = mbrtowc (&wc, buf, 1, &state);
Packit Service a2ae7a
          ASSERT (ret == 1);
Packit Service a2ae7a
          ASSERT (wc == c);
Packit Service a2ae7a
          ASSERT (mbsinit (&state));
Packit Service a2ae7a
          ret = mbrtowc (NULL, buf, 1, &state);
Packit Service a2ae7a
          ASSERT (ret == 1);
Packit Service a2ae7a
          ASSERT (mbsinit (&state));
Packit Service a2ae7a
          break;
Packit Service a2ae7a
        }
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
  /* Test special calling convention, passing a NULL pointer.  */
Packit Service a2ae7a
  {
Packit Service a2ae7a
    memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
    wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
    ret = mbrtowc (&wc, NULL, 5, &state);
Packit Service a2ae7a
    ASSERT (ret == 0);
Packit Service a2ae7a
    ASSERT (wc == (wchar_t) 0xBADFACE);
Packit Service a2ae7a
    ASSERT (mbsinit (&state));
Packit Service a2ae7a
  }
Packit Service a2ae7a
Packit Service a2ae7a
  switch (codepage)
Packit Service a2ae7a
    {
Packit Service a2ae7a
    case 1252:
Packit Service a2ae7a
      /* Locale encoding is CP1252, an extension of ISO-8859-1.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "B\374\337er"; /* "Büßer" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'B');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == (unsigned char) '\374');
Packit Service a2ae7a
        ASSERT (wc == 0x00FC);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 2, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 2, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == (unsigned char) '\337');
Packit Service a2ae7a
        ASSERT (wc == 0x00DF);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'e');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 4, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'r');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    case 1256:
Packit Service a2ae7a
      /* Locale encoding is CP1256, not the same as ISO-8859-6.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "x\302\341\346y"; /* "xآلوy" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'x');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == (unsigned char) '\302');
Packit Service a2ae7a
        ASSERT (wc == 0x0622);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 2, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 2, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == (unsigned char) '\341');
Packit Service a2ae7a
        ASSERT (wc == 0x0644);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == (unsigned char) '\346');
Packit Service a2ae7a
        ASSERT (wc == 0x0648);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 4, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'y');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    case 932:
Packit Service a2ae7a
      /* Locale encoding is CP932, similar to Shift_JIS.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == '<');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x65E5);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == (size_t)(-2));
Packit Service a2ae7a
        ASSERT (wc == (wchar_t) 0xBADFACE);
Packit Service a2ae7a
        ASSERT (!mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 4, 4, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x672C);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[4] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 5, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 5, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x8A9E);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[5] = '\0';
Packit Service a2ae7a
        input[6] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 7, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == '>');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test some invalid input.  */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\377", 1, &state); /* 0xFF */
Packit Service a2ae7a
        ASSERT ((ret == (size_t)-1 && errno == EILSEQ) || ret == (size_t)-2);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\225\377", 2, &state); /* 0x95 0xFF */
Packit Service a2ae7a
        ASSERT ((ret == (size_t)-1 && errno == EILSEQ) || (ret == 2 && wc == 0x30FB));
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    case 950:
Packit Service a2ae7a
      /* Locale encoding is CP950, similar to Big5.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == '<');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x65E5);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == (size_t)(-2));
Packit Service a2ae7a
        ASSERT (wc == (wchar_t) 0xBADFACE);
Packit Service a2ae7a
        ASSERT (!mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 4, 4, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x672C);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[4] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 5, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 5, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x8A9E);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[5] = '\0';
Packit Service a2ae7a
        input[6] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 7, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == '>');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test some invalid input.  */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\377", 1, &state); /* 0xFF */
Packit Service a2ae7a
        ASSERT ((ret == (size_t)-1 && errno == EILSEQ) || ret == (size_t)-2);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\225\377", 2, &state); /* 0x95 0xFF */
Packit Service a2ae7a
        ASSERT ((ret == (size_t)-1 && errno == EILSEQ) || (ret == 2 && wc == '?'));
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    case 936:
Packit Service a2ae7a
      /* Locale encoding is CP936 = GBK, an extension of GB2312.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == '<');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x65E5);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == (size_t)(-2));
Packit Service a2ae7a
        ASSERT (wc == (wchar_t) 0xBADFACE);
Packit Service a2ae7a
        ASSERT (!mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 4, 4, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x672C);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[4] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 5, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 5, 3, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x8A9E);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[5] = '\0';
Packit Service a2ae7a
        input[6] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 7, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == '>');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test some invalid input.  */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\377", 1, &state); /* 0xFF */
Packit Service a2ae7a
        ASSERT ((ret == (size_t)-1 && errno == EILSEQ) || ret == (size_t)-2);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\225\377", 2, &state); /* 0x95 0xFF */
Packit Service a2ae7a
        ASSERT ((ret == (size_t)-1 && errno == EILSEQ) || (ret == 2 && wc == '?'));
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    case 54936:
Packit Service a2ae7a
      /* Locale encoding is CP54936 = GB18030.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'B');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == (size_t)(-2));
Packit Service a2ae7a
        ASSERT (wc == (wchar_t) 0xBADFACE);
Packit Service a2ae7a
        ASSERT (!mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 2, 7, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x00FC);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 3, 6, &state);
Packit Service a2ae7a
        ASSERT (ret == 4);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 6, &state);
Packit Service a2ae7a
        ASSERT (ret == 4);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x00DF);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
        input[4] = '\0';
Packit Service a2ae7a
        input[5] = '\0';
Packit Service a2ae7a
        input[6] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 7, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'e');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[5] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 8, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'r');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test some invalid input.  */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\377", 1, &state); /* 0xFF */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\225\377", 2, &state); /* 0x95 0xFF */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\201\045", 2, &state); /* 0x81 0x25 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\201\060\377", 3, &state); /* 0x81 0x30 0xFF */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\201\060\377\064", 4, &state); /* 0x81 0x30 0xFF 0x34 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\201\060\211\072", 4, &state); /* 0x81 0x30 0x89 0x3A */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    case 65001:
Packit Service a2ae7a
      /* Locale encoding is CP65001 = UTF-8.  */
Packit Service a2ae7a
      {
Packit Service a2ae7a
        char input[] = "B\303\274\303\237er"; /* "Büßer" */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'B');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[0] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 1, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == (size_t)(-2));
Packit Service a2ae7a
        ASSERT (wc == (wchar_t) 0xBADFACE);
Packit Service a2ae7a
        ASSERT (!mbsinit (&state));
Packit Service a2ae7a
        input[1] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 2, 5, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x00FC);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[2] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test support of NULL first argument.  */
Packit Service a2ae7a
        ret = mbrtowc (NULL, input + 3, 4, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 3, 4, &state);
Packit Service a2ae7a
        ASSERT (ret == 2);
Packit Service a2ae7a
        ASSERT (wctob (wc) == EOF);
Packit Service a2ae7a
        ASSERT (wc == 0x00DF);
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[3] = '\0';
Packit Service a2ae7a
        input[4] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 5, 2, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'e');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
        input[5] = '\0';
Packit Service a2ae7a
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, input + 6, 1, &state);
Packit Service a2ae7a
        ASSERT (ret == 1);
Packit Service a2ae7a
        ASSERT (wc == 'r');
Packit Service a2ae7a
        ASSERT (mbsinit (&state));
Packit Service a2ae7a
Packit Service a2ae7a
        /* Test some invalid input.  */
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\377", 1, &state); /* 0xFF */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\303\300", 2, &state); /* 0xC3 0xC0 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\343\300", 2, &state); /* 0xE3 0xC0 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\343\300\200", 3, &state); /* 0xE3 0xC0 0x80 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\343\200\300", 3, &state); /* 0xE3 0x80 0xC0 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\363\300", 2, &state); /* 0xF3 0xC0 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\363\300\200\200", 4, &state); /* 0xF3 0xC0 0x80 0x80 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\363\200\300", 3, &state); /* 0xF3 0x80 0xC0 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\363\200\300\200", 4, &state); /* 0xF3 0x80 0xC0 0x80 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
Packit Service a2ae7a
        memset (&state, '\0', sizeof (mbstate_t));
Packit Service a2ae7a
        wc = (wchar_t) 0xBADFACE;
Packit Service a2ae7a
        ret = mbrtowc (&wc, "\363\200\200\300", 4, &state); /* 0xF3 0x80 0x80 0xC0 */
Packit Service a2ae7a
        ASSERT (ret == (size_t)-1);
Packit Service a2ae7a
        ASSERT (errno == EILSEQ);
Packit Service a2ae7a
      }
Packit Service a2ae7a
      return 0;
Packit Service a2ae7a
Packit Service a2ae7a
    default:
Packit Service a2ae7a
      return 1;
Packit Service a2ae7a
    }
Packit Service a2ae7a
}
Packit Service a2ae7a
Packit Service a2ae7a
int
Packit Service a2ae7a
main (int argc, char *argv[])
Packit Service a2ae7a
{
Packit Service a2ae7a
  int codepage = atoi (argv[argc - 1]);
Packit Service a2ae7a
  int result;
Packit Service a2ae7a
  int i;
Packit Service a2ae7a
Packit Service a2ae7a
  result = 77;
Packit Service a2ae7a
  for (i = 1; i < argc - 1; i++)
Packit Service a2ae7a
    {
Packit Service a2ae7a
      int ret = test_one_locale (argv[i], codepage);
Packit Service a2ae7a
Packit Service a2ae7a
      if (ret != 77)
Packit Service a2ae7a
        result = ret;
Packit Service a2ae7a
    }
Packit Service a2ae7a
Packit Service a2ae7a
  if (result == 77)
Packit Service a2ae7a
    {
Packit Service a2ae7a
      fprintf (stderr, "Skipping test: found no locale with codepage %d\n",
Packit Service a2ae7a
               codepage);
Packit Service a2ae7a
    }
Packit Service a2ae7a
  return result;
Packit Service a2ae7a
}
Packit Service a2ae7a
Packit Service a2ae7a
#else
Packit Service a2ae7a
Packit Service a2ae7a
int
Packit Service a2ae7a
main (int argc, char *argv[])
Packit Service a2ae7a
{
Packit Service a2ae7a
  fputs ("Skipping test: not a native Windows system\n", stderr);
Packit Service a2ae7a
  return 77;
Packit Service a2ae7a
}
Packit Service a2ae7a
Packit Service a2ae7a
#endif