Tests for mbsrtowcs.
[kopensolaris-gnu/glibc.git] / localedata / tests-mbwc / tst_mbsrtowcs.c
1 /*
2   MBSRTOWCS: size_t mbsrtowcs (wchar_t *ws, const char **s, size_t n,
3                                mbstate_t *ps)
4 */
5
6 #define TST_FUNCTION mbsrtowcs
7
8 #include "tsp_common.c"
9 #include "dat_mbsrtowcs.c"
10
11 int
12 tst_mbsrtowcs (FILE * fp, int debug_flg)
13 {
14   TST_DECL_VARS (size_t);
15   char w_flg;
16   const char *s, *p;
17   size_t n;
18   char t_flg, t_ini;
19   static mbstate_t t = { 0 };
20   mbstate_t *pt;
21   wchar_t ws[WCSSIZE], *ws_ex, *wp;
22   int err, i;
23
24   TST_DO_TEST (mbsrtowcs)
25   {
26     TST_HEAD_LOCALE (mbsrtowcs, S_MBSRTOWCS);
27     TST_DO_REC (mbsrtowcs)
28     {
29       s = "";
30       if (mbsrtowcs (NULL, &s, 0, &t) != 0)
31         {
32           err_count++;
33           Result (C_FAILURE, S_MBSRTOWCS, CASE_3,
34                   "Initialization failed - skipping this test case.");
35           continue;
36         }
37
38       TST_DO_SEQ (MBSRTOWCS_SEQNUM)
39       {
40         TST_GET_ERRET_SEQ (mbsrtowcs);
41         w_flg = TST_INPUT_SEQ (mbsrtowcs).w_flg;
42         p = s = TST_INPUT_SEQ (mbsrtowcs).s;
43         n = TST_INPUT_SEQ (mbsrtowcs).n;
44         t_flg = TST_INPUT_SEQ (mbsrtowcs).t_flg;
45         t_ini = TST_INPUT_SEQ (mbsrtowcs).t_init;
46         wp = (w_flg == 0) ? NULL : ws;
47
48         if (n == USE_MBCURMAX)
49           {
50             n = MB_CUR_MAX;
51           }
52
53         pt = (t_flg == 0) ? NULL : &t;
54
55         if (t_ini != 0)
56           {
57             memset (&t, 0, sizeof (t));
58           }
59
60         TST_CLEAR_ERRNO;
61         ret = mbsrtowcs (wp, &p, n, pt);
62         TST_SAVE_ERRNO;
63
64         if (debug_flg)
65           {
66             fprintf (stderr, "mbsrtowcs: [ %d ] : ret = %d\n", rec + 1, ret);
67           }
68
69         TST_IF_RETURN (S_MBSRTOWCS)
70         {
71         };
72
73         if (wp == NULL || ret == (size_t) - 1 || ret == (size_t) - 2)
74           {
75             continue;
76           }
77
78         ws_ex = TST_EXPECT_SEQ (mbsrtowcs).ws;
79         for (err = 0, i = 0; i < ret; i++)
80           {
81             if (debug_flg)
82               {
83                 fprintf (stderr,
84                          "mbsrtowcs: ws[%d] => 0x%lx : 0x%lx <= ws_ex[%d]\n",
85                          i, ws[i], ws_ex[i], i);
86               }
87
88             if (ws[i] != ws_ex[i])
89               {
90                 err++;
91                 err_count++;
92                 Result (C_FAILURE, S_MBSRTOWCS, CASE_4,
93                         "the converted wc string has "
94                         "different value from an expected string");
95                 break;
96               }
97           }
98
99         if (!err)
100           {
101             Result (C_SUCCESS, S_MBSRTOWCS, CASE_4, MS_PASSED);
102           }
103       }
104     }
105   }
106
107   return err_count;
108 }