1 #include <inttypes.h>
2 #include <locale.h>
3 #include <stdio.h>
4 #include <uchar.h>
5 #include <stdint.h>
6 
7 static int
do_test(void)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"
132