1 /*
2  *  TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
3  *
4  *	 FILE:	dat_mbtowc.c
5  *
6  *	 MBTOWC:  int  mbtowc (wchar_t *wp, char *s, size_t n);
7  */
8 
9 /*  NOTE:
10  *
11  *	 int  mbtowc (wchar_t *wp, char *s, size_t n);
12  *
13  *	 where	     n: a maximum number of bytes
14  *		return: the number of bytes
15  *
16  *
17  *	  o When you feed a null pointer for a string (s) to the function,
18  *	    set s_flg=0 instead of putting just a 'NULL' there.
19  *	    Even if you put a 'NULL', it means a null string as well as "".
20  *
21  *	  o When s is a null pointer, the function checks state dependency.
22  *
23  *		state-dependent encoding      - return	NON-zero
24  *		state-independent encoding    - return	0
25  *
26  *	    If state-dependent encoding is expected, set
27  *
28  *		s_flg = 0,  ret_flg = 0,  ret_val = +1
29  *
30  *	    If state-independent encoding is expected, set
31  *
32  *		s_flg = 0,  ret_flg = 0,  ret_val = 0
33  *
34  *
35  *	    When you set ret_flg=1, the test program simply compares
36  *	    an actual return value with an expected value. You can
37  *	    check state-independent case (return value is 0) in that
38  *	    way, but you can not check state-dependent case. So when
39  *	    you check state- dependency in this test function:
40  *	    tst_mbtowc(), set ret_flg=0 always. It's a special case
41  *	    and the test function takes care of it.
42  *
43  *			  w_flg
44  *			  |	s: (a null string; can't be (char *)NULL)
45  *			  |	|
46  *	       input.	{ 1, 0, (char)NULL, MB_LEN_MAX	},
47  *			     |
48  *			     s_flg=0: makes _s_ a null pointer.
49  *
50  *	       expect	{ 0,0,0,x,     0x0000	  },
51  *			      | |
52  *			      | ret_val: 0/+1
53  *			      ret_flg=0
54  *
55  *
56  *    Test data for State dependent encodings:
57  *
58  *	  mbtowc( NULL, NULL, 0 );	 ... first  data
59  *	  mbtowc( &wc,	s1,  n1 );	 ... second data
60  *	  mbtowc( &wc,	s2,  n2 );	 ... third  data
61  * */
62 
63 #include <limits.h>
64 
65 TST_MBTOWC tst_mbtowc_loc [] = {
66   {
67     { Tmbtowc, TST_LOC_de },
68     {
69       { /*----------------- #01 -----------------*/
70 	{
71 	  {
72 	    { 1, 1, "\xfc\xe4\xf6",	    1	       },
73 	    { 1, 1, "\xfc\xe4\xf6",	    2	       },
74 	    { 1, 1, "\xfc\xe4\xf6",	    MB_LEN_MAX },
75 	  }
76 	},
77 	{
78 	  {
79 	    { 0,  1,  1,   0x00FC },
80 	    { 0,  1,  1,   0x00FC },
81 	    { 0,  1,  1,   0x00FC },
82 	  }
83 	}
84       },
85       { /*----------------- #02 -----------------*/
86 	{
87 	  {
88 	    { 1, 1, "\177",	    MB_LEN_MAX },
89 	    { 1, 1, "\200",	    MB_LEN_MAX },
90 	    { 1, 1, "\201",	    MB_LEN_MAX },
91 	  }
92 	},
93 	{
94 	  {
95 	    { 0,  1,  1,   0x007F },
96 	    { 0,  1,  1,   0x0080 },
97 	    { 0,  1,  1,   0x0081 },
98 	  }
99 	}
100       },
101       { /*----------------- #03 -----------------*/
102 	{
103 	  {
104 	    { 1, 1, "",			    MB_LEN_MAX },
105 	    { 0, 1, "\xfc\xe4\xf6",	    1	       },
106 	    { 0, 1, "\xfc\xe4\xf6",	    2	       },
107 	  }
108 	},
109 	{
110 	  {
111 	    { 0,  1,  0,   0x0000 },
112 	    { 0,  1,  1,   0x0000 },
113 	    { 0,  1,  1,   0x0000 },
114 	  }
115 	}
116       },
117       { /*----------------- #04 -----------------*/
118 	{
119 	  {
120 	    { 0, 1, "\xfc\xe4\xf6",	    MB_LEN_MAX },
121 	    { 0, 1, "\177",		    MB_LEN_MAX },
122 	    { 0, 1, "",	 		   MB_LEN_MAX },
123 	  }
124 	},
125 	{
126 	  {
127 	    { 0,  1,  1,   0x0000 },
128 	    { 0,  1,  1,   0x0000 },
129 	    { 0,  1,  0,   0x0000 },
130 	  }
131 	}
132       },
133       { /*----------------- #05 -----------------*/
134 	{
135 	  {
136 	    { 0, 1, "\xfc\xe4\xf6",	MB_LEN_MAX },
137 	    { 0, 1, "\177",	   	MB_LEN_MAX },
138 	    { 0, 0, NULL, 		MB_LEN_MAX },
139 	  }
140 	},
141 	{
142 	  {
143 	    { 0,  1,  1,   0x0000 },
144 	    { 0,  1,  1,   0x0000 },
145 	    { 0,  0,  0,   0x0000 },
146 	  }
147 	}
148       },
149       { .is_last = 1 }
150     }
151   },
152   {
153     { Tmbtowc, TST_LOC_enUS },
154     {
155       { /*----------------- #01 -----------------*/
156 	{
157 	  {
158 	    { 1, 1, "ABC",	    1	       },
159 	    { 1, 1, "ABC",	    2	       },
160 	    { 1, 1, "ABC",	    MB_LEN_MAX },
161 	  }
162 	},
163 	{
164 	  {
165 	    { 0,  1,  1,   0x0041 },
166 	    { 0,  1,  1,   0x0041 },
167 	    { 0,  1,  1,   0x0041 },
168 	  }
169 	}
170       },
171       { /*----------------- #02 -----------------*/
172 	{
173 	  {
174 	    { 1, 1, "\177",	    MB_LEN_MAX },
175 	    { 1, 1, "\200",	    MB_LEN_MAX },
176 	    { 1, 1, "\201",	    MB_LEN_MAX },
177 	  }
178 	},
179 	{
180 	  {
181 	    { 0,  1,  1,   0x007F },
182 	    { EILSEQ,  1, -1,   0x0000 },
183 	    { EILSEQ,  1, -1,   0x0000 },
184 	  }
185 	}
186       },
187       { /*----------------- #03 -----------------*/
188 	{
189 	  {
190 	    { 1, 1, "",	    MB_LEN_MAX },
191 	    { 0, 1, "ABC",	    1	       },
192 	    { 0, 1, "ABC",	    2	       },
193 	  }
194 	},
195 	{
196 	  {
197 	    { 0,  1,  0,   0x0000 },
198 	    { 0,  1,  1,   0x0000 },
199 	    { 0,  1,  1,   0x0000 },
200 	  }
201 	}
202       },
203       { /*----------------- #04 -----------------*/
204 	{
205 	  {
206 	    { 0, 1, "ABC",	    MB_LEN_MAX },
207 	    { 0, 1, "\177",	    MB_LEN_MAX },
208 	    { 0, 1, "",	    MB_LEN_MAX },
209 	  }
210 	},
211 	{
212 	  {
213 	    { 0,  1,  1,   0x0000 },
214 	    { 0,  1,  1,   0x0000 },
215 	    { 0,  1,  0,   0x0000 },
216 	  }
217 	}
218       },
219       { /*----------------- #05 -----------------*/
220 	{
221 	  {
222 	    { 0, 1, "ABC",	    MB_LEN_MAX },
223 	    { 0, 1, "\177",	    MB_LEN_MAX },
224 	    { 0, 0, NULL,	    MB_LEN_MAX },
225 	  }
226 	},
227 	{
228 	  {
229 	    { 0,  1,  1,   0x0000 },
230 	    { 0,  1,  1,   0x0000 },
231 	    { 0,  0,  0,   0x0000 },
232 	  }
233 	}
234       },
235       { .is_last = 1 }
236     }
237   },
238   {
239     { Tmbtowc, TST_LOC_eucJP },
240     {
241       { /*----------------- #01 -----------------*/
242 	{
243 	  {
244 	    { 1, 1, "\244\242A",      1          },
245 	    { 1, 1, "\244\242A",      2          },
246 	    { 1, 1, "\244\242A",      MB_LEN_MAX },
247 	  }
248 	},
249 	{
250 	  {
251 	    /* XXX EILSEQ was introduced in ISO C99.  */
252 	    { 0,	  1, -1,   0x0000 },
253 	    { 0,       1,  2,   0x3042 },
254 	    { 0,       1,  2,   0x3042 },
255 	  }
256 	}
257       },
258       { /*----------------- #02 -----------------*/
259 	{
260 	  {
261 	    { 1, 1, "\177\244\242",   MB_LEN_MAX },
262 	    { 1, 1, "\377\244\242",   MB_LEN_MAX },
263 	    { 1, 1, "\201\244\242",   MB_LEN_MAX },
264 	  }
265 	},
266 	{
267 	  {
268 	    { 0,  1, +1,   0x007F },
269 	    { 0,  1, -1,   0x0000 },
270 	    { 0,  1, +1,   0x0081 },
271 	  }
272 	}
273       },
274       { /*----------------- #03 -----------------*/
275 	{
276 	  {
277 	    { 1, 1, "",         MB_LEN_MAX },
278 	    { 0, 1, "\244\242A",      1          },
279 	    { 0, 1, "\244\242A",      2          },
280 	  }
281 	},
282 	{
283 	  {
284 	    { 0,  1,  0,   0x0000 },
285 	    /* XXX EILSEQ was introduced in ISO C99.  */
286 	    { 0,       1, -1,   0x0000 },
287 	    { 0,  1,  2,   0x0000 },
288 	  }
289 	}
290       },
291       { /*----------------- #04 -----------------*/
292 	{
293 	  {
294 	    { 0, 1, "\244\242A",      MB_LEN_MAX },
295 	    { 0, 1, "\177\244\242",   MB_LEN_MAX },
296 	    { 0, 1, "",		      MB_LEN_MAX },
297 	  }
298 	},
299 	{
300 	  {
301 	    { 0,  1,  2,   0x0000 },
302 	    { 0,  1, +1,   0x0000 },
303 	    { 0,  1,  0,   0x0000 },
304 	  }
305 	}
306       },
307       { /*----------------- #05 -----------------*/
308 	{
309 	  {
310 	    { 0, 1, "\244\242A",      MB_LEN_MAX },
311 	    { 0, 1, "\177\244\242",   MB_LEN_MAX },
312 	    { 0, 0, NULL,	      MB_LEN_MAX },
313 	  }
314 	},
315 	{
316 	  {
317 	    { 0,  1,  2,   0x0000 },
318 	    { 0,  1, +1,   0x0000 },
319 	    { 0,  0,  0,   0x0000 },
320 	  }
321 	}
322       },
323       { .is_last = 1 }
324     }
325   },
326   {
327     { Tmbtowc, TST_LOC_end }
328   }
329 };
330