1 /*
2 WCSTOMBS: size_t wcstombs (char *s, const wchar_t *ws, size_t n)
3 */
4
5 #define TST_FUNCTION wcstombs
6
7 #include "tsp_common.c"
8 #include "dat_wcstombs.c"
9
10 #define MARK_VAL 0x01
11
12 int
tst_wcstombs(FILE * fp,int debug_flg)13 tst_wcstombs (FILE * fp, int debug_flg)
14 {
15 TST_DECL_VARS (size_t);
16 char s_flg, n;
17 wchar_t *ws;
18 char s[MBSSIZE], *s_in;
19 int err, i;
20 char *s_ex;
21
22 TST_DO_TEST (wcstombs)
23 {
24 TST_HEAD_LOCALE (wcstombs, S_WCSTOMBS);
25 TST_DO_REC (wcstombs)
26 {
27 TST_GET_ERRET (wcstombs);
28 memset (s, MARK_VAL, MBSSIZE);
29
30 s_flg = TST_INPUT (wcstombs).s_flg;
31 s_in = (s_flg == 1) ? s : (char *) NULL;
32 ws = TST_INPUT (wcstombs).ws;
33 n = TST_INPUT (wcstombs).n;
34
35 TST_CLEAR_ERRNO;
36 ret = wcstombs (s_in, ws, n);
37 TST_SAVE_ERRNO;
38
39 if (debug_flg)
40 {
41 fprintf (stdout, "wcstombs: ret = %zu\n", ret);
42 }
43
44 TST_IF_RETURN (S_WCSTOMBS)
45 {
46 };
47
48 if (s_in != NULL && ret != (size_t) - 1)
49 {
50 /* No definition for s, when error occurs. */
51 s_ex = TST_EXPECT (wcstombs).s;
52
53 for (err = 0, i = 0; i <= ret && i < MBSSIZE; i++)
54 {
55 if (debug_flg)
56 {
57 fprintf (stdout,
58 " : s[%d] = 0x%hx <-> 0x%hx = s_ex[%d]\n", i,
59 s[i], s_ex[i], i);
60 }
61
62 if (i == ret && ret == n) /* no null termination */
63 {
64 if (s[i] == MARK_VAL)
65 {
66 Result (C_SUCCESS, S_WCSTOMBS, CASE_4, MS_PASSED);
67 }
68 else
69 {
70 err_count++;
71 Result (C_FAILURE, S_WCSTOMBS, CASE_4,
72 "should not be null terminated "
73 "(it may be a null char), but it is");
74 }
75
76 break;
77 }
78
79 if (i == ret && ret < n) /* null termination */
80 {
81 if (s[i] == 0)
82 {
83 Result (C_SUCCESS, S_WCSTOMBS, CASE_5, MS_PASSED);
84 }
85 else
86 {
87 err_count++;
88 Result (C_FAILURE, S_WCSTOMBS, CASE_5,
89 "should be null terminated, but it is not");
90 }
91
92 break;
93 }
94
95 if (s[i] != s_ex[i])
96 {
97 err++;
98 err_count++;
99 Result (C_FAILURE, S_WCSTOMBS, CASE_6,
100 "converted string is different from an "
101 "expected string");
102 break;
103 }
104 }
105
106 if (!err)
107 {
108 Result (C_SUCCESS, S_WCSTOMBS, CASE_6, MS_PASSED);
109 }
110 }
111 }
112 }
113
114 return err_count;
115 }
116