| 431 | String_Format4(str, format, a1, a2, a3, NULL); |
| 432 | } |
| 433 | void String_Format4(cc_string* str, const char* format, const void* a1, const void* a2, const void* a3, const void* a4) { |
| 434 | const void* arg; |
| 435 | int i, j = 0, digits; |
| 436 | |
| 437 | const void* args[4]; |
| 438 | args[0] = a1; args[1] = a2; args[2] = a3; args[3] = a4; |
| 439 | |
| 440 | for (i = 0; format[i]; i++) { |
| 441 | if (format[i] != '%') { String_Append(str, format[i]); continue; } |
| 442 | arg = args[j++]; |
| 443 | |
| 444 | switch (format[++i]) { |
| 445 | case 'b': |
| 446 | String_AppendInt(str, *((cc_uint8*)arg)); |
| 447 | break; |
| 448 | case 'i': |
| 449 | String_AppendInt(str, *((int*)arg)); |
| 450 | break; |
| 451 | case 'f': |
| 452 | digits = format[++i] - '0'; |
| 453 | String_AppendFloat(str, *((float*)arg), digits); |
| 454 | break; |
| 455 | case 'p': |
| 456 | digits = format[++i] - '0'; |
| 457 | String_AppendPaddedInt(str, *((int*)arg), digits); |
| 458 | break; |
| 459 | case 't': |
| 460 | String_AppendBool(str, *((cc_bool*)arg)); |
| 461 | break; |
| 462 | case 'c': |
| 463 | String_AppendConst(str, (char*)arg); |
| 464 | break; |
| 465 | case 's': |
| 466 | String_AppendString(str, (cc_string*)arg); |
| 467 | break; |
| 468 | case 'r': |
| 469 | String_Append(str, *((char*)arg)); |
| 470 | break; |
| 471 | case 'x': |
| 472 | if (sizeof(cc_uintptr) == 4) { |
| 473 | String_Hex32(str, *((cc_uint32*)arg)); |
| 474 | } else { |
| 475 | String_Hex64(str, *((cc_uint64*)arg)); |
| 476 | } |
| 477 | break; |
| 478 | case 'h': |
| 479 | String_Hex32(str, *((cc_uint32*)arg)); |
| 480 | break; |
| 481 | case 'e': |
| 482 | digits = *((int*)arg); |
| 483 | if (digits >= -0xFFFF && digits <= 0xFFFF) { |
| 484 | String_AppendInt(str, digits); |
| 485 | } else { |
| 486 | String_Hex32(str, (cc_uint32)digits); |
| 487 | } |
| 488 | break; |
| 489 | case '%': |
| 490 | String_Append(str, '%'); |
no test coverage detected