1
0
mirror of https://github.com/CLIUtils/CLI11.git synced 2025-05-01 05:03:52 +00:00
CLI11/tests/applications/ensure_utf8_twice.cpp
Andrey Zhukov 0d4e19133c
feat: unicode API rework (#923)
Fixes #845 as discussed.

Comparing the two approaches of getting `argv`:
1. The "old" way, through `CLI::argv()`:
    ✔️ Works automatically and almost everywhere
     Small abstraction overhead on macOS
     Does not work in weird edge-cases such as missing `/proc`
2. This PR, through `app.ensure_utf8`:
✔️ True zero-overhead abstraction: you don't pay for what you don't use
✔️ Less moving parts than the "old" approach, probably can't be broken
 Requires extra code to be written by the user (which is sad because
ideally everyone should use this by default)

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-09-20 13:20:53 -04:00

37 lines
906 B
C++

// Copyright (c) 2017-2023, University of Cincinnati, developed by Henry Schreiner
// under NSF AWARD 1414736 and by the respective contributors.
// All rights reserved.
//
// SPDX-License-Identifier: BSD-3-Clause
#include <CLI/CLI.hpp>
#include <cstring>
#include <iostream>
int main(int argc, char **argv) {
CLI::App app{"App description"};
char **original_argv = argv;
argv = app.ensure_utf8(argv);
argv = app.ensure_utf8(argv); // completely useless but works ok
#ifdef _WIN32
for(int i = 0; i < argc; i++) {
if(std::strcmp(argv[i], original_argv[i]) != 0) {
std::cerr << argv[i] << "\n";
std::cerr << original_argv[i] << "\n";
return i + 1;
}
argv[i][0] = 'x'; // access it to check that it is accessible
}
#else
(void)argc;
if(original_argv != argv) {
return -1;
}
#endif
return 0;
}