| 1 | // Licensed to the .NET Foundation under one or more agreements. | 
| 2 | // The .NET Foundation licenses this file to you under the MIT license. | 
| 3 | // See the LICENSE file in the project root for more information. | 
| 4 |  | 
| 5 | /*============================================================================ | 
| 6 | ** | 
| 7 | ** Source:  swscanf.h | 
| 8 | ** | 
| 9 | ** Purpose: Contains common testing functions for swscanf.h | 
| 10 | ** | 
| 11 | ** | 
| 12 | **==========================================================================*/ | 
| 13 |  | 
| 14 | #ifndef __SWSCANF_H__ | 
| 15 | #define __SWSCANF_H__ | 
| 16 |  | 
| 17 | void DoVoidTest(WCHAR *inputstr, const WCHAR *formatstr) | 
| 18 | { | 
| 19 |     char buf[256] = { 0 }; | 
| 20 |     int i; | 
| 21 |     int ret; | 
| 22 |  | 
| 23 |     ret = swscanf(inputstr, formatstr, buf); | 
| 24 |     if (ret != 0) | 
| 25 |     { | 
| 26 |         Fail("ERROR: Expected sscanf to return 0, got %d.\n"  | 
| 27 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 28 |             convertC(formatstr)); | 
| 29 |     } | 
| 30 |  | 
| 31 |     for (i=0; i<256; i++) | 
| 32 |     { | 
| 33 |         if (buf[i] != 0) | 
| 34 |         { | 
| 35 |             Fail("ERROR: Parameter unexpectedly modified scanning \"%s\" "  | 
| 36 |                 "using \"%s\".\n" , convertC(inputstr),  | 
| 37 |                 convertC(formatstr)); | 
| 38 |         } | 
| 39 |     } | 
| 40 |  | 
| 41 | } | 
| 42 |  | 
| 43 | void DoStrTest(WCHAR *inputstr, const WCHAR *formatstr, const char *checkstr) | 
| 44 | { | 
| 45 |     char buf[256] = { 0 }; | 
| 46 |     int ret; | 
| 47 |  | 
| 48 |     ret = swscanf(inputstr, formatstr, buf); | 
| 49 |     if (ret != 1) | 
| 50 |     { | 
| 51 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 52 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 53 |             convertC(formatstr)); | 
| 54 |     } | 
| 55 |  | 
| 56 |     if (memcmp(checkstr, buf, strlen(checkstr) + 1) != 0) | 
| 57 |     { | 
| 58 |         Fail("ERROR: scanned string incorrectly from \"%s\" using \"%s\".\n"  | 
| 59 |             "Expected \"%s\", got \"%s\".\n" , convertC(inputstr),  | 
| 60 |             convertC(formatstr), checkstr,  | 
| 61 |             buf); | 
| 62 |     } | 
| 63 |  | 
| 64 | } | 
| 65 |  | 
| 66 | void DoWStrTest(WCHAR *inputstr, const WCHAR *formatstr, const WCHAR *checkstr) | 
| 67 | { | 
| 68 |     WCHAR buf[256] = { 0 }; | 
| 69 |     int ret; | 
| 70 |  | 
| 71 |     ret = swscanf(inputstr, formatstr, buf); | 
| 72 |     if (ret != 1) | 
| 73 |     { | 
| 74 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 75 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr), | 
| 76 |             convertC(formatstr)); | 
| 77 |     } | 
| 78 |  | 
| 79 |     if (memcmp(checkstr, buf, wcslen(checkstr)*2 + 2) != 0) | 
| 80 |     { | 
| 81 |         Fail("ERROR: scanned wide string incorrectly from \"%s\" using \"%s\".\n"  | 
| 82 |             "Expected \"%s\", got \"%s\".\n" , convertC(inputstr),  | 
| 83 |             convertC(formatstr), convertC(checkstr),  | 
| 84 |             convertC(buf)); | 
| 85 |     } | 
| 86 |  | 
| 87 | } | 
| 88 |  | 
| 89 | void DoNumTest(WCHAR *inputstr, const WCHAR *formatstr, int checknum) | 
| 90 | { | 
| 91 |     int num = 0; | 
| 92 |     int ret; | 
| 93 |  | 
| 94 |     ret = swscanf(inputstr, formatstr, &num); | 
| 95 |     if (ret != 1) | 
| 96 |     { | 
| 97 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 98 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 99 |             convertC(formatstr)); | 
| 100 |     } | 
| 101 |  | 
| 102 |     if (checknum != num) | 
| 103 |     { | 
| 104 |         Fail("ERROR: scanned number incorrectly from \"%s\" using \"%s\".\n"  | 
| 105 |             "Expected %d, got %d.\n" , convertC(inputstr),  | 
| 106 |             convertC(formatstr), checknum, num); | 
| 107 |     } | 
| 108 | } | 
| 109 |  | 
| 110 | void DoShortNumTest(WCHAR *inputstr, const WCHAR *formatstr, short checknum) | 
| 111 | { | 
| 112 |     short num = 0; | 
| 113 |     int ret; | 
| 114 |  | 
| 115 |     ret = swscanf(inputstr, formatstr, &num); | 
| 116 |     if (ret != 1) | 
| 117 |     { | 
| 118 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 119 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 120 |             convertC(formatstr)); | 
| 121 |     } | 
| 122 |  | 
| 123 |     if (checknum != num) | 
| 124 |     { | 
| 125 |         Fail("ERROR: scanned number incorrectly from \"%s\" using \"%s\".\n"  | 
| 126 |             "Expected %hd, got %hd.\n" , convertC(inputstr),  | 
| 127 |             convertC(formatstr), checknum, num); | 
| 128 |     } | 
| 129 | } | 
| 130 |  | 
| 131 | void DoI64NumTest(WCHAR *inputstr, const WCHAR *formatstr, INT64 checknum) | 
| 132 | { | 
| 133 |     char buf[256]; | 
| 134 |     char check[256]; | 
| 135 |     INT64 num; | 
| 136 |     int ret; | 
| 137 |  | 
| 138 |     ret = swscanf(inputstr, formatstr, &num); | 
| 139 |     if (ret != 1) | 
| 140 |     { | 
| 141 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 142 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 143 |             convertC(formatstr)); | 
| 144 |     } | 
| 145 |  | 
| 146 |     if (checknum != num) | 
| 147 |     { | 
| 148 |         sprintf_s(buf, _countof(buf), "%I64d" , num); | 
| 149 |         sprintf_s(check, _countof(check), "%I64d" , checknum); | 
| 150 |         Fail("ERROR: scanned I64 number incorrectly from \"%s\" using \"%s\".\n"  | 
| 151 |             "Expected %s, got %s.\n" , convertC(inputstr),  | 
| 152 |             convertC(formatstr), check, buf); | 
| 153 |     } | 
| 154 | } | 
| 155 |  | 
| 156 | void DoCharTest(WCHAR *inputstr, const WCHAR *formatstr, char* checkchars, int numchars) | 
| 157 | { | 
| 158 |     char buf[256]; | 
| 159 |     int ret; | 
| 160 |     int i; | 
| 161 |  | 
| 162 |     for (i=0; i<256; i++) | 
| 163 |         buf[i] = (char)-1; | 
| 164 |  | 
| 165 |     ret = swscanf(inputstr, formatstr, buf); | 
| 166 |     if (ret != 1) | 
| 167 |     { | 
| 168 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 169 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 170 |             convertC(formatstr)); | 
| 171 |     } | 
| 172 |  | 
| 173 |     if (memcmp(buf, checkchars, numchars) != 0) | 
| 174 |     { | 
| 175 |         buf[numchars] = 0; | 
| 176 |  | 
| 177 |         Fail("ERROR: scanned character(s) incorrectly from \"%s\" using \"%s\".\n"  | 
| 178 |             "Expected %s, got %s.\n" , convertC(inputstr),  | 
| 179 |             convertC(formatstr), checkchars, buf); | 
| 180 |     } | 
| 181 |  | 
| 182 |     if (buf[numchars] != (char)-1) | 
| 183 |     { | 
| 184 |         Fail("ERROR: overflow occurred in scanning character(s) from \"%s\" "  | 
| 185 |             "using \"%s\".\nExpected %d character(s)\n" ,  | 
| 186 |             convertC(inputstr), convertC(formatstr), numchars); | 
| 187 |     } | 
| 188 | } | 
| 189 |  | 
| 190 | void DoWCharTest(WCHAR *inputstr, const WCHAR *formatstr, const WCHAR *checkchars, int numchars) | 
| 191 | { | 
| 192 |     WCHAR buf[256]; | 
| 193 |     int ret; | 
| 194 |     int i; | 
| 195 |  | 
| 196 |     for (i=0; i<256; i++) | 
| 197 |         buf[i] = (WCHAR)-1; | 
| 198 |  | 
| 199 |     ret = swscanf(inputstr, formatstr, buf); | 
| 200 |     if (ret != 1) | 
| 201 |     { | 
| 202 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 203 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 204 |             convertC(formatstr)); | 
| 205 |     } | 
| 206 |  | 
| 207 |     if (memcmp(buf, checkchars, numchars*2) != 0) | 
| 208 |     { | 
| 209 |         buf[numchars] = 0; | 
| 210 |  | 
| 211 |         Fail("ERROR: scanned wide character(s) incorrectly from \"%s\" using \"%s\".\n"  | 
| 212 |             "Expected %s, got %s.\n" , convertC(inputstr),  | 
| 213 |             convertC(formatstr), convertC(checkchars),  | 
| 214 |             convertC(buf)); | 
| 215 |     } | 
| 216 |  | 
| 217 |     if (buf[numchars] != (WCHAR)-1) | 
| 218 |     { | 
| 219 |         Fail("ERROR: overflow occurred in scanning wide character(s) from \"%s\" "  | 
| 220 |             "using \"%s\".\nExpected %d character(s)\n" ,  | 
| 221 |             convertC(inputstr), convertC(formatstr), numchars); | 
| 222 |     } | 
| 223 | } | 
| 224 |  | 
| 225 |  | 
| 226 | void DoFloatTest(WCHAR *inputstr, const WCHAR *formatstr, float checkval) | 
| 227 | { | 
| 228 |     char buf[256] = { 0 }; | 
| 229 |     float val; | 
| 230 |     int ret; | 
| 231 |     int i; | 
| 232 |  | 
| 233 |     for (i=0; i<256; i++) | 
| 234 |         buf[i] = (char)-1; | 
| 235 |  | 
| 236 |     ret = swscanf(inputstr, formatstr, buf); | 
| 237 |     val = *(float*)buf; | 
| 238 |  | 
| 239 |     if (ret != 1) | 
| 240 |     { | 
| 241 |         Fail("ERROR: Expected swscanf to return 1, got %d.\n"  | 
| 242 |             "Using \"%s\" in \"%s\".\n" , ret, convertC(inputstr),  | 
| 243 |             convertC(formatstr)); | 
| 244 |     } | 
| 245 |  | 
| 246 |     if (val != checkval) | 
| 247 |     { | 
| 248 |         Fail("ERROR: scanned float incorrectly from \"%s\" using \"%s\".\n"  | 
| 249 |             "Expected \"%f\", got \"%f\".\n" , convertC(inputstr),  | 
| 250 |             convertC(formatstr), checkval, val); | 
| 251 |     } | 
| 252 |  | 
| 253 |     if (buf[4] != (char)-1) | 
| 254 |     { | 
| 255 |         Fail("ERROR: overflow occurred in scanning float from \"%s\" "  | 
| 256 |             "using \"%s\".\n" , convertC(inputstr), convertC(formatstr)); | 
| 257 |  | 
| 258 |     } | 
| 259 | } | 
| 260 |  | 
| 261 |  | 
| 262 | #endif | 
| 263 |  |