[9995] | 1 | /* Unit test suite for string functions and some wcstring functions
|
---|
| 2 | *
|
---|
| 3 | * Copyright 2003 Thomas Mertes
|
---|
| 4 | *
|
---|
| 5 | * This library is free software; you can redistribute it and/or
|
---|
| 6 | * modify it under the terms of the GNU Lesser General Public
|
---|
| 7 | * License as published by the Free Software Foundation; either
|
---|
| 8 | * version 2.1 of the License, or (at your option) any later version.
|
---|
| 9 | *
|
---|
| 10 | * This library is distributed in the hope that it will be useful,
|
---|
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
| 13 | * Lesser General Public License for more details.
|
---|
| 14 | *
|
---|
| 15 | * You should have received a copy of the GNU Lesser General Public
|
---|
| 16 | * License along with this library; if not, write to the Free Software
|
---|
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
| 18 | *
|
---|
| 19 | * NOTES
|
---|
| 20 | * We use function pointers here as there is no import library for NTDLL on
|
---|
| 21 | * windows.
|
---|
| 22 | */
|
---|
| 23 |
|
---|
| 24 | #include <stdlib.h>
|
---|
| 25 |
|
---|
| 26 | #include "winbase.h"
|
---|
| 27 | #include "test.h"
|
---|
| 28 | #include "winnt.h"
|
---|
| 29 | #include "winnls.h"
|
---|
| 30 | #include "winternl.h"
|
---|
| 31 |
|
---|
| 32 | /* Function ptrs for ntdll calls */
|
---|
| 33 | static HMODULE hntdll = 0;
|
---|
| 34 | static NTSTATUS (WINAPI *pRtlUnicodeStringToAnsiString)(STRING *, const UNICODE_STRING *, BOOLEAN);
|
---|
| 35 | static VOID (WINAPI *pRtlFreeAnsiString)(PSTRING);
|
---|
| 36 | static BOOLEAN (WINAPI *pRtlCreateUnicodeStringFromAsciiz)(PUNICODE_STRING,LPCSTR);
|
---|
| 37 | static VOID (WINAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
|
---|
| 38 |
|
---|
| 39 | static int (WINAPIV *patoi)(const char *);
|
---|
| 40 | static long (WINAPIV *patol)(const char *);
|
---|
| 41 | static LONGLONG (WINAPIV *p_atoi64)(const char *);
|
---|
| 42 | static LPSTR (WINAPIV *p_itoa)(int, LPSTR, INT);
|
---|
| 43 | static LPSTR (WINAPIV *p_ltoa)(long, LPSTR, INT);
|
---|
| 44 | static LPSTR (WINAPIV *p_ultoa)(unsigned long, LPSTR, INT);
|
---|
| 45 | static LPSTR (WINAPIV *p_i64toa)(LONGLONG, LPSTR, INT);
|
---|
| 46 | static LPSTR (WINAPIV *p_ui64toa)(ULONGLONG, LPSTR, INT);
|
---|
| 47 |
|
---|
| 48 | static int (WINAPIV *p_wtoi)(LPWSTR);
|
---|
| 49 | static long (WINAPIV *p_wtol)(LPWSTR);
|
---|
| 50 | static LONGLONG (WINAPIV *p_wtoi64)(LPWSTR);
|
---|
| 51 | static LPWSTR (WINAPIV *p_itow)(int, LPWSTR, int);
|
---|
| 52 | static LPWSTR (WINAPIV *p_ltow)(long, LPWSTR, INT);
|
---|
| 53 | static LPWSTR (WINAPIV *p_ultow)(unsigned long, LPWSTR, INT);
|
---|
| 54 | static LPWSTR (WINAPIV *p_i64tow)(LONGLONG, LPWSTR, INT);
|
---|
| 55 | static LPWSTR (WINAPIV *p_ui64tow)(ULONGLONG, LPWSTR, INT);
|
---|
| 56 |
|
---|
| 57 | static long (WINAPIV *pwcstol)(LPCWSTR, LPWSTR *, INT);
|
---|
| 58 | static ULONG (WINAPIV *pwcstoul)(LPCWSTR, LPWSTR *, INT);
|
---|
| 59 |
|
---|
| 60 |
|
---|
| 61 | static void InitFunctionPtrs()
|
---|
| 62 | {
|
---|
| 63 | hntdll = LoadLibraryA("ntdll.dll");
|
---|
| 64 | ok(hntdll != 0, "LoadLibrary failed");
|
---|
| 65 | if (hntdll) {
|
---|
| 66 | pRtlUnicodeStringToAnsiString = (void *)GetProcAddress(hntdll, "RtlUnicodeStringToAnsiString");
|
---|
| 67 | pRtlFreeAnsiString = (void *)GetProcAddress(hntdll, "RtlFreeAnsiString");
|
---|
| 68 | pRtlCreateUnicodeStringFromAsciiz = (void *)GetProcAddress(hntdll, "RtlCreateUnicodeStringFromAsciiz");
|
---|
| 69 | pRtlFreeUnicodeString = (void *)GetProcAddress(hntdll, "RtlFreeUnicodeString");
|
---|
| 70 |
|
---|
| 71 | patoi = (void *)GetProcAddress(hntdll, "atoi");
|
---|
| 72 | patol = (void *)GetProcAddress(hntdll, "atol");
|
---|
| 73 | p_atoi64 = (void *)GetProcAddress(hntdll, "_atoi64");
|
---|
| 74 | p_itoa = (void *)GetProcAddress(hntdll, "_itoa");
|
---|
| 75 | p_ltoa = (void *)GetProcAddress(hntdll, "_ltoa");
|
---|
| 76 | p_ultoa = (void *)GetProcAddress(hntdll, "_ultoa");
|
---|
| 77 | p_i64toa = (void *)GetProcAddress(hntdll, "_i64toa");
|
---|
| 78 | p_ui64toa = (void *)GetProcAddress(hntdll, "_ui64toa");
|
---|
| 79 |
|
---|
| 80 | p_wtoi = (void *)GetProcAddress(hntdll, "_wtoi");
|
---|
| 81 | p_wtol = (void *)GetProcAddress(hntdll, "_wtol");
|
---|
| 82 | p_wtoi64 = (void *)GetProcAddress(hntdll, "_wtoi64");
|
---|
| 83 | p_itow = (void *)GetProcAddress(hntdll, "_itow");
|
---|
| 84 | p_ltow = (void *)GetProcAddress(hntdll, "_ltow");
|
---|
| 85 | p_ultow = (void *)GetProcAddress(hntdll, "_ultow");
|
---|
| 86 | p_i64tow = (void *)GetProcAddress(hntdll, "_i64tow");
|
---|
| 87 | p_ui64tow = (void *)GetProcAddress(hntdll, "_ui64tow");
|
---|
| 88 |
|
---|
| 89 | pwcstol = (void *)GetProcAddress(hntdll, "wcstol");
|
---|
| 90 | pwcstoul = (void *)GetProcAddress(hntdll, "wcstoul");
|
---|
| 91 | } /* if */
|
---|
| 92 | }
|
---|
| 93 |
|
---|
| 94 |
|
---|
| 95 | #define LARGE_STRI_BUFFER_LENGTH 67
|
---|
| 96 |
|
---|
| 97 | typedef struct {
|
---|
| 98 | int base;
|
---|
| 99 | ULONG value;
|
---|
| 100 | char *Buffer;
|
---|
| 101 | int mask; /* ntdll/msvcrt: 0x01=itoa, 0x02=ltoa, 0x04=ultoa */
|
---|
| 102 | /* 0x10=itow, 0x20=ltow, 0x40=ultow */
|
---|
| 103 | } ulong2str_t;
|
---|
| 104 |
|
---|
| 105 | static const ulong2str_t ulong2str[] = {
|
---|
| 106 | {10, 123, "123\0---------------------------------------------------------------", 0x77},
|
---|
| 107 |
|
---|
| 108 | { 2, 0x80000000U, "10000000000000000000000000000000\0----------------------------------", 0x67},
|
---|
| 109 | { 2, -2147483647, "10000000000000000000000000000001\0----------------------------------", 0x67},
|
---|
| 110 | { 2, -65537, "11111111111111101111111111111111\0----------------------------------", 0x67},
|
---|
| 111 | { 2, -65536, "11111111111111110000000000000000\0----------------------------------", 0x67},
|
---|
| 112 | { 2, -65535, "11111111111111110000000000000001\0----------------------------------", 0x67},
|
---|
| 113 | { 2, -32768, "11111111111111111000000000000000\0----------------------------------", 0x67},
|
---|
| 114 | { 2, -32767, "11111111111111111000000000000001\0----------------------------------", 0x67},
|
---|
| 115 | { 2, -2, "11111111111111111111111111111110\0----------------------------------", 0x67},
|
---|
| 116 | { 2, -1, "11111111111111111111111111111111\0----------------------------------", 0x67},
|
---|
| 117 | { 2, 0, "0\0-----------------------------------------------------------------", 0x77},
|
---|
| 118 | { 2, 1, "1\0-----------------------------------------------------------------", 0x77},
|
---|
| 119 | { 2, 10, "1010\0--------------------------------------------------------------", 0x77},
|
---|
| 120 | { 2, 100, "1100100\0-----------------------------------------------------------", 0x77},
|
---|
| 121 | { 2, 1000, "1111101000\0--------------------------------------------------------", 0x77},
|
---|
| 122 | { 2, 10000, "10011100010000\0----------------------------------------------------", 0x77},
|
---|
| 123 | { 2, 32767, "111111111111111\0---------------------------------------------------", 0x77},
|
---|
| 124 | { 2, 32768, "1000000000000000\0--------------------------------------------------", 0x77},
|
---|
| 125 | { 2, 65535, "1111111111111111\0--------------------------------------------------", 0x77},
|
---|
| 126 | { 2, 100000, "11000011010100000\0-------------------------------------------------", 0x77},
|
---|
| 127 | { 2, 234567, "111001010001000111\0------------------------------------------------", 0x77},
|
---|
| 128 | { 2, 300000, "1001001001111100000\0-----------------------------------------------", 0x77},
|
---|
| 129 | { 2, 524287, "1111111111111111111\0-----------------------------------------------", 0x77},
|
---|
| 130 | { 2, 524288, "10000000000000000000\0----------------------------------------------", 0x67},
|
---|
| 131 | { 2, 1000000, "11110100001001000000\0----------------------------------------------", 0x67},
|
---|
| 132 | { 2, 10000000, "100110001001011010000000\0------------------------------------------", 0x67},
|
---|
| 133 | { 2, 100000000, "101111101011110000100000000\0---------------------------------------", 0x67},
|
---|
| 134 | { 2, 1000000000, "111011100110101100101000000000\0------------------------------------", 0x67},
|
---|
| 135 | { 2, 1073741823, "111111111111111111111111111111\0------------------------------------", 0x67},
|
---|
| 136 | { 2, 2147483646, "1111111111111111111111111111110\0-----------------------------------", 0x67},
|
---|
| 137 | { 2, 2147483647, "1111111111111111111111111111111\0-----------------------------------", 0x67},
|
---|
| 138 | { 2, 2147483648U, "10000000000000000000000000000000\0----------------------------------", 0x67},
|
---|
| 139 | { 2, 2147483649U, "10000000000000000000000000000001\0----------------------------------", 0x67},
|
---|
| 140 | { 2, 4294967294U, "11111111111111111111111111111110\0----------------------------------", 0x67},
|
---|
| 141 | { 2, 0xFFFFFFFF, "11111111111111111111111111111111\0----------------------------------", 0x67},
|
---|
| 142 |
|
---|
| 143 | { 8, 0x80000000U, "20000000000\0-------------------------------------------------------", 0x77},
|
---|
| 144 | { 8, -2147483647, "20000000001\0-------------------------------------------------------", 0x77},
|
---|
| 145 | { 8, -2, "37777777776\0-------------------------------------------------------", 0x77},
|
---|
| 146 | { 8, -1, "37777777777\0-------------------------------------------------------", 0x77},
|
---|
| 147 | { 8, 0, "0\0-----------------------------------------------------------------", 0x77},
|
---|
| 148 | { 8, 1, "1\0-----------------------------------------------------------------", 0x77},
|
---|
| 149 | { 8, 2147483646, "17777777776\0-------------------------------------------------------", 0x77},
|
---|
| 150 | { 8, 2147483647, "17777777777\0-------------------------------------------------------", 0x77},
|
---|
| 151 | { 8, 2147483648U, "20000000000\0-------------------------------------------------------", 0x77},
|
---|
| 152 | { 8, 2147483649U, "20000000001\0-------------------------------------------------------", 0x77},
|
---|
| 153 | { 8, 4294967294U, "37777777776\0-------------------------------------------------------", 0x77},
|
---|
| 154 | { 8, 4294967295U, "37777777777\0-------------------------------------------------------", 0x77},
|
---|
| 155 |
|
---|
| 156 | {10, 0x80000000U, "-2147483648\0-------------------------------------------------------", 0x33},
|
---|
| 157 | {10, 0x80000000U, "2147483648\0--------------------------------------------------------", 0x44},
|
---|
| 158 | {10, -2147483647, "-2147483647\0-------------------------------------------------------", 0x33},
|
---|
| 159 | {10, -2147483647, "2147483649\0--------------------------------------------------------", 0x44},
|
---|
| 160 | {10, -2, "-2\0----------------------------------------------------------------", 0x33},
|
---|
| 161 | {10, -2, "4294967294\0--------------------------------------------------------", 0x44},
|
---|
| 162 | {10, -1, "-1\0----------------------------------------------------------------", 0x33},
|
---|
| 163 | {10, -1, "4294967295\0--------------------------------------------------------", 0x44},
|
---|
| 164 | {10, 0, "0\0-----------------------------------------------------------------", 0x77},
|
---|
| 165 | {10, 1, "1\0-----------------------------------------------------------------", 0x77},
|
---|
| 166 | {10, 12, "12\0----------------------------------------------------------------", 0x77},
|
---|
| 167 | {10, 123, "123\0---------------------------------------------------------------", 0x77},
|
---|
| 168 | {10, 1234, "1234\0--------------------------------------------------------------", 0x77},
|
---|
| 169 | {10, 12345, "12345\0-------------------------------------------------------------", 0x77},
|
---|
| 170 | {10, 123456, "123456\0------------------------------------------------------------", 0x77},
|
---|
| 171 | {10, 1234567, "1234567\0-----------------------------------------------------------", 0x77},
|
---|
| 172 | {10, 12345678, "12345678\0----------------------------------------------------------", 0x77},
|
---|
| 173 | {10, 123456789, "123456789\0---------------------------------------------------------", 0x77},
|
---|
| 174 | {10, 2147483646, "2147483646\0--------------------------------------------------------", 0x77},
|
---|
| 175 | {10, 2147483647, "2147483647\0--------------------------------------------------------", 0x77},
|
---|
| 176 | {10, 2147483648U, "-2147483648\0-------------------------------------------------------", 0x33},
|
---|
| 177 | {10, 2147483648U, "2147483648\0--------------------------------------------------------", 0x44},
|
---|
| 178 | {10, 2147483649U, "-2147483647\0-------------------------------------------------------", 0x33},
|
---|
| 179 | {10, 2147483649U, "2147483649\0--------------------------------------------------------", 0x44},
|
---|
| 180 | {10, 4294967294U, "-2\0----------------------------------------------------------------", 0x33},
|
---|
| 181 | {10, 4294967294U, "4294967294\0--------------------------------------------------------", 0x44},
|
---|
| 182 | {10, 4294967295U, "-1\0----------------------------------------------------------------", 0x33},
|
---|
| 183 | {10, 4294967295U, "4294967295\0--------------------------------------------------------", 0x44},
|
---|
| 184 |
|
---|
| 185 | {16, 0, "0\0-----------------------------------------------------------------", 0x77},
|
---|
| 186 | {16, 1, "1\0-----------------------------------------------------------------", 0x77},
|
---|
| 187 | {16, 2147483646, "7ffffffe\0----------------------------------------------------------", 0x77},
|
---|
| 188 | {16, 2147483647, "7fffffff\0----------------------------------------------------------", 0x77},
|
---|
| 189 | {16, 0x80000000, "80000000\0----------------------------------------------------------", 0x77},
|
---|
| 190 | {16, 0x80000001, "80000001\0----------------------------------------------------------", 0x77},
|
---|
| 191 | {16, 0xFFFFFFFE, "fffffffe\0----------------------------------------------------------", 0x77},
|
---|
| 192 | {16, 0xFFFFFFFF, "ffffffff\0----------------------------------------------------------", 0x77},
|
---|
| 193 |
|
---|
| 194 | { 2, 32768, "1000000000000000\0--------------------------------------------------", 0x77},
|
---|
| 195 | { 2, 65536, "10000000000000000\0-------------------------------------------------", 0x77},
|
---|
| 196 | { 2, 131072, "100000000000000000\0------------------------------------------------", 0x77},
|
---|
| 197 | {16, 0xffffffff, "ffffffff\0----------------------------------------------------------", 0x77},
|
---|
| 198 | {16, 0xa, "a\0-----------------------------------------------------------------", 0x77},
|
---|
| 199 | {16, 0, "0\0-----------------------------------------------------------------", 0x77},
|
---|
| 200 | {20, 3368421, "111111\0------------------------------------------------------------", 0x77},
|
---|
| 201 | {36, 62193781, "111111\0------------------------------------------------------------", 0x77},
|
---|
| 202 | {37, 71270178, "111111\0------------------------------------------------------------", 0x77},
|
---|
| 203 | };
|
---|
| 204 | #define NB_ULONG2STR (sizeof(ulong2str)/sizeof(*ulong2str))
|
---|
| 205 |
|
---|
| 206 |
|
---|
| 207 | static void one_itoa_test(int test_num, const ulong2str_t *ulong2str)
|
---|
| 208 | {
|
---|
| 209 | char dest_str[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 210 | int value;
|
---|
| 211 | LPSTR result;
|
---|
| 212 |
|
---|
| 213 | memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH);
|
---|
| 214 | dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 215 | value = ulong2str->value;
|
---|
| 216 | result = p_itoa(value, dest_str, ulong2str->base);
|
---|
| 217 | ok(result == dest_str,
|
---|
| 218 | "(test %d): _itoa(%d, [out], %d) has result %p, expected: %p",
|
---|
| 219 | test_num, value, ulong2str->base, result, dest_str);
|
---|
| 220 | ok(memcmp(dest_str, ulong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0,
|
---|
| 221 | "(test %d): _itoa(%d, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 222 | test_num, value, ulong2str->base, dest_str, ulong2str->Buffer);
|
---|
| 223 | }
|
---|
| 224 |
|
---|
| 225 |
|
---|
| 226 | static void one_ltoa_test(int test_num, const ulong2str_t *ulong2str)
|
---|
| 227 | {
|
---|
| 228 | char dest_str[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 229 | long value;
|
---|
| 230 | LPSTR result;
|
---|
| 231 |
|
---|
| 232 | memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH);
|
---|
| 233 | dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 234 | value = ulong2str->value;
|
---|
| 235 | result = p_ltoa(ulong2str->value, dest_str, ulong2str->base);
|
---|
| 236 | ok(result == dest_str,
|
---|
| 237 | "(test %d): _ltoa(%ld, [out], %d) has result %p, expected: %p",
|
---|
| 238 | test_num, value, ulong2str->base, result, dest_str);
|
---|
| 239 | ok(memcmp(dest_str, ulong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0,
|
---|
| 240 | "(test %d): _ltoa(%ld, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 241 | test_num, value, ulong2str->base, dest_str, ulong2str->Buffer);
|
---|
| 242 | }
|
---|
| 243 |
|
---|
| 244 |
|
---|
| 245 | static void one_ultoa_test(int test_num, const ulong2str_t *ulong2str)
|
---|
| 246 | {
|
---|
| 247 | char dest_str[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 248 | unsigned long value;
|
---|
| 249 | LPSTR result;
|
---|
| 250 |
|
---|
| 251 | memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH);
|
---|
| 252 | dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 253 | value = ulong2str->value;
|
---|
| 254 | result = p_ultoa(ulong2str->value, dest_str, ulong2str->base);
|
---|
| 255 | ok(result == dest_str,
|
---|
| 256 | "(test %d): _ultoa(%lu, [out], %d) has result %p, expected: %p",
|
---|
| 257 | test_num, value, ulong2str->base, result, dest_str);
|
---|
| 258 | ok(memcmp(dest_str, ulong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0,
|
---|
| 259 | "(test %d): _ultoa(%lu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 260 | test_num, value, ulong2str->base, dest_str, ulong2str->Buffer);
|
---|
| 261 | }
|
---|
| 262 |
|
---|
| 263 |
|
---|
| 264 | static void test_ulongtoa(void)
|
---|
| 265 | {
|
---|
| 266 | int test_num;
|
---|
| 267 |
|
---|
| 268 | for (test_num = 0; test_num < NB_ULONG2STR; test_num++) {
|
---|
| 269 | if (ulong2str[test_num].mask & 0x01) {
|
---|
| 270 | one_itoa_test(test_num, &ulong2str[test_num]);
|
---|
| 271 | } /* if */
|
---|
| 272 | if (ulong2str[test_num].mask & 0x02) {
|
---|
| 273 | one_ltoa_test(test_num, &ulong2str[test_num]);
|
---|
| 274 | } /* if */
|
---|
| 275 | if (ulong2str[test_num].mask & 0x04) {
|
---|
| 276 | one_ultoa_test(test_num, &ulong2str[test_num]);
|
---|
| 277 | } /* if */
|
---|
| 278 | } /* for */
|
---|
| 279 | }
|
---|
| 280 |
|
---|
| 281 |
|
---|
| 282 | static void one_itow_test(int test_num, const ulong2str_t *ulong2str)
|
---|
| 283 | {
|
---|
| 284 | int pos;
|
---|
| 285 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 286 | WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 287 | UNICODE_STRING unicode_string;
|
---|
| 288 | STRING ansi_str;
|
---|
| 289 | int value;
|
---|
| 290 | LPWSTR result;
|
---|
| 291 |
|
---|
| 292 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 293 | expected_wstr[pos] = ulong2str->Buffer[pos];
|
---|
| 294 | } /* for */
|
---|
| 295 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 296 |
|
---|
| 297 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 298 | dest_wstr[pos] = '-';
|
---|
| 299 | } /* for */
|
---|
| 300 | dest_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 301 | unicode_string.Length = LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR);
|
---|
| 302 | unicode_string.MaximumLength = unicode_string.Length + sizeof(WCHAR);
|
---|
| 303 | unicode_string.Buffer = dest_wstr;
|
---|
| 304 | value = ulong2str->value;
|
---|
| 305 | result = p_itow(value, dest_wstr, ulong2str->base);
|
---|
| 306 | pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1);
|
---|
| 307 | ok(result == dest_wstr,
|
---|
| 308 | "(test %d): _itow(%d, [out], %d) has result %p, expected: %p",
|
---|
| 309 | test_num, value, ulong2str->base, result, dest_wstr);
|
---|
| 310 | ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0,
|
---|
| 311 | "(test %d): _itow(%d, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 312 | test_num, value, ulong2str->base, ansi_str.Buffer, ulong2str->Buffer);
|
---|
| 313 | pRtlFreeAnsiString(&ansi_str);
|
---|
| 314 | }
|
---|
| 315 |
|
---|
| 316 |
|
---|
| 317 | static void one_ltow_test(int test_num, const ulong2str_t *ulong2str)
|
---|
| 318 | {
|
---|
| 319 | int pos;
|
---|
| 320 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 321 | WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 322 | UNICODE_STRING unicode_string;
|
---|
| 323 | STRING ansi_str;
|
---|
| 324 | long value;
|
---|
| 325 | LPWSTR result;
|
---|
| 326 |
|
---|
| 327 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 328 | expected_wstr[pos] = ulong2str->Buffer[pos];
|
---|
| 329 | } /* for */
|
---|
| 330 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 331 |
|
---|
| 332 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 333 | dest_wstr[pos] = '-';
|
---|
| 334 | } /* for */
|
---|
| 335 | dest_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 336 | unicode_string.Length = LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR);
|
---|
| 337 | unicode_string.MaximumLength = unicode_string.Length + sizeof(WCHAR);
|
---|
| 338 | unicode_string.Buffer = dest_wstr;
|
---|
| 339 |
|
---|
| 340 | value = ulong2str->value;
|
---|
| 341 | result = p_ltow(value, dest_wstr, ulong2str->base);
|
---|
| 342 | pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1);
|
---|
| 343 | ok(result == dest_wstr,
|
---|
| 344 | "(test %d): _ltow(%ld, [out], %d) has result %p, expected: %p",
|
---|
| 345 | test_num, value, ulong2str->base, result, dest_wstr);
|
---|
| 346 | ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0,
|
---|
| 347 | "(test %d): _ltow(%ld, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 348 | test_num, value, ulong2str->base, ansi_str.Buffer, ulong2str->Buffer);
|
---|
| 349 | pRtlFreeAnsiString(&ansi_str);
|
---|
| 350 | }
|
---|
| 351 |
|
---|
| 352 |
|
---|
| 353 | static void one_ultow_test(int test_num, const ulong2str_t *ulong2str)
|
---|
| 354 | {
|
---|
| 355 | int pos;
|
---|
| 356 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 357 | WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 358 | UNICODE_STRING unicode_string;
|
---|
| 359 | STRING ansi_str;
|
---|
| 360 | unsigned long value;
|
---|
| 361 | LPWSTR result;
|
---|
| 362 |
|
---|
| 363 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 364 | expected_wstr[pos] = ulong2str->Buffer[pos];
|
---|
| 365 | } /* for */
|
---|
| 366 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 367 |
|
---|
| 368 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 369 | dest_wstr[pos] = '-';
|
---|
| 370 | } /* for */
|
---|
| 371 | dest_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 372 | unicode_string.Length = LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR);
|
---|
| 373 | unicode_string.MaximumLength = unicode_string.Length + sizeof(WCHAR);
|
---|
| 374 | unicode_string.Buffer = dest_wstr;
|
---|
| 375 |
|
---|
| 376 | value = ulong2str->value;
|
---|
| 377 | result = p_ultow(value, dest_wstr, ulong2str->base);
|
---|
| 378 | pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1);
|
---|
| 379 | ok(result == dest_wstr,
|
---|
| 380 | "(test %d): _ultow(%lu, [out], %d) has result %p, expected: %p",
|
---|
| 381 | test_num, value, ulong2str->base, result, dest_wstr);
|
---|
| 382 | ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0,
|
---|
| 383 | "(test %d): _ultow(%lu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 384 | test_num, value, ulong2str->base, ansi_str.Buffer, ulong2str->Buffer);
|
---|
| 385 | pRtlFreeAnsiString(&ansi_str);
|
---|
| 386 | }
|
---|
| 387 |
|
---|
| 388 |
|
---|
| 389 | static void test_ulongtow(void)
|
---|
| 390 | {
|
---|
| 391 | int test_num;
|
---|
| 392 | int pos;
|
---|
| 393 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 394 | LPWSTR result;
|
---|
| 395 |
|
---|
| 396 | for (test_num = 0; test_num < NB_ULONG2STR; test_num++) {
|
---|
| 397 | if (ulong2str[test_num].mask & 0x10) {
|
---|
| 398 | one_itow_test(test_num, &ulong2str[test_num]);
|
---|
| 399 | } /* if */
|
---|
| 400 | if (ulong2str[test_num].mask & 0x20) {
|
---|
| 401 | one_ltow_test(test_num, &ulong2str[test_num]);
|
---|
| 402 | } /* if */
|
---|
| 403 | if (ulong2str[test_num].mask & 0x40) {
|
---|
| 404 | one_ultow_test(test_num, &ulong2str[test_num]);
|
---|
| 405 | } /* if */
|
---|
| 406 | } /* for */
|
---|
| 407 |
|
---|
| 408 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 409 | expected_wstr[pos] = ulong2str[0].Buffer[pos];
|
---|
| 410 | } /* for */
|
---|
| 411 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 412 | result = p_itow(ulong2str[0].value, NULL, 10);
|
---|
| 413 | ok(result == NULL,
|
---|
| 414 | "(test a): _itow(%ld, NULL, 10) has result %p, expected: NULL",
|
---|
| 415 | ulong2str[0].value, result);
|
---|
| 416 |
|
---|
| 417 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 418 | expected_wstr[pos] = ulong2str[0].Buffer[pos];
|
---|
| 419 | } /* for */
|
---|
| 420 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 421 | result = p_ltow(ulong2str[0].value, NULL, 10);
|
---|
| 422 | ok(result == NULL,
|
---|
| 423 | "(test b): _ltow(%ld, NULL, 10) has result %p, expected: NULL",
|
---|
| 424 | ulong2str[0].value, result);
|
---|
| 425 |
|
---|
| 426 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 427 | expected_wstr[pos] = ulong2str[0].Buffer[pos];
|
---|
| 428 | } /* for */
|
---|
| 429 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 430 | result = p_ultow(ulong2str[0].value, NULL, 10);
|
---|
| 431 | ok(result == NULL,
|
---|
| 432 | "(test c): _ultow(%ld, NULL, 10) has result %p, expected: NULL",
|
---|
| 433 | ulong2str[0].value, result);
|
---|
| 434 | }
|
---|
| 435 |
|
---|
| 436 |
|
---|
| 437 | typedef struct {
|
---|
| 438 | int base;
|
---|
| 439 | ULONGLONG value;
|
---|
| 440 | char *Buffer;
|
---|
| 441 | int mask; /* ntdll/msvcrt: 0x01=i64toa, 0x02=ui64toa, 0x04=wrong _i64toa try next example */
|
---|
| 442 | /* 0x10=i64tow, 0x20=ui64tow, 0x40=wrong _i64tow try next example */
|
---|
| 443 | } ulonglong2str_t;
|
---|
| 444 |
|
---|
| 445 | static const ulonglong2str_t ulonglong2str[] = {
|
---|
| 446 | {10, 123, "123\0---------------------------------------------------------------", 0x33},
|
---|
| 447 |
|
---|
| 448 | { 2, 0x80000000U, "10000000000000000000000000000000\0----------------------------------", 0x33},
|
---|
| 449 | { 2, -2147483647, "1111111111111111111111111111111110000000000000000000000000000001\0--", 0x33},
|
---|
| 450 | { 2, -65537, "1111111111111111111111111111111111111111111111101111111111111111\0--", 0x33},
|
---|
| 451 | { 2, -65536, "1111111111111111111111111111111111111111111111110000000000000000\0--", 0x33},
|
---|
| 452 | { 2, -65535, "1111111111111111111111111111111111111111111111110000000000000001\0--", 0x33},
|
---|
| 453 | { 2, -32768, "1111111111111111111111111111111111111111111111111000000000000000\0--", 0x33},
|
---|
| 454 | { 2, -32767, "1111111111111111111111111111111111111111111111111000000000000001\0--", 0x33},
|
---|
| 455 | { 2, -2, "1111111111111111111111111111111111111111111111111111111111111110\0--", 0x33},
|
---|
| 456 | { 2, -1, "1111111111111111111111111111111111111111111111111111111111111111\0--", 0x33},
|
---|
| 457 | { 2, 0, "0\0-----------------------------------------------------------------", 0x33},
|
---|
| 458 | { 2, 1, "1\0-----------------------------------------------------------------", 0x33},
|
---|
| 459 | { 2, 10, "1010\0--------------------------------------------------------------", 0x33},
|
---|
| 460 | { 2, 100, "1100100\0-----------------------------------------------------------", 0x33},
|
---|
| 461 | { 2, 1000, "1111101000\0--------------------------------------------------------", 0x33},
|
---|
| 462 | { 2, 10000, "10011100010000\0----------------------------------------------------", 0x33},
|
---|
| 463 | { 2, 32767, "111111111111111\0---------------------------------------------------", 0x33},
|
---|
| 464 | { 2, 32768, "1000000000000000\0--------------------------------------------------", 0x33},
|
---|
| 465 | { 2, 65535, "1111111111111111\0--------------------------------------------------", 0x33},
|
---|
| 466 | { 2, 100000, "11000011010100000\0-------------------------------------------------", 0x33},
|
---|
| 467 | { 2, 234567, "111001010001000111\0------------------------------------------------", 0x33},
|
---|
| 468 | { 2, 300000, "1001001001111100000\0-----------------------------------------------", 0x33},
|
---|
| 469 | { 2, 524287, "1111111111111111111\0-----------------------------------------------", 0x33},
|
---|
| 470 | { 2, 524288, "10000000000000000000\0----------------------------------------------", 0x33},
|
---|
| 471 | { 2, 1000000, "11110100001001000000\0----------------------------------------------", 0x33},
|
---|
| 472 | { 2, 10000000, "100110001001011010000000\0------------------------------------------", 0x33},
|
---|
| 473 | { 2, 100000000, "101111101011110000100000000\0---------------------------------------", 0x33},
|
---|
| 474 | { 2, 1000000000, "111011100110101100101000000000\0------------------------------------", 0x33},
|
---|
| 475 | { 2, 1073741823, "111111111111111111111111111111\0------------------------------------", 0x33},
|
---|
| 476 | { 2, 2147483646, "1111111111111111111111111111110\0-----------------------------------", 0x33},
|
---|
| 477 | { 2, 2147483647, "1111111111111111111111111111111\0-----------------------------------", 0x33},
|
---|
| 478 | { 2, 2147483648U, "10000000000000000000000000000000\0----------------------------------", 0x33},
|
---|
| 479 | { 2, 2147483649U, "10000000000000000000000000000001\0----------------------------------", 0x33},
|
---|
| 480 | { 2, 4294967294U, "11111111111111111111111111111110\0----------------------------------", 0x33},
|
---|
| 481 | { 2, 0xFFFFFFFF, "11111111111111111111111111111111\0----------------------------------", 0x33},
|
---|
| 482 | { 2, 0x1FFFFFFFF, "111111111111111111111111111111111\0---------------------------------", 0x33},
|
---|
| 483 | { 2, 10000000000, "1001010100000010111110010000000000\0--------------------------------", 0x33},
|
---|
| 484 | { 2, 0x3FFFFFFFF, "1111111111111111111111111111111111\0--------------------------------", 0x33},
|
---|
| 485 | { 2, 0x7FFFFFFFF, "11111111111111111111111111111111111\0-------------------------------", 0x33},
|
---|
| 486 | { 2, 0xFFFFFFFFF, "111111111111111111111111111111111111\0------------------------------", 0x33},
|
---|
| 487 | { 2, 100000000000, "1011101001000011101101110100000000000\0-----------------------------", 0x33},
|
---|
| 488 | { 2, 0x1FFFFFFFFF, "1111111111111111111111111111111111111\0-----------------------------", 0x33},
|
---|
| 489 | { 2, 0x3FFFFFFFFF, "11111111111111111111111111111111111111\0----------------------------", 0x33},
|
---|
| 490 | { 2, 0x7FFFFFFFFF, "111111111111111111111111111111111111111\0---------------------------", 0x33},
|
---|
| 491 | { 2, 0xFFFFFFFFFF, "1111111111111111111111111111111111111111\0--------------------------", 0x33},
|
---|
| 492 |
|
---|
| 493 | { 8, 0x80000000U, "20000000000\0-------------------------------------------------------", 0x33},
|
---|
| 494 | { 8, -2147483647, "1777777777760000000001\0--------------------------------------------", 0x33},
|
---|
| 495 | { 8, -2, "1777777777777777777776\0--------------------------------------------", 0x33},
|
---|
| 496 | { 8, -1, "1777777777777777777777\0--------------------------------------------", 0x33},
|
---|
| 497 | { 8, 0, "0\0-----------------------------------------------------------------", 0x33},
|
---|
| 498 | { 8, 1, "1\0-----------------------------------------------------------------", 0x33},
|
---|
| 499 | { 8, 2147483646, "17777777776\0-------------------------------------------------------", 0x33},
|
---|
| 500 | { 8, 2147483647, "17777777777\0-------------------------------------------------------", 0x33},
|
---|
| 501 | { 8, 2147483648U, "20000000000\0-------------------------------------------------------", 0x33},
|
---|
| 502 | { 8, 2147483649U, "20000000001\0-------------------------------------------------------", 0x33},
|
---|
| 503 | { 8, 4294967294U, "37777777776\0-------------------------------------------------------", 0x33},
|
---|
| 504 | { 8, 4294967295U, "37777777777\0-------------------------------------------------------", 0x33},
|
---|
| 505 |
|
---|
| 506 | {10, 0x80000000U, "2147483648\0--------------------------------------------------------", 0x33},
|
---|
| 507 | {10, -2147483647, "-2147483647\0-------------------------------------------------------", 0x55},
|
---|
| 508 | {10, -2147483647, "-18446744071562067969\0---------------------------------------------", 0x00},
|
---|
| 509 | {10, -2147483647, "18446744071562067969\0----------------------------------------------", 0x22},
|
---|
| 510 | {10, -2, "-2\0----------------------------------------------------------------", 0x55},
|
---|
| 511 | {10, -2, "-18446744073709551614\0---------------------------------------------", 0x00},
|
---|
| 512 | {10, -2, "18446744073709551614\0----------------------------------------------", 0x22},
|
---|
| 513 | {10, -1, "-1\0----------------------------------------------------------------", 0x55},
|
---|
| 514 | {10, -1, "-18446744073709551615\0---------------------------------------------", 0x00},
|
---|
| 515 | {10, -1, "18446744073709551615\0----------------------------------------------", 0x22},
|
---|
| 516 | {10, 0, "0\0-----------------------------------------------------------------", 0x33},
|
---|
| 517 | {10, 1, "1\0-----------------------------------------------------------------", 0x33},
|
---|
| 518 | {10, 12, "12\0----------------------------------------------------------------", 0x33},
|
---|
| 519 | {10, 123, "123\0---------------------------------------------------------------", 0x33},
|
---|
| 520 | {10, 1234, "1234\0--------------------------------------------------------------", 0x33},
|
---|
| 521 | {10, 12345, "12345\0-------------------------------------------------------------", 0x33},
|
---|
| 522 | {10, 123456, "123456\0------------------------------------------------------------", 0x33},
|
---|
| 523 | {10, 1234567, "1234567\0-----------------------------------------------------------", 0x33},
|
---|
| 524 | {10, 12345678, "12345678\0----------------------------------------------------------", 0x33},
|
---|
| 525 | {10, 123456789, "123456789\0---------------------------------------------------------", 0x33},
|
---|
| 526 | {10, 2147483646, "2147483646\0--------------------------------------------------------", 0x33},
|
---|
| 527 | {10, 2147483647, "2147483647\0--------------------------------------------------------", 0x33},
|
---|
| 528 | {10, 2147483648U, "2147483648\0--------------------------------------------------------", 0x33},
|
---|
| 529 | {10, 2147483649U, "2147483649\0--------------------------------------------------------", 0x33},
|
---|
| 530 | {10, 4294967294U, "4294967294\0--------------------------------------------------------", 0x33},
|
---|
| 531 | {10, 4294967295U, "4294967295\0--------------------------------------------------------", 0x33},
|
---|
| 532 | {10, 12345678901U, "12345678901\0-------------------------------------------------------", 0x33},
|
---|
| 533 | {10, 987654321012U, "987654321012\0------------------------------------------------------", 0x33},
|
---|
| 534 | {10, 1928374656574U, "1928374656574\0-----------------------------------------------------", 0x33},
|
---|
| 535 | {10, 0xBADCAFEFACE, "12841062955726\0----------------------------------------------------", 0x33},
|
---|
| 536 | {10, 0x5BADCAFEFACE, "100801993177806\0---------------------------------------------------", 0x33},
|
---|
| 537 | {10, 0xAFACEBEEFCAFE, "3090515640699646\0--------------------------------------------------", 0x33},
|
---|
| 538 | {10, 0xA5BEEFABCDCAFE, "46653307746110206\0-------------------------------------------------", 0x33},
|
---|
| 539 | {10, 0x1F8CF9BF2DF3AF1, "142091656963767025\0------------------------------------------------", 0x33},
|
---|
| 540 | {10, 0xFFFFFFFFFFFFFFF, "1152921504606846975\0-----------------------------------------------", 0x33},
|
---|
| 541 | {10, 0x7FFFFFFFFFFFFFFF, "9223372036854775807\0-----------------------------------------------", 0x33},
|
---|
| 542 | {10, 0x8000000000000000, "-9223372036854775808\0----------------------------------------------", 0x11},
|
---|
| 543 | {10, 0x8000000000000000, "9223372036854775808\0-----------------------------------------------", 0x22},
|
---|
| 544 | {10, 0x8000000000000001, "-9223372036854775807\0----------------------------------------------", 0x55},
|
---|
| 545 | {10, 0x8000000000000001, "-9223372036854775809\0----------------------------------------------", 0x00},
|
---|
| 546 | {10, 0x8000000000000001, "9223372036854775809\0-----------------------------------------------", 0x22},
|
---|
| 547 | {10, 0x8000000000000002, "-9223372036854775806\0----------------------------------------------", 0x55},
|
---|
| 548 | {10, 0x8000000000000002, "-9223372036854775810\0----------------------------------------------", 0x00},
|
---|
| 549 | {10, 0x8000000000000002, "9223372036854775810\0-----------------------------------------------", 0x22},
|
---|
| 550 | {10, 0xFFFFFFFFFFFFFFFE, "-2\0----------------------------------------------------------------", 0x55},
|
---|
| 551 | {10, 0xFFFFFFFFFFFFFFFE, "-18446744073709551614\0---------------------------------------------", 0x00},
|
---|
| 552 | {10, 0xFFFFFFFFFFFFFFFE, "18446744073709551614\0----------------------------------------------", 0x22},
|
---|
| 553 | {10, 0xFFFFFFFFFFFFFFFF, "-1\0----------------------------------------------------------------", 0x55},
|
---|
| 554 | {10, 0xFFFFFFFFFFFFFFFF, "-18446744073709551615\0---------------------------------------------", 0x00},
|
---|
| 555 | {10, 0xFFFFFFFFFFFFFFFF, "18446744073709551615\0----------------------------------------------", 0x22},
|
---|
| 556 |
|
---|
| 557 | {16, 0, "0\0-----------------------------------------------------------------", 0x33},
|
---|
| 558 | {16, 1, "1\0-----------------------------------------------------------------", 0x33},
|
---|
| 559 | {16, 2147483646, "7ffffffe\0----------------------------------------------------------", 0x33},
|
---|
| 560 | {16, 2147483647, "7fffffff\0----------------------------------------------------------", 0x33},
|
---|
| 561 | {16, 0x80000000, "80000000\0----------------------------------------------------------", 0x33},
|
---|
| 562 | {16, 0x80000001, "80000001\0----------------------------------------------------------", 0x33},
|
---|
| 563 | {16, 0xFFFFFFFE, "fffffffe\0----------------------------------------------------------", 0x33},
|
---|
| 564 | {16, 0xFFFFFFFF, "ffffffff\0----------------------------------------------------------", 0x33},
|
---|
| 565 | {16, 0x100000000, "100000000\0---------------------------------------------------------", 0x33},
|
---|
| 566 | {16, 0xBADDEADBEEF, "baddeadbeef\0-------------------------------------------------------", 0x33},
|
---|
| 567 | {16, 0x8000000000000000, "8000000000000000\0--------------------------------------------------", 0x33},
|
---|
| 568 | {16, 0xFEDCBA9876543210, "fedcba9876543210\0--------------------------------------------------", 0x33},
|
---|
| 569 | {16, 0xFFFFFFFF80000001, "ffffffff80000001\0--------------------------------------------------", 0x33},
|
---|
| 570 | {16, 0xFFFFFFFFFFFFFFFE, "fffffffffffffffe\0--------------------------------------------------", 0x33},
|
---|
| 571 | {16, 0xFFFFFFFFFFFFFFFF, "ffffffffffffffff\0--------------------------------------------------", 0x33},
|
---|
| 572 |
|
---|
| 573 | { 2, 32768, "1000000000000000\0--------------------------------------------------", 0x33},
|
---|
| 574 | { 2, 65536, "10000000000000000\0-------------------------------------------------", 0x33},
|
---|
| 575 | { 2, 131072, "100000000000000000\0------------------------------------------------", 0x33},
|
---|
| 576 | {16, 0xffffffff, "ffffffff\0----------------------------------------------------------", 0x33},
|
---|
| 577 | {16, 0xa, "a\0-----------------------------------------------------------------", 0x33},
|
---|
| 578 | {16, 0, "0\0-----------------------------------------------------------------", 0x33},
|
---|
| 579 | {20, 3368421, "111111\0------------------------------------------------------------", 0x33},
|
---|
| 580 | {36, 62193781, "111111\0------------------------------------------------------------", 0x33},
|
---|
| 581 | {37, 71270178, "111111\0------------------------------------------------------------", 0x33},
|
---|
| 582 | {99, 9606940300, "111111\0------------------------------------------------------------", 0x33},
|
---|
| 583 | };
|
---|
| 584 | #define NB_ULONGLONG2STR (sizeof(ulonglong2str)/sizeof(*ulonglong2str))
|
---|
| 585 |
|
---|
| 586 |
|
---|
| 587 | static void one_i64toa_test(int test_num, const ulonglong2str_t *ulonglong2str)
|
---|
| 588 | {
|
---|
| 589 | LPSTR result;
|
---|
| 590 | char dest_str[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 591 |
|
---|
| 592 | memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH);
|
---|
| 593 | dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 594 | result = p_i64toa(ulonglong2str->value, dest_str, ulonglong2str->base);
|
---|
| 595 | ok(result == dest_str,
|
---|
| 596 | "(test %d): _i64toa(%Lu, [out], %d) has result %p, expected: %p",
|
---|
| 597 | test_num, ulonglong2str->value, ulonglong2str->base, result, dest_str);
|
---|
| 598 | if (ulonglong2str->mask & 0x04) {
|
---|
| 599 | if (memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) != 0) {
|
---|
| 600 | if (memcmp(dest_str, ulonglong2str[1].Buffer, LARGE_STRI_BUFFER_LENGTH) != 0) {
|
---|
| 601 | ok(memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0,
|
---|
| 602 | "(test %d): _i64toa(%Lu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 603 | test_num, ulonglong2str->value, ulonglong2str->base, dest_str, ulonglong2str->Buffer);
|
---|
| 604 | } /* if */
|
---|
| 605 | } /* if */
|
---|
| 606 | } else {
|
---|
| 607 | ok(memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0,
|
---|
| 608 | "(test %d): _i64toa(%Lu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 609 | test_num, ulonglong2str->value, ulonglong2str->base, dest_str, ulonglong2str->Buffer);
|
---|
| 610 | } /* if */
|
---|
| 611 | }
|
---|
| 612 |
|
---|
| 613 |
|
---|
| 614 | static void one_ui64toa_test(int test_num, const ulonglong2str_t *ulonglong2str)
|
---|
| 615 | {
|
---|
| 616 | LPSTR result;
|
---|
| 617 | char dest_str[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 618 |
|
---|
| 619 | memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH);
|
---|
| 620 | dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 621 | result = p_ui64toa(ulonglong2str->value, dest_str, ulonglong2str->base);
|
---|
| 622 | ok(result == dest_str,
|
---|
| 623 | "(test %d): _ui64toa(%Lu, [out], %d) has result %p, expected: %p",
|
---|
| 624 | test_num, ulonglong2str->value, ulonglong2str->base, result, dest_str);
|
---|
| 625 | ok(memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0,
|
---|
| 626 | "(test %d): _ui64toa(%Lu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 627 | test_num, ulonglong2str->value, ulonglong2str->base, dest_str, ulonglong2str->Buffer);
|
---|
| 628 | }
|
---|
| 629 |
|
---|
| 630 |
|
---|
| 631 | static void test_ulonglongtoa(void)
|
---|
| 632 | {
|
---|
| 633 | int test_num;
|
---|
| 634 |
|
---|
| 635 | for (test_num = 0; test_num < NB_ULONGLONG2STR; test_num++) {
|
---|
| 636 | if (ulonglong2str[test_num].mask & 0x01) {
|
---|
| 637 | one_i64toa_test(test_num, &ulonglong2str[test_num]);
|
---|
| 638 | } /* if */
|
---|
| 639 | if (p_ui64toa != NULL) {
|
---|
| 640 | if (ulonglong2str[test_num].mask & 0x02) {
|
---|
| 641 | one_ui64toa_test(test_num, &ulonglong2str[test_num]);
|
---|
| 642 | } /* if */
|
---|
| 643 | } /* if */
|
---|
| 644 | } /* for */
|
---|
| 645 | }
|
---|
| 646 |
|
---|
| 647 |
|
---|
| 648 | static void one_i64tow_test(int test_num, const ulonglong2str_t *ulonglong2str)
|
---|
| 649 | {
|
---|
| 650 | int pos;
|
---|
| 651 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 652 | WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 653 | UNICODE_STRING unicode_string;
|
---|
| 654 | STRING ansi_str;
|
---|
| 655 | LPWSTR result;
|
---|
| 656 |
|
---|
| 657 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 658 | expected_wstr[pos] = ulonglong2str->Buffer[pos];
|
---|
| 659 | } /* for */
|
---|
| 660 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 661 |
|
---|
| 662 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 663 | dest_wstr[pos] = '-';
|
---|
| 664 | } /* for */
|
---|
| 665 | dest_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 666 | unicode_string.Length = LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR);
|
---|
| 667 | unicode_string.MaximumLength = unicode_string.Length + sizeof(WCHAR);
|
---|
| 668 | unicode_string.Buffer = dest_wstr;
|
---|
| 669 |
|
---|
| 670 | result = p_i64tow(ulonglong2str->value, dest_wstr, ulonglong2str->base);
|
---|
| 671 | pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1);
|
---|
| 672 | ok(result == dest_wstr,
|
---|
| 673 | "(test %d): _i64tow(%llu, [out], %d) has result %p, expected: %p",
|
---|
| 674 | test_num, ulonglong2str->value, ulonglong2str->base, result, dest_wstr);
|
---|
| 675 | if (ulonglong2str->mask & 0x04) {
|
---|
| 676 | if (memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) != 0) {
|
---|
| 677 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 678 | expected_wstr[pos] = ulonglong2str[1].Buffer[pos];
|
---|
| 679 | } /* for */
|
---|
| 680 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 681 | if (memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) != 0) {
|
---|
| 682 | ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0,
|
---|
| 683 | "(test %d): _i64tow(%llu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 684 | test_num, ulonglong2str->value, ulonglong2str->base, ansi_str.Buffer, ulonglong2str->Buffer);
|
---|
| 685 | } /* if */
|
---|
| 686 | } /* if */
|
---|
| 687 | } else {
|
---|
| 688 | ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0,
|
---|
| 689 | "(test %d): _i64tow(%llu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 690 | test_num, ulonglong2str->value, ulonglong2str->base, ansi_str.Buffer, ulonglong2str->Buffer);
|
---|
| 691 | } /* if */
|
---|
| 692 | pRtlFreeAnsiString(&ansi_str);
|
---|
| 693 | }
|
---|
| 694 |
|
---|
| 695 |
|
---|
| 696 | static void one_ui64tow_test(int test_num, const ulonglong2str_t *ulonglong2str)
|
---|
| 697 | {
|
---|
| 698 | int pos;
|
---|
| 699 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 700 | WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 701 | UNICODE_STRING unicode_string;
|
---|
| 702 | STRING ansi_str;
|
---|
| 703 | LPWSTR result;
|
---|
| 704 |
|
---|
| 705 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 706 | expected_wstr[pos] = ulonglong2str->Buffer[pos];
|
---|
| 707 | } /* for */
|
---|
| 708 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 709 |
|
---|
| 710 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 711 | dest_wstr[pos] = '-';
|
---|
| 712 | } /* for */
|
---|
| 713 | dest_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 714 | unicode_string.Length = LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR);
|
---|
| 715 | unicode_string.MaximumLength = unicode_string.Length + sizeof(WCHAR);
|
---|
| 716 | unicode_string.Buffer = dest_wstr;
|
---|
| 717 |
|
---|
| 718 | result = p_ui64tow(ulonglong2str->value, dest_wstr, ulonglong2str->base);
|
---|
| 719 | pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1);
|
---|
| 720 | ok(result == dest_wstr,
|
---|
| 721 | "(test %d): _ui64tow(%llu, [out], %d) has result %p, expected: %p",
|
---|
| 722 | test_num, ulonglong2str->value, ulonglong2str->base, result, dest_wstr);
|
---|
| 723 | ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0,
|
---|
| 724 | "(test %d): _ui64tow(%llu, [out], %d) assigns string \"%s\", expected: \"%s\"",
|
---|
| 725 | test_num, ulonglong2str->value, ulonglong2str->base, ansi_str.Buffer, ulonglong2str->Buffer);
|
---|
| 726 | pRtlFreeAnsiString(&ansi_str);
|
---|
| 727 | }
|
---|
| 728 |
|
---|
| 729 |
|
---|
| 730 | static void test_ulonglongtow(void)
|
---|
| 731 | {
|
---|
| 732 | int test_num;
|
---|
| 733 | int pos;
|
---|
| 734 | WCHAR expected_wstr[LARGE_STRI_BUFFER_LENGTH + 1];
|
---|
| 735 | LPWSTR result;
|
---|
| 736 |
|
---|
| 737 | for (test_num = 0; test_num < NB_ULONGLONG2STR; test_num++) {
|
---|
| 738 | if (ulonglong2str[test_num].mask & 0x10) {
|
---|
| 739 | one_i64tow_test(test_num, &ulonglong2str[test_num]);
|
---|
| 740 | } /* if */
|
---|
| 741 | if (p_ui64tow) {
|
---|
| 742 | if (ulonglong2str[test_num].mask & 0x20) {
|
---|
| 743 | one_ui64tow_test(test_num, &ulonglong2str[test_num]);
|
---|
| 744 | } /* if */
|
---|
| 745 | } /* if */
|
---|
| 746 | } /* for */
|
---|
| 747 |
|
---|
| 748 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 749 | expected_wstr[pos] = ulong2str[0].Buffer[pos];
|
---|
| 750 | } /* for */
|
---|
| 751 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 752 | result = p_i64tow(ulong2str[0].value, NULL, 10);
|
---|
| 753 | ok(result == NULL,
|
---|
| 754 | "(test d): _i64tow(%llu, NULL, 10) has result %p, expected: NULL",
|
---|
| 755 | ulonglong2str[0].value, result);
|
---|
| 756 |
|
---|
| 757 | if (p_ui64tow) {
|
---|
| 758 | for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) {
|
---|
| 759 | expected_wstr[pos] = ulong2str[0].Buffer[pos];
|
---|
| 760 | } /* for */
|
---|
| 761 | expected_wstr[LARGE_STRI_BUFFER_LENGTH] = '\0';
|
---|
| 762 | result = p_ui64tow(ulong2str[0].value, NULL, 10);
|
---|
| 763 | ok(result == NULL,
|
---|
| 764 | "(test e): _ui64tow(%llu, NULL, 10) has result %p, expected: NULL",
|
---|
| 765 | ulonglong2str[0].value, result);
|
---|
| 766 | } /* if */
|
---|
| 767 | }
|
---|
| 768 |
|
---|
| 769 |
|
---|
| 770 | typedef struct {
|
---|
| 771 | char *str;
|
---|
| 772 | LONG value;
|
---|
| 773 | } str2long_t;
|
---|
| 774 |
|
---|
| 775 | static const str2long_t str2long[] = {
|
---|
| 776 | { "1011101100", 1011101100 },
|
---|
| 777 | { "1234567", 1234567 },
|
---|
| 778 | { "-214", -214 },
|
---|
| 779 | { "+214", 214 }, /* The + sign is allowed also */
|
---|
| 780 | { "--214", 0 }, /* Do not accept more than one sign */
|
---|
| 781 | { "-+214", 0 },
|
---|
| 782 | { "++214", 0 },
|
---|
| 783 | { "+-214", 0 },
|
---|
| 784 | { "\00141", 0 }, /* not whitespace char 1 */
|
---|
| 785 | { "\00242", 0 }, /* not whitespace char 2 */
|
---|
| 786 | { "\00343", 0 }, /* not whitespace char 3 */
|
---|
| 787 | { "\00444", 0 }, /* not whitespace char 4 */
|
---|
| 788 | { "\00545", 0 }, /* not whitespace char 5 */
|
---|
| 789 | { "\00646", 0 }, /* not whitespace char 6 */
|
---|
| 790 | { "\00747", 0 }, /* not whitespace char 7 */
|
---|
| 791 | { "\01050", 0 }, /* not whitespace char 8 */
|
---|
| 792 | { "\01151", 51 }, /* is whitespace char 9 (tab) */
|
---|
| 793 | { "\01252", 52 }, /* is whitespace char 10 (lf) */
|
---|
| 794 | { "\01353", 53 }, /* is whitespace char 11 (vt) */
|
---|
| 795 | { "\01454", 54 }, /* is whitespace char 12 (ff) */
|
---|
| 796 | { "\01555", 55 }, /* is whitespace char 13 (cr) */
|
---|
| 797 | { "\01656", 0 }, /* not whitespace char 14 */
|
---|
| 798 | { "\01757", 0 }, /* not whitespace char 15 */
|
---|
| 799 | { "\02060", 0 }, /* not whitespace char 16 */
|
---|
| 800 | { "\02161", 0 }, /* not whitespace char 17 */
|
---|
| 801 | { "\02262", 0 }, /* not whitespace char 18 */
|
---|
| 802 | { "\02363", 0 }, /* not whitespace char 19 */
|
---|
| 803 | { "\02464", 0 }, /* not whitespace char 20 */
|
---|
| 804 | { "\02565", 0 }, /* not whitespace char 21 */
|
---|
| 805 | { "\02666", 0 }, /* not whitespace char 22 */
|
---|
| 806 | { "\02767", 0 }, /* not whitespace char 23 */
|
---|
| 807 | { "\03070", 0 }, /* not whitespace char 24 */
|
---|
| 808 | { "\03171", 0 }, /* not whitespace char 25 */
|
---|
| 809 | { "\03272", 0 }, /* not whitespace char 26 */
|
---|
| 810 | { "\03373", 0 }, /* not whitespace char 27 */
|
---|
| 811 | { "\03474", 0 }, /* not whitespace char 28 */
|
---|
| 812 | { "\03575", 0 }, /* not whitespace char 29 */
|
---|
| 813 | { "\03676", 0 }, /* not whitespace char 30 */
|
---|
| 814 | { "\03777", 0 }, /* not whitespace char 31 */
|
---|
| 815 | { "\04080", 80 }, /* is whitespace char 32 (space) */
|
---|
| 816 | { " \n \r \t214", 214 },
|
---|
| 817 | { " \n \r \t+214", 214 }, /* Signs can be used after whitespace */
|
---|
| 818 | { " \n \r \t-214", -214 },
|
---|
| 819 | { "+214 0", 214 }, /* Space terminates the number */
|
---|
| 820 | { " 214.01", 214 }, /* Decimal point not accepted */
|
---|
| 821 | { " 214,01", 214 }, /* Decimal comma not accepted */
|
---|
| 822 | { "f81", 0 },
|
---|
| 823 | { "0x12345", 0 }, /* Hex not accepted */
|
---|
| 824 | { "00x12345", 0 },
|
---|
| 825 | { "0xx12345", 0 },
|
---|
| 826 | { "1x34", 1 },
|
---|
| 827 | { "-9999999999", -1410065407 }, /* Big negative integer */
|
---|
| 828 | { "-2147483649", 2147483647 }, /* Too small to fit in 32 Bits */
|
---|
| 829 | { "-2147483648", 0x80000000 }, /* Smallest negative integer */
|
---|
| 830 | { "-2147483647", -2147483647 },
|
---|
| 831 | { "-1", -1 },
|
---|
| 832 | { "0", 0 },
|
---|
| 833 | { "1", 1 },
|
---|
| 834 | { "2147483646", 2147483646 },
|
---|
| 835 | { "2147483647", 2147483647 }, /* Largest signed positive integer */
|
---|
| 836 | { "2147483648", 2147483648UL }, /* Positive int equal to smallest negative int */
|
---|
| 837 | { "2147483649", 2147483649UL },
|
---|
| 838 | { "4294967294", 4294967294UL },
|
---|
| 839 | { "4294967295", 4294967295UL }, /* Largest unsigned integer */
|
---|
| 840 | { "4294967296", 0 }, /* Too big to fit in 32 Bits */
|
---|
| 841 | { "9999999999", 1410065407 }, /* Big positive integer */
|
---|
| 842 | { "056789", 56789 }, /* Leading zero and still decimal */
|
---|
| 843 | { "b1011101100", 0 }, /* Binary (b-notation) */
|
---|
| 844 | { "-b1011101100", 0 }, /* Negative Binary (b-notation) */
|
---|
| 845 | { "b10123456789", 0 }, /* Binary with nonbinary digits (2-9) */
|
---|
| 846 | { "0b1011101100", 0 }, /* Binary (0b-notation) */
|
---|
| 847 | { "-0b1011101100", 0 }, /* Negative binary (0b-notation) */
|
---|
| 848 | { "0b10123456789", 0 }, /* Binary with nonbinary digits (2-9) */
|
---|
| 849 | { "-0b10123456789", 0 }, /* Negative binary with nonbinary digits (2-9) */
|
---|
| 850 | { "0b1", 0 }, /* one digit binary */
|
---|
| 851 | { "0b2", 0 }, /* empty binary */
|
---|
| 852 | { "0b", 0 }, /* empty binary */
|
---|
| 853 | { "o1234567", 0 }, /* Octal (o-notation) */
|
---|
| 854 | { "-o1234567", 0 }, /* Negative Octal (o-notation) */
|
---|
| 855 | { "o56789", 0 }, /* Octal with nonoctal digits (8 and 9) */
|
---|
| 856 | { "0o1234567", 0 }, /* Octal (0o-notation) */
|
---|
| 857 | { "-0o1234567", 0 }, /* Negative octal (0o-notation) */
|
---|
| 858 | { "0o56789", 0 }, /* Octal with nonoctal digits (8 and 9) */
|
---|
| 859 | { "-0o56789", 0 }, /* Negative octal with nonoctal digits (8 and 9) */
|
---|
| 860 | { "0o7", 0 }, /* one digit octal */
|
---|
| 861 | { "0o8", 0 }, /* empty octal */
|
---|
| 862 | { "0o", 0 }, /* empty octal */
|
---|
| 863 | { "0d1011101100", 0 }, /* explizit decimal with 0d */
|
---|
| 864 | { "x89abcdef", 0 }, /* Hex with lower case digits a-f (x-notation) */
|
---|
| 865 | { "xFEDCBA00", 0 }, /* Hex with upper case digits A-F (x-notation) */
|
---|
| 866 | { "-xFEDCBA00", 0 }, /* Negative Hexadecimal (x-notation) */
|
---|
| 867 | { "0x89abcdef", 0 }, /* Hex with lower case digits a-f (0x-notation) */
|
---|
| 868 | { "0xFEDCBA00", 0 }, /* Hex with upper case digits A-F (0x-notation) */
|
---|
| 869 | { "-0xFEDCBA00", 0 }, /* Negative Hexadecimal (0x-notation) */
|
---|
| 870 | { "0xabcdefgh", 0 }, /* Hex with illegal lower case digits (g-z) */
|
---|
| 871 | { "0xABCDEFGH", 0 }, /* Hex with illegal upper case digits (G-Z) */
|
---|
| 872 | { "0xF", 0 }, /* one digit hexadecimal */
|
---|
| 873 | { "0xG", 0 }, /* empty hexadecimal */
|
---|
| 874 | { "0x", 0 }, /* empty hexadecimal */
|
---|
| 875 | { "", 0 }, /* empty string */
|
---|
| 876 | /* { NULL, 0 }, */ /* NULL as string */
|
---|
| 877 | };
|
---|
| 878 | #define NB_STR2LONG (sizeof(str2long)/sizeof(*str2long))
|
---|
| 879 |
|
---|
| 880 |
|
---|
| 881 | static void test_wtoi(void)
|
---|
| 882 | {
|
---|
| 883 | int test_num;
|
---|
| 884 | UNICODE_STRING uni;
|
---|
| 885 | int result;
|
---|
| 886 |
|
---|
| 887 | for (test_num = 0; test_num < NB_STR2LONG; test_num++) {
|
---|
| 888 | pRtlCreateUnicodeStringFromAsciiz(&uni, str2long[test_num].str);
|
---|
| 889 | result = p_wtoi(uni.Buffer);
|
---|
| 890 | ok(result == str2long[test_num].value,
|
---|
| 891 | "(test %d): call failed: _wtoi(\"%s\") has result %d, expected: %ld",
|
---|
| 892 | test_num, str2long[test_num].str, result, str2long[test_num].value);
|
---|
| 893 | pRtlFreeUnicodeString(&uni);
|
---|
| 894 | } /* for */
|
---|
| 895 | }
|
---|
| 896 |
|
---|
| 897 |
|
---|
| 898 | static void test_wtol(void)
|
---|
| 899 | {
|
---|
| 900 | int test_num;
|
---|
| 901 | UNICODE_STRING uni;
|
---|
| 902 | LONG result;
|
---|
| 903 |
|
---|
| 904 | for (test_num = 0; test_num < NB_STR2LONG; test_num++) {
|
---|
| 905 | pRtlCreateUnicodeStringFromAsciiz(&uni, str2long[test_num].str);
|
---|
| 906 | result = p_wtol(uni.Buffer);
|
---|
| 907 | ok(result == str2long[test_num].value,
|
---|
| 908 | "(test %d): call failed: _wtol(\"%s\") has result %ld, expected: %ld",
|
---|
| 909 | test_num, str2long[test_num].str, result, str2long[test_num].value);
|
---|
| 910 | pRtlFreeUnicodeString(&uni);
|
---|
| 911 | } /* for */
|
---|
| 912 | }
|
---|
| 913 |
|
---|
| 914 |
|
---|
| 915 | typedef struct {
|
---|
| 916 | char *str;
|
---|
| 917 | LONGLONG value;
|
---|
| 918 | } str2longlong_t;
|
---|
| 919 |
|
---|
| 920 | static const str2longlong_t str2longlong[] = {
|
---|
| 921 | { "1011101100", 1011101100 },
|
---|
| 922 | { "1234567", 1234567 },
|
---|
| 923 | { "-214", -214 },
|
---|
| 924 | { "+214", 214 }, /* The + sign is allowed also */
|
---|
| 925 | { "--214", 0 }, /* Do not accept more than one sign */
|
---|
| 926 | { "-+214", 0 },
|
---|
| 927 | { "++214", 0 },
|
---|
| 928 | { "+-214", 0 },
|
---|
| 929 | { "\00141", 0 }, /* not whitespace char 1 */
|
---|
| 930 | { "\00242", 0 }, /* not whitespace char 2 */
|
---|
| 931 | { "\00343", 0 }, /* not whitespace char 3 */
|
---|
| 932 | { "\00444", 0 }, /* not whitespace char 4 */
|
---|
| 933 | { "\00545", 0 }, /* not whitespace char 5 */
|
---|
| 934 | { "\00646", 0 }, /* not whitespace char 6 */
|
---|
| 935 | { "\00747", 0 }, /* not whitespace char 7 */
|
---|
| 936 | { "\01050", 0 }, /* not whitespace char 8 */
|
---|
| 937 | { "\01151", 51 }, /* is whitespace char 9 (tab) */
|
---|
| 938 | { "\01252", 52 }, /* is whitespace char 10 (lf) */
|
---|
| 939 | { "\01353", 53 }, /* is whitespace char 11 (vt) */
|
---|
| 940 | { "\01454", 54 }, /* is whitespace char 12 (ff) */
|
---|
| 941 | { "\01555", 55 }, /* is whitespace char 13 (cr) */
|
---|
| 942 | { "\01656", 0 }, /* not whitespace char 14 */
|
---|
| 943 | { "\01757", 0 }, /* not whitespace char 15 */
|
---|
| 944 | { "\02060", 0 }, /* not whitespace char 16 */
|
---|
| 945 | { "\02161", 0 }, /* not whitespace char 17 */
|
---|
| 946 | { "\02262", 0 }, /* not whitespace char 18 */
|
---|
| 947 | { "\02363", 0 }, /* not whitespace char 19 */
|
---|
| 948 | { "\02464", 0 }, /* not whitespace char 20 */
|
---|
| 949 | { "\02565", 0 }, /* not whitespace char 21 */
|
---|
| 950 | { "\02666", 0 }, /* not whitespace char 22 */
|
---|
| 951 | { "\02767", 0 }, /* not whitespace char 23 */
|
---|
| 952 | { "\03070", 0 }, /* not whitespace char 24 */
|
---|
| 953 | { "\03171", 0 }, /* not whitespace char 25 */
|
---|
| 954 | { "\03272", 0 }, /* not whitespace char 26 */
|
---|
| 955 | { "\03373", 0 }, /* not whitespace char 27 */
|
---|
| 956 | { "\03474", 0 }, /* not whitespace char 28 */
|
---|
| 957 | { "\03575", 0 }, /* not whitespace char 29 */
|
---|
| 958 | { "\03676", 0 }, /* not whitespace char 30 */
|
---|
| 959 | { "\03777", 0 }, /* not whitespace char 31 */
|
---|
| 960 | { "\04080", 80 }, /* is whitespace char 32 (space) */
|
---|
| 961 | { " \n \r \t214", 214 },
|
---|
| 962 | { " \n \r \t+214", 214 }, /* Signs can be used after whitespace */
|
---|
| 963 | { " \n \r \t-214", -214 },
|
---|
| 964 | { "+214 0", 214 }, /* Space terminates the number */
|
---|
| 965 | { " 214.01", 214 }, /* Decimal point not accepted */
|
---|
| 966 | { " 214,01", 214 }, /* Decimal comma not accepted */
|
---|
| 967 | { "f81", 0 },
|
---|
| 968 | { "0x12345", 0 }, /* Hex not accepted */
|
---|
| 969 | { "00x12345", 0 },
|
---|
| 970 | { "0xx12345", 0 },
|
---|
| 971 | { "1x34", 1 },
|
---|
| 972 | { "-99999999999999999999", -7766279631452241919 }, /* Big negative integer */
|
---|
| 973 | { "-9223372036854775809", 9223372036854775807 }, /* Too small to fit in 64 bits */
|
---|
| 974 | { "-9223372036854775808", 0x8000000000000000 }, /* Smallest negativ 64 bit integer */
|
---|
| 975 | { "-9223372036854775807", -9223372036854775807 },
|
---|
| 976 | { "-9999999999", -9999999999 },
|
---|
| 977 | { "-2147483649", -2147483649LL }, /* Too small to fit in 32 bits */
|
---|
| 978 | { "-2147483648", -2147483648LL }, /* Smallest 32 bits negative integer */
|
---|
| 979 | { "-2147483647", -2147483647 },
|
---|
| 980 | { "-1", -1 },
|
---|
| 981 | { "0", 0 },
|
---|
| 982 | { "1", 1 },
|
---|
| 983 | { "2147483646", 2147483646 },
|
---|
| 984 | { "2147483647", 2147483647 }, /* Largest signed positive 32 bit integer */
|
---|
| 985 | { "2147483648", 2147483648LL }, /* Pos int equal to smallest neg 32 bit int */
|
---|
| 986 | { "2147483649", 2147483649LL },
|
---|
| 987 | { "4294967294", 4294967294LL },
|
---|
| 988 | { "4294967295", 4294967295LL }, /* Largest unsigned 32 bit integer */
|
---|
| 989 | { "4294967296", 4294967296 }, /* Too big to fit in 32 Bits */
|
---|
| 990 | { "9999999999", 9999999999 },
|
---|
| 991 | { "9223372036854775806", 9223372036854775806 },
|
---|
| 992 | { "9223372036854775807", 9223372036854775807 }, /* Largest signed positive 64 bit integer */
|
---|
| 993 | { "9223372036854775808", 9223372036854775808ULL}, /* Pos int equal to smallest neg 64 bit int */
|
---|
| 994 | { "9223372036854775809", 9223372036854775809ULL},
|
---|
| 995 | { "18446744073709551614", 18446744073709551614ULL},
|
---|
| 996 | { "18446744073709551615", 18446744073709551615ULL}, /* Largest unsigned 64 bit integer */
|
---|
| 997 | { "18446744073709551616", 0 }, /* Too big to fit in 64 bits */
|
---|
| 998 | { "99999999999999999999", 7766279631452241919 }, /* Big positive integer */
|
---|
| 999 | { "056789", 56789 }, /* Leading zero and still decimal */
|
---|
| 1000 | { "b1011101100", 0 }, /* Binary (b-notation) */
|
---|
| 1001 | { "-b1011101100", 0 }, /* Negative Binary (b-notation) */
|
---|
| 1002 | { "b10123456789", 0 }, /* Binary with nonbinary digits (2-9) */
|
---|
| 1003 | { "0b1011101100", 0 }, /* Binary (0b-notation) */
|
---|
| 1004 | { "-0b1011101100", 0 }, /* Negative binary (0b-notation) */
|
---|
| 1005 | { "0b10123456789", 0 }, /* Binary with nonbinary digits (2-9) */
|
---|
| 1006 | { "-0b10123456789", 0 }, /* Negative binary with nonbinary digits (2-9) */
|
---|
| 1007 | { "0b1", 0 }, /* one digit binary */
|
---|
| 1008 | { "0b2", 0 }, /* empty binary */
|
---|
| 1009 | { "0b", 0 }, /* empty binary */
|
---|
| 1010 | { "o1234567", 0 }, /* Octal (o-notation) */
|
---|
| 1011 | { "-o1234567", 0 }, /* Negative Octal (o-notation) */
|
---|
| 1012 | { "o56789", 0 }, /* Octal with nonoctal digits (8 and 9) */
|
---|
| 1013 | { "0o1234567", 0 }, /* Octal (0o-notation) */
|
---|
| 1014 | { "-0o1234567", 0 }, /* Negative octal (0o-notation) */
|
---|
| 1015 | { "0o56789", 0 }, /* Octal with nonoctal digits (8 and 9) */
|
---|
| 1016 | { "-0o56789", 0 }, /* Negative octal with nonoctal digits (8 and 9) */
|
---|
| 1017 | { "0o7", 0 }, /* one digit octal */
|
---|
| 1018 | { "0o8", 0 }, /* empty octal */
|
---|
| 1019 | { "0o", 0 }, /* empty octal */
|
---|
| 1020 | { "0d1011101100", 0 }, /* explizit decimal with 0d */
|
---|
| 1021 | { "x89abcdef", 0 }, /* Hex with lower case digits a-f (x-notation) */
|
---|
| 1022 | { "xFEDCBA00", 0 }, /* Hex with upper case digits A-F (x-notation) */
|
---|
| 1023 | { "-xFEDCBA00", 0 }, /* Negative Hexadecimal (x-notation) */
|
---|
| 1024 | { "0x89abcdef", 0 }, /* Hex with lower case digits a-f (0x-notation) */
|
---|
| 1025 | { "0xFEDCBA00", 0 }, /* Hex with upper case digits A-F (0x-notation) */
|
---|
| 1026 | { "-0xFEDCBA00", 0 }, /* Negative Hexadecimal (0x-notation) */
|
---|
| 1027 | { "0xabcdefgh", 0 }, /* Hex with illegal lower case digits (g-z) */
|
---|
| 1028 | { "0xABCDEFGH", 0 }, /* Hex with illegal upper case digits (G-Z) */
|
---|
| 1029 | { "0xF", 0 }, /* one digit hexadecimal */
|
---|
| 1030 | { "0xG", 0 }, /* empty hexadecimal */
|
---|
| 1031 | { "0x", 0 }, /* empty hexadecimal */
|
---|
| 1032 | { "", 0 }, /* empty string */
|
---|
| 1033 | /* { NULL, 0 }, */ /* NULL as string */
|
---|
| 1034 | };
|
---|
| 1035 | #define NB_STR2LONGLONG (sizeof(str2longlong)/sizeof(*str2longlong))
|
---|
| 1036 |
|
---|
| 1037 |
|
---|
| 1038 | static void test_atoi64(void)
|
---|
| 1039 | {
|
---|
| 1040 | int test_num;
|
---|
| 1041 | LONGLONG result;
|
---|
| 1042 |
|
---|
| 1043 | for (test_num = 0; test_num < NB_STR2LONGLONG; test_num++) {
|
---|
| 1044 | result = p_atoi64(str2longlong[test_num].str);
|
---|
| 1045 | ok(result == str2longlong[test_num].value,
|
---|
| 1046 | "(test %d): call failed: _atoi64(\"%s\") has result %lld, expected: %lld",
|
---|
| 1047 | test_num, str2longlong[test_num].str, result, str2longlong[test_num].value);
|
---|
| 1048 | } /* for */
|
---|
| 1049 | }
|
---|
| 1050 |
|
---|
| 1051 |
|
---|
| 1052 | static void test_wtoi64(void)
|
---|
| 1053 | {
|
---|
| 1054 | int test_num;
|
---|
| 1055 | UNICODE_STRING uni;
|
---|
| 1056 | LONGLONG result;
|
---|
| 1057 |
|
---|
| 1058 | for (test_num = 0; test_num < NB_STR2LONGLONG; test_num++) {
|
---|
| 1059 | pRtlCreateUnicodeStringFromAsciiz(&uni, str2longlong[test_num].str);
|
---|
| 1060 | result = p_wtoi64(uni.Buffer);
|
---|
| 1061 | ok(result == str2longlong[test_num].value,
|
---|
| 1062 | "(test %d): call failed: _wtoi64(\"%s\") has result %lld, expected: %lld",
|
---|
| 1063 | test_num, str2longlong[test_num].str, result, str2longlong[test_num].value);
|
---|
| 1064 | pRtlFreeUnicodeString(&uni);
|
---|
| 1065 | } /* for */
|
---|
| 1066 | }
|
---|
| 1067 |
|
---|
| 1068 |
|
---|
| 1069 | START_TEST(string)
|
---|
| 1070 | {
|
---|
| 1071 | InitFunctionPtrs();
|
---|
| 1072 |
|
---|
| 1073 | test_ulongtoa();
|
---|
| 1074 | test_ulonglongtoa();
|
---|
| 1075 | test_atoi64();
|
---|
| 1076 |
|
---|
| 1077 | test_ulongtow();
|
---|
| 1078 | test_ulonglongtow();
|
---|
| 1079 | test_wtoi();
|
---|
| 1080 | test_wtol();
|
---|
| 1081 | test_wtoi64();
|
---|
| 1082 | }
|
---|