unit1664.c (11984B)
1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 * SPDX-License-Identifier: curl 22 * 23 ***************************************************************************/ 24 #include "unitcheck.h" 25 26 #ifdef HAVE_NETINET_IN_H 27 #include <netinet/in.h> 28 #endif 29 #ifdef HAVE_NETINET_IN6_H 30 #include <netinet/in6.h> 31 #endif 32 33 #include "memdebug.h" /* LAST include file */ 34 35 static CURLcode t1664_setup(void) 36 { 37 CURLcode res = CURLE_OK; 38 global_init(CURL_GLOBAL_ALL); 39 return res; 40 } 41 42 static CURLcode test_unit1664(char *arg) 43 { 44 UNITTEST_BEGIN(t1664_setup()) 45 46 static const char *wordparse[] = { 47 "word", 48 "word ", 49 " word ", 50 "wo rd", 51 "word(", 52 "wor(d", 53 "perfect", 54 "", 55 "longerth", 56 NULL 57 }; 58 59 int i; 60 printf("curlx_str_word\n"); 61 for(i = 0; wordparse[i]; i++) { 62 struct Curl_str out; 63 const char *line = wordparse[i]; 64 const char *orgline = line; 65 int rc = curlx_str_word(&line, &out, 7); 66 printf("%u: (\"%s\") %d, \"%.*s\" [%d], line %d\n", 67 i, orgline, rc, (int)out.len, out.str, (int)out.len, 68 (int)(line - orgline)); 69 } 70 71 printf("curlx_str_until\n"); 72 for(i = 0; wordparse[i]; i++) { 73 struct Curl_str out; 74 const char *line = wordparse[i]; 75 const char *orgline = line; 76 int rc = curlx_str_until(&line, &out, 7, 'd'); 77 printf("%u: (\"%s\") %d, \"%.*s\" [%d], line %d\n", 78 i, orgline, rc, (int)out.len, out.str, (int)out.len, 79 (int)(line - orgline)); 80 } 81 82 { 83 static const char *qwords[] = { 84 "\"word\"", 85 "\"word", 86 "word\"", 87 "\"word\"\"", 88 "\"word\" ", 89 " \"word\"", 90 "\"perfect\"", 91 "\"p r e t\"", 92 "\"perfec\\\"", 93 "\"\"", 94 "", 95 "\"longerth\"", 96 NULL 97 }; 98 99 printf("curlx_str_quotedword\n"); 100 for(i = 0; qwords[i]; i++) { 101 struct Curl_str out; 102 const char *line = qwords[i]; 103 const char *orgline = line; 104 int rc = curlx_str_quotedword(&line, &out, 7); 105 printf("%u: (\"%s\") %d, \"%.*s\" [%d], line %d\n", 106 i, orgline, rc, (int)out.len, out.str, (int)out.len, 107 (int)(line - orgline)); 108 } 109 } 110 111 { 112 static const char *single[] = { 113 "a", 114 "aa", 115 "A", 116 "b", 117 "\\", 118 " ", 119 "", 120 NULL 121 }; 122 printf("curlx_str_single\n"); 123 for(i = 0; single[i]; i++) { 124 const char *line = single[i]; 125 const char *orgline = line; 126 int rc = curlx_str_single(&line, 'a'); 127 printf("%u: (\"%s\") %d, line %d\n", 128 i, orgline, rc, (int)(line - orgline)); 129 } 130 } 131 { 132 static const char *single[] = { 133 "a", 134 "aa", 135 "A", 136 "b", 137 "\\", 138 " ", 139 "\t", 140 "\n", 141 "", 142 NULL 143 }; 144 printf("curlx_str_singlespace\n"); 145 for(i = 0; single[i]; i++) { 146 const char *line = single[i]; 147 const char *orgline = line; 148 int rc = curlx_str_singlespace(&line); 149 printf("%u: (\"%s\") %d, line %d\n", 150 i, orgline, rc, (int)(line - orgline)); 151 } 152 } 153 154 { 155 static const char *single[] = { 156 "a", 157 "aa", 158 "A", 159 "b", 160 "\\", 161 " ", 162 "", 163 NULL 164 }; 165 printf("curlx_str_single\n"); 166 for(i = 0; single[i]; i++) { 167 const char *line = single[i]; 168 const char *orgline = line; 169 int rc = curlx_str_single(&line, 'a'); 170 printf("%u: (\"%s\") %d, line %d\n", 171 i, orgline, rc, (int)(line - orgline)); 172 } 173 } 174 { 175 static const char *nums[] = { 176 "1", 177 "10000", 178 "1234", 179 "1235", 180 "1236", 181 "01234", 182 "00000000000000000000000000001234", 183 "0123 345", 184 "0123O345", 185 "-12", 186 " 123", 187 "", 188 NULL 189 }; 190 printf("curlx_str_number\n"); 191 for(i = 0; nums[i]; i++) { 192 curl_off_t num; 193 const char *line = nums[i]; 194 const char *orgline = line; 195 int rc = curlx_str_number(&line, &num, 1235); 196 printf("%u: (\"%s\") %d, [%u] line %d\n", 197 i, orgline, rc, (int)num, (int)(line - orgline)); 198 } 199 } 200 201 { 202 struct t { 203 const char *str; 204 curl_off_t max; 205 }; 206 static struct t nums[] = { 207 { "00", 8}, 208 { "1", 8}, 209 { "1", 1}, 210 { "2", 1}, 211 { "2", 2}, 212 { "5", 6}, 213 { "000000000000000000000006", 6}, 214 { "7", 6}, 215 { "8", 6}, 216 { "9", 8}, 217 { "10", 10}, 218 { "11", 10}, 219 { "12", 10}, 220 {NULL, 0} 221 }; 222 printf("curlx_str_number varying max\n"); 223 for(i = 0; nums[i].str; i++) { 224 curl_off_t num; 225 const char *line = nums[i].str; 226 const char *orgline = line; 227 int rc = curlx_str_number(&line, &num, nums[i].max); 228 curl_mprintf("%u: (\"%s\") max %" CURL_FORMAT_CURL_OFF_T 229 " == %d, [%" CURL_FORMAT_CURL_OFF_T "]\n", 230 i, orgline, nums[i].max, rc, num); 231 } 232 } 233 234 { 235 struct t { 236 const char *str; 237 curl_off_t max; 238 }; 239 static struct t nums[] = { 240 { "00", 8}, 241 { "1", 8}, 242 { "1", 1}, 243 { "2", 1}, 244 { "2", 2}, 245 { "5", 6}, 246 { "000000000000000000000006", 6}, 247 { "7", 6}, 248 { "8", 6}, 249 { "9", 8}, 250 { "a", 14}, 251 { "b", 14}, 252 { "c", 14}, 253 { "d", 14}, 254 { "e", 14}, 255 { "f", 14}, 256 { "f", 15}, 257 { "10", 16}, 258 { "11", 16}, 259 { "12", 16}, 260 {NULL, 0} 261 }; 262 printf("curlx_str_hex varying max\n"); 263 for(i = 0; nums[i].str; i++) { 264 curl_off_t num; 265 const char *line = nums[i].str; 266 const char *orgline = line; 267 int rc = curlx_str_hex(&line, &num, nums[i].max); 268 curl_mprintf("%u: (\"%s\") max %" CURL_FORMAT_CURL_OFF_T 269 " == %d, [%" CURL_FORMAT_CURL_OFF_T "]\n", 270 i, orgline, nums[i].max, rc, num); 271 } 272 } 273 274 { 275 struct t { 276 const char *str; 277 curl_off_t max; 278 }; 279 static struct t nums[] = { 280 { "00", 4}, 281 { "1", 4}, 282 { "1", 4}, 283 { "2", 4}, 284 { "3", 4}, 285 { "4", 4}, 286 { "5", 4}, 287 { "000000000000000000000006", 6}, 288 { "7", 7}, 289 { "10", 8}, 290 { "11", 8}, 291 { "11", 9}, 292 { "12", 9}, 293 { "13", 9}, 294 { "8", 10}, 295 {NULL, 0} 296 }; 297 printf("curlx_str_octal varying max\n"); 298 for(i = 0; nums[i].str; i++) { 299 curl_off_t num; 300 const char *line = nums[i].str; 301 const char *orgline = line; 302 int rc = curlx_str_octal(&line, &num, nums[i].max); 303 curl_mprintf("%u: (\"%s\") max %" CURL_FORMAT_CURL_OFF_T 304 " == %d, [%" CURL_FORMAT_CURL_OFF_T "]\n", 305 i, orgline, nums[i].max, rc, num); 306 } 307 } 308 309 { 310 /* CURL_OFF_T is typically 9223372036854775807 */ 311 static const char *nums[] = { 312 "9223372036854775807", /* 2^63 -1 */ 313 "9223372036854775808", /* 2^63 */ 314 "18446744073709551615", /* 2^64 - 1 */ 315 "18446744073709551616", /* 2^64 */ 316 "18446744073709551617", /* 2^64 + 1 */ 317 "0123456799a", 318 "0123456789", 319 "123498760b", 320 "1234987607611298232", 321 "1111111111111111111", 322 "2222222222222222222", 323 "00000000000000000000000000000009223372036854775807", 324 "3333333333333333333", 325 "4444444444444444444", 326 "5555555555555555555", 327 "6666666666666666666", 328 "7777777777777777777", 329 "8888888888888888888", 330 "999999999999999999", 331 NULL 332 }; 333 printf("curlx_str_number / max\n"); 334 for(i = 0; nums[i]; i++) { 335 curl_off_t num; 336 const char *line = nums[i]; 337 const char *orgline = line; 338 int rc = curlx_str_number(&line, &num, CURL_OFF_T_MAX); 339 curl_mprintf("%u: (\"%s\") %d, [%" CURL_FORMAT_CURL_OFF_T "] line %d\n", 340 i, orgline, rc, num, (int)(line - orgline)); 341 } 342 } 343 344 { 345 static const char *newl[] = { 346 "a", 347 "aa", 348 "A", 349 "b", 350 "\\", 351 " ", 352 "\n", 353 "\r", 354 "\r\n", 355 "\x0c", 356 "", 357 NULL 358 }; 359 printf("curlx_str_newline\n"); 360 for(i = 0; newl[i]; i++) { 361 const char *line = newl[i]; 362 const char *orgline = line; 363 int rc = curlx_str_newline(&line); 364 curl_mprintf("%u: (%%%02x) %d, line %d\n", 365 i, *orgline, rc, (int)(line - orgline)); 366 } 367 } 368 369 { 370 static const char *nums[] = { 371 "1", 372 "1000", 373 "1234", 374 "1235", 375 "1236", 376 "01234", 377 "00000000000000000000000000001234", 378 "0123 345", 379 "0123O345", 380 "-12", 381 " 123", 382 "", 383 NULL 384 }; 385 printf("curlx_str_hex\n"); 386 for(i = 0; nums[i]; i++) { 387 curl_off_t num; 388 const char *line = nums[i]; 389 const char *orgline = line; 390 int rc = curlx_str_hex(&line, &num, 0x1235); 391 curl_mprintf("%u: (\"%s\") %d, [%u] line %d\n", 392 i, orgline, rc, (int)num, (int)(line - orgline)); 393 } 394 } 395 396 { 397 static const char *nums[] = { 398 "1", 399 "1000", 400 "1234", 401 "1235", 402 "1236", 403 "01234", 404 "00000000000000000000000000001234", 405 "0123 345", 406 "0123O345", 407 "-12", 408 " 123", 409 "", 410 NULL 411 }; 412 printf("curlx_str_octal\n"); 413 for(i = 0; nums[i]; i++) { 414 curl_off_t num; 415 const char *line = nums[i]; 416 const char *orgline = line; 417 int rc = curlx_str_octal(&line, &num, 01235); 418 curl_mprintf("%u: (\"%s\") %d, [%u] line %d\n", 419 i, orgline, rc, (int)num, (int)(line - orgline)); 420 } 421 } 422 423 { 424 /* CURL_OFF_T is typically 2^63-1 */ 425 static const char *nums[] = { 426 "777777777777777777777", /* 2^63 -1 */ 427 "1000000000000000000000", /* 2^63 */ 428 "111111111111111111111", 429 "222222222222222222222", 430 "333333333333333333333", 431 "444444444444444444444", 432 "555555555555555555555", 433 "666666666666666666666", 434 NULL 435 }; 436 printf("curlx_str_octal / max\n"); 437 for(i = 0; nums[i]; i++) { 438 curl_off_t num; 439 const char *line = nums[i]; 440 const char *orgline = line; 441 int rc = curlx_str_octal(&line, &num, CURL_OFF_T_MAX); 442 curl_mprintf("%u: (\"%s\") %d, [%" CURL_FORMAT_CURL_OFF_T "] line %d\n", 443 i, orgline, rc, num, (int)(line - orgline)); 444 } 445 } 446 447 { 448 /* CURL_OFF_T is typically 2^63-1 */ 449 static const char *nums[] = { 450 "7FFFFFFFFFFFFFFF", /* 2^63 -1 */ 451 "8000000000000000", /* 2^63 */ 452 "1111111111111111", 453 "2222222222222222", 454 "3333333333333333", 455 "4444444444444444", 456 "5555555555555555", 457 "6666666666666666", 458 "7777777777777777", 459 "888888888888888", 460 "999999999999999", 461 "aaaaaaaaAAAAAAA", 462 "bbbbbbbbBBBBBBB", 463 "BBBBBBBBbbbbbbb", 464 "ccccccccCCCCCCC", 465 "ddddddddDDDDDDD", 466 "eeeeeeeeEEEEEEE", 467 "ffffffffFFFFFFF", 468 "abcdef", 469 "ABCDEF", 470 NULL 471 }; 472 printf("curlx_str_hex / max\n"); 473 for(i = 0; nums[i]; i++) { 474 curl_off_t num; 475 const char *line = nums[i]; 476 const char *orgline = line; 477 int rc = curlx_str_hex(&line, &num, CURL_OFF_T_MAX); 478 curl_mprintf("%u: (\"%s\") %d, [%" CURL_FORMAT_CURL_OFF_T "] line %d\n", 479 i, orgline, rc, num, (int)(line - orgline)); 480 } 481 } 482 483 UNITTEST_END(curl_global_cleanup()) 484 }