1 | /* |
2 | WCSNCPY: wchar_t *wcsncpy (wchar_t *ws1, const wchar_t *ws2, size_t n); |
3 | */ |
4 | |
5 | #define TST_FUNCTION wcsncpy |
6 | |
7 | #include "tsp_common.c" |
8 | #include "dat_wcsncpy.c" |
9 | |
10 | #define WCSNUM_NCPY 7 |
11 | |
12 | int |
13 | tst_wcsncpy (FILE *fp, int debug_flg) |
14 | { |
15 | TST_DECL_VARS (wchar_t *); |
16 | wchar_t ws1[WCSSIZE] = |
17 | { 0x9999, 0x9999, 0x9999, 0x9999, 0x9999, 0x9999, 0x0000 }; |
18 | wchar_t *ws2, *ws_ex; |
19 | int err, i; |
20 | size_t n; |
21 | |
22 | TST_DO_TEST (wcsncpy) |
23 | { |
24 | TST_HEAD_LOCALE (wcsncpy, S_WCSNCPY); |
25 | TST_DO_REC (wcsncpy) |
26 | { |
27 | TST_GET_ERRET (wcsncpy); |
28 | |
29 | for (n = 0; n < WCSNUM_NCPY - 1; ++n) |
30 | { |
31 | ws1[n] = 0x9999; |
32 | } |
33 | |
34 | ws1[n] = 0; |
35 | ws2 = TST_INPUT (wcsncpy).ws; /* external value: size WCSSIZE */ |
36 | n = TST_INPUT (wcsncpy).n; |
37 | ret = wcsncpy (dest: ws1, src: ws2, n: n); |
38 | |
39 | TST_IF_RETURN (S_WCSNCPY) |
40 | { |
41 | if (ret == ws1) |
42 | { |
43 | Result (C_SUCCESS, S_WCSNCPY, CASE_3, MS_PASSED); |
44 | } |
45 | else |
46 | { |
47 | err_count++; |
48 | Result (C_FAILURE, S_WCSNCPY, CASE_3, |
49 | "the return address may not be correct" ); |
50 | } |
51 | } |
52 | |
53 | if (ret == ws1) |
54 | { |
55 | if (debug_flg) |
56 | { |
57 | fprintf (stderr, "\nwcsncpy: n = %zu\n\n" , n); |
58 | } |
59 | |
60 | ws_ex = TST_EXPECT (wcsncpy).ws; |
61 | |
62 | for (err = 0, i = 0; i < WCSNUM_NCPY && i < WCSSIZE; i++) |
63 | { |
64 | if (debug_flg) |
65 | fprintf (stderr, |
66 | "wcsncpy: ws1[ %d ] = 0x%lx <-> wx_ex[ %d ] = 0x%lx\n" , |
67 | i, (unsigned long int) ws1[i], i, |
68 | (unsigned long int) ws_ex[i]); |
69 | |
70 | if (ws1[i] != ws_ex[i]) |
71 | { |
72 | err++; |
73 | err_count++; |
74 | Result (C_FAILURE, S_WCSNCPY, CASE_4, |
75 | "copied string is different from an " |
76 | "expected string" ); |
77 | break; |
78 | } |
79 | } |
80 | |
81 | if (!err) |
82 | { |
83 | Result (C_SUCCESS, S_WCSNCPY, CASE_4, MS_PASSED); |
84 | } |
85 | |
86 | /* A null terminate character is not supposed to be copied |
87 | unless (num chars of ws2)<n. */ |
88 | } |
89 | } |
90 | } |
91 | |
92 | return err_count; |
93 | } |
94 | |