1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for wcstombs_s 5 */ 6 7 #include <apitest.h> 8 9 #define WIN32_NO_STATUS 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <specstrings.h> 13 14 #define ok_errno(x) ok_hex(errno, (x)) 15 16 #undef ok_char 17 #define ok_char(x,y) ok_int((unsigned)(unsigned char)(x),(unsigned)(unsigned char)(y)) 18 #define ok_wchar(x,y) ok_int((unsigned)(unsigned short)(x),(unsigned)(unsigned short)(y)) 19 20 _Check_return_wat_ 21 _CRTIMP 22 errno_t 23 __cdecl 24 wcstombs_s( 25 _Out_opt_ size_t * pcchConverted, 26 _Out_writes_bytes_to_opt_(cjDstSize, *pcchConverted) 27 char * pmbsDst, 28 _In_ size_t cjDstSize, 29 _In_z_ const wchar_t * pwszSrc, 30 _In_ size_t cjMaxCount); 31 32 33 START_TEST(wcstombs_s) 34 { 35 errno_t ret; 36 size_t cchConverted; 37 char mbsbuffer[10]; 38 39 *_errno() = 0; 40 cchConverted = 0xf00bac; 41 mbsbuffer[5] = 0xFF; 42 ret = wcstombs_s(&cchConverted, mbsbuffer, 6, L"hallo", 5); 43 ok_long(ret, 0); 44 ok_size_t(cchConverted, 6); 45 ok_char(mbsbuffer[5], 0); 46 ok_str(mbsbuffer, "hallo"); 47 ok_errno(0); 48 49 *_errno() = 0; 50 cchConverted = 0xf00bac; 51 mbsbuffer[0] = 0xFF; 52 ret = wcstombs_s(&cchConverted, mbsbuffer, 1, L"", 0); 53 ok_long(ret, 0); 54 ok_size_t(cchConverted, 1); 55 ok_wchar(mbsbuffer[0], 0); 56 ok_errno(0); 57 58 *_errno() = 0; 59 cchConverted = 0xf00bac; 60 mbsbuffer[0] = 0xFF; 61 mbsbuffer[1] = 0xFF; 62 mbsbuffer[2] = 0xFF; 63 mbsbuffer[3] = 0xFF; 64 mbsbuffer[4] = 0xFF; 65 mbsbuffer[5] = 0xFF; 66 ret = wcstombs_s(&cchConverted, mbsbuffer, 5, L"hallo", 5); 67 ok_long(ret, ERANGE); 68 ok_size_t(cchConverted, 0); 69 ok_char(mbsbuffer[5], 0xFF); 70 ok_char(mbsbuffer[4], L'o'); 71 ok_char(mbsbuffer[3], L'l'); 72 ok_char(mbsbuffer[2], L'l'); 73 ok_char(mbsbuffer[1], L'a'); 74 ok_char(mbsbuffer[0], 0); 75 ok_errno(ERANGE); 76 77 *_errno() = 0; 78 cchConverted = 0xf00bac; 79 mbsbuffer[0] = 0xFF; 80 mbsbuffer[1] = 0xFF; 81 mbsbuffer[2] = 0xFF; 82 mbsbuffer[3] = 0xFF; 83 mbsbuffer[4] = 0xFF; 84 mbsbuffer[5] = 0xFF; 85 ret = wcstombs_s(&cchConverted, mbsbuffer, 3, L"hallo", 5); 86 ok_long(ret, ERANGE); 87 ok_size_t(cchConverted, 0); 88 ok_char(mbsbuffer[5], 0xFF); 89 ok_char(mbsbuffer[4], 0xFF); 90 ok_char(mbsbuffer[3], 0xFF); 91 ok_char(mbsbuffer[2], L'l'); 92 ok_char(mbsbuffer[1], L'a'); 93 ok_char(mbsbuffer[0], 0); 94 ok_errno(ERANGE); 95 96 *_errno() = 0; 97 ret = wcstombs_s(0, 0, 0, 0, 0); 98 ok_long(ret, EINVAL); 99 ok_errno(EINVAL); 100 101 *_errno() = 0; 102 cchConverted = 0xf00bac; 103 ret = wcstombs_s(&cchConverted, 0, 0, 0, 0); 104 ok_long(ret, EINVAL); 105 ok_size_t(cchConverted, 0); 106 ok_errno(EINVAL); 107 108 *_errno() = 0; 109 mbsbuffer[0] = L'x'; 110 ret = wcstombs_s(0, mbsbuffer, 0, 0, 0); 111 ok_long(ret, EINVAL); 112 ok_char(mbsbuffer[0], L'x'); 113 ok_errno(EINVAL); 114 115 *_errno() = 0; 116 ret = wcstombs_s(0, mbsbuffer, 10, L"hallo", 5); 117 ok_long(ret, 0); 118 ok_errno(0); 119 120 *_errno() = 0; 121 ret = wcstombs_s(0, mbsbuffer, 0, L"hallo", 5); 122 ok_long(ret, EINVAL); 123 ok_errno(EINVAL); 124 125 *_errno() = 0; 126 cchConverted = 0xf00bac; 127 ret = wcstombs_s(&cchConverted, 0, 10, L"hallo", 5); 128 ok_long(ret, EINVAL); 129 ok_size_t(cchConverted, 0xf00bac); 130 ok_errno(EINVAL); 131 132 *_errno() = 0; 133 cchConverted = 0xf00bac; 134 ret = wcstombs_s(&cchConverted, 0, 0, L"hallo", 5); 135 ok_long(ret, 0); 136 ok_size_t(cchConverted, 6); 137 ok_errno(0); 138 139 *_errno() = 0; 140 cchConverted = 0xf00bac; 141 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, 0, 5); 142 ok_long(ret, EINVAL); 143 ok_size_t(cchConverted, 0); 144 ok_errno(EINVAL); 145 146 *_errno() = 0; 147 cchConverted = 0xf00bac; 148 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 0); 149 ok_long(ret, 0); 150 ok_size_t(cchConverted, 1); 151 ok_errno(0); 152 153 *_errno() = 0; 154 cchConverted = 0xf00bac; 155 mbsbuffer[0] = 0xAB; 156 mbsbuffer[1] = 0xCD; 157 mbsbuffer[2] = 0xAB; 158 mbsbuffer[3] = 0xCD; 159 mbsbuffer[4] = 0xAB; 160 mbsbuffer[5] = 0xCD; 161 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 2); 162 ok_long(ret, 0); 163 ok_size_t(cchConverted, 3); 164 ok_char(mbsbuffer[5], 0xCD); 165 ok_char(mbsbuffer[4], 0xAB); 166 ok_char(mbsbuffer[3], 0xCD); 167 ok_char(mbsbuffer[2], 0); 168 ok_char(mbsbuffer[1], L'a'); 169 ok_char(mbsbuffer[0], L'h'); 170 ok_errno(0); 171 172 *_errno() = 0; 173 cchConverted = 0xf00bac; 174 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, 0, 0); 175 ok_long(ret, 0); 176 ok_size_t(cchConverted, 1); 177 ok_errno(0); 178 179 *_errno() = 0; 180 cchConverted = 0xf00bac; 181 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 7); 182 ok_long(ret, 0); 183 ok_size_t(cchConverted, 6); 184 ok_errno(0); 185 186 *_errno() = 0; 187 cchConverted = 0xf00bac; 188 ret = wcstombs_s(&cchConverted, 0, 0, L"hallo", 7); 189 ok_long(ret, 0); 190 ok_size_t(cchConverted, 6); 191 ok_errno(0); 192 193 *_errno() = 0; 194 cchConverted = 0xf00bac; 195 mbsbuffer[0] = 0xAB; 196 mbsbuffer[1] = 0xCD; 197 mbsbuffer[2] = 0xAB; 198 mbsbuffer[3] = 0xCD; 199 mbsbuffer[4] = 0xAB; 200 mbsbuffer[5] = 0xCD; 201 ret = wcstombs_s(&cchConverted, mbsbuffer, 5, L"hallo", _TRUNCATE); 202 ok_long(ret, STRUNCATE); 203 ok_size_t(cchConverted, 5); 204 ok_char(mbsbuffer[5], 0xCD); 205 ok_char(mbsbuffer[4], 0); 206 ok_char(mbsbuffer[3], L'l'); 207 ok_char(mbsbuffer[2], L'l'); 208 ok_char(mbsbuffer[1], L'a'); 209 ok_char(mbsbuffer[0], L'h'); 210 ok_errno(0); 211 212 *_errno() = 0; 213 cchConverted = 0xf00bac; 214 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", -1); 215 ok_long(ret, 0); 216 ok_size_t(cchConverted, 6); 217 ok_errno(0); 218 219 } 220