34{
36#if defined(_WIN32)
38 std::unique_ptr<LPWSTR[], void (*)(
wchar_t**)> wargv = std::unique_ptr<LPWSTR[],
void (*)(
wchar_t**)>(CommandLineToArgvW(GetCommandLineW(), &
argc), [](
wchar_t** ptr) { LocalFree(ptr); });
39 if(wargv == nullptr)
40 {
42 return;
43 }
44 else
45 {
46 m_args.reserve(
static_cast<std::size_t
>(
argc));
49 }
50#elif defined(__APPLE__)
51 std::size_t
argc{
static_cast<std::size_t
>(*_NSGetArgc())};
53 char**
argv{*_NSGetArgv()};
54 for(std::size_t i = 0; i !=
argc; ++i) {
m_args.push_back(
argv[i]); }
56#else
57 std::string cmdline;
58 std::fstream file_stream;
59 const std::fstream::iostate old_iostate{file_stream.exceptions()};
60 try
61 {
62 file_stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
63 file_stream.open("/proc/self/cmdline", std::fstream::in | std::fstream::binary);
64 file_stream.ignore(std::numeric_limits<std::streamsize>::max());
65 cmdline.resize(static_cast<std::size_t>(file_stream.gcount()));
66 file_stream.seekg(0, std::ios_base::beg);
67 file_stream.get(&cmdline[0], static_cast<std::streamsize>(cmdline.size()));
68 file_stream.exceptions(old_iostate);
69 if(file_stream.is_open()) { file_stream.close(); }
70 m_args.reserve(
static_cast<std::size_t
>(std::count(cmdline.begin(), cmdline.end(),
'\0')));
71 for(std::string::iterator it = cmdline.begin(); it != cmdline.end(); it = std::find(it, cmdline.end(),
'\0') + 1) {
m_args.emplace_back(cmdline.data() + (it - cmdline.begin())); }
73 }
74 catch(...)
75 {
76 file_stream.exceptions(old_iostate);
77 if(file_stream.is_open()) { file_stream.close(); }
80 }
81#endif
82}
static std::vector< std::string > argv()
static std::size_t argc()
std::string to_narrow(const std::wstring &wstr)