| 471 | } |
| 472 | |
| 473 | static void parse_args(int& argc, char* argv[], const char* verbosity_flag) |
| 474 | { |
| 475 | int arg_dest = 1; |
| 476 | int out_argc = argc; |
| 477 | |
| 478 | for (int arg_it = 1; arg_it < argc; ++arg_it) { |
| 479 | auto cmd = argv[arg_it]; |
| 480 | auto arg_len = strlen(verbosity_flag); |
| 481 | |
| 482 | bool last_is_alpha = false; |
| 483 | #if LOGURU_USE_LOCALE |
| 484 | try { // locale variant of isalpha will throw on error |
| 485 | last_is_alpha = std::isalpha(cmd[arg_len], std::locale("")); |
| 486 | } |
| 487 | catch (...) { |
| 488 | last_is_alpha = std::isalpha(static_cast<int>(cmd[arg_len])); |
| 489 | } |
| 490 | #else |
| 491 | last_is_alpha = std::isalpha(static_cast<int>(cmd[arg_len])); |
| 492 | #endif |
| 493 | |
| 494 | if (strncmp(cmd, verbosity_flag, arg_len) == 0 && !last_is_alpha) { |
| 495 | out_argc -= 1; |
| 496 | auto value_str = cmd + arg_len; |
| 497 | if (value_str[0] == '\0') { |
| 498 | // Value in separate argument |
| 499 | arg_it += 1; |
| 500 | CHECK_LT_F(arg_it, argc, "Missing verbosiy level after " LOGURU_FMT(s) "", verbosity_flag); |
| 501 | value_str = argv[arg_it]; |
| 502 | out_argc -= 1; |
| 503 | } |
| 504 | if (*value_str == '=') { value_str += 1; } |
| 505 | |
| 506 | auto req_verbosity = get_verbosity_from_name(value_str); |
| 507 | if (req_verbosity != Verbosity_INVALID) { |
| 508 | g_stderr_verbosity = req_verbosity; |
| 509 | } |
| 510 | else { |
| 511 | char* end = 0; |
| 512 | g_stderr_verbosity = static_cast<int>(strtol(value_str, &end, 10)); |
| 513 | CHECK_F(end && *end == '\0', |
| 514 | "Invalid verbosity. Expected integer, INFO, WARNING, ERROR or OFF, got '" LOGURU_FMT(s) "'", value_str); |
| 515 | } |
| 516 | } |
| 517 | else { |
| 518 | argv[arg_dest++] = argv[arg_it]; |
| 519 | } |
| 520 | } |
| 521 | |
| 522 | argc = out_argc; |
| 523 | argv[argc] = nullptr; |
| 524 | } |
| 525 | |
| 526 | static long long now_ns() |
| 527 | { |
no test coverage detected