(root)/
glibc-2.38/
wcsmbs/
tst-c16c32-1.c
       1  #include <inttypes.h>
       2  #include <locale.h>
       3  #include <stdio.h>
       4  #include <uchar.h>
       5  #include <stdint.h>
       6  
       7  static int
       8  do_test (void)
       9  {
      10    if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL)
      11      {
      12        puts ("cannot set locale");
      13        return 1;
      14      }
      15  
      16    int result = 0;
      17  
      18    char32_t c32 = 48;
      19    do
      20      {
      21        if (c32 >= 0xd800 && c32 <= 0xe000)
      22  	continue;
      23  
      24        char buf[20];
      25        size_t n1 = c32rtomb (buf, c32, NULL);
      26        if (n1 <= 0)
      27  	{
      28  	  printf ("c32rtomb for U'\\x%" PRIx32 "' failed\n", (uint32_t) c32);
      29  	  result = 1;
      30  	  continue;
      31  	}
      32  
      33        char32_t c32out;
      34        size_t n2 = mbrtoc32 (&c32out, buf, n1, NULL);
      35        if ((ssize_t) n2 < 0)
      36  	{
      37  	  printf ("mbrtoc32 for U'\\x%" PRIx32 "' failed\n", (uint32_t) c32);
      38  	  result = 1;
      39  	  continue;
      40  	}
      41        if (n2 != n1)
      42  	{
      43  	  printf ("mbrtoc32 for U'\\x%" PRIx32 "' consumed %zu bytes, not %zu\n",
      44  		  (uint32_t) c32, n2, n1);
      45  	  result = 1;
      46  	}
      47        else if (c32out != c32)
      48  	{
      49  	  printf ("mbrtoc32 for U'\\x%" PRIx32 "' produced U'\\x%" PRIx32 "\n",
      50  		  (uint32_t) c32, (uint32_t) c32out);
      51  	  result = 1;
      52  	}
      53  
      54        char16_t c16;
      55        size_t n3 = mbrtoc16 (&c16, buf, n1, NULL);
      56        if (n3 != n1)
      57  	{
      58  	  printf ("mbrtoc16 for U'\\x%" PRIx32 "' did not consume all bytes\n",
      59  		  (uint32_t) c32);
      60  	  result = 1;
      61  	  continue;
      62  	}
      63        if (c32 < 0x10000)
      64  	{
      65  	  if (c16 != c32)
      66  	    {
      67  	      printf ("mbrtoc16 for U'\\x%" PRIx32 "' produce u'\\x%" PRIx16 "'\n",
      68  		      (uint32_t) c32, (uint16_t) c16);
      69  	      result = 1;
      70  	      continue;
      71  	    }
      72  	}
      73        else
      74  	{
      75  	  buf[0] = '1';
      76  	  char16_t c16_2;
      77  	  size_t n4 = mbrtoc16 (&c16_2, buf, 1, NULL);
      78  	  if (n4 != (size_t) -3)
      79  	    {
      80  	      printf ("second mbrtoc16 for U'\\x%" PRIx32 "' did not return -3\n",
      81  		      (uint32_t) c32);
      82  	      result = 1;
      83  	      continue;
      84  	    }
      85  
      86  	  if (c32 != (((uint32_t) (c16 - 0xd7c0)) << 10) + (c16_2 - 0xdc00))
      87  	    {
      88  	      printf ("mbrtoc16 for U'\\x%" PRIx32 "' returns U'\\x%" PRIx32 "\n",
      89  		      (uint32_t) c32,
      90  		      (((uint32_t) (c16 - 0xd7c0)) << 10) + (c16_2 - 0xdc00));
      91  	      result = 1;
      92  	      continue;
      93  	    }
      94  	}
      95  
      96        buf[0] = '\0';
      97        char16_t c16_nul;
      98        n3 = mbrtoc16 (&c16_nul, buf, n1, NULL);
      99        if (n3 != 0)
     100  	{
     101  	  printf ("mbrtoc16 for '\\0' returns %zd\n", n3);
     102  	  result = 1;
     103  	  continue;
     104  	}
     105  
     106        if (c32 < 0x10000)
     107  	{
     108  	  size_t n5 = c16rtomb (buf, c16, NULL);
     109  	  if ((ssize_t) n5 < 0)
     110  	    {
     111  	      printf ("c16rtomb for U'\\x%" PRIx32 "' failed with %zd\n",
     112  		      (uint32_t) c32, n5);
     113  	      result = 1;
     114  	      continue;
     115  	    }
     116  	  if (n5 != n1)
     117  	    {
     118  	      printf ("c16rtomb for U'\\x%" PRIx32 "' produced %zu bytes instead of %zu bytes\n",
     119  		      (uint32_t) c32, n5, n1);
     120  	      result = 1;
     121  	      continue;
     122  	    }
     123  	}
     124      }
     125    while ((c32 += 0x1111) <= U'\x12000');
     126  
     127    return result;
     128  }
     129  
     130  #define TEST_FUNCTION do_test ()
     131  #include "../test-skeleton.c"