|
|
@@ -155,6 +155,66 @@ static const OptionDef* find_option(const OptionDef *po, const char *name){ |
|
|
|
return po; |
|
|
|
} |
|
|
|
|
|
|
|
#if defined(_WIN32) && !defined(__MINGW32CE__) |
|
|
|
/* Will be leaked on exit */ |
|
|
|
static char** win32_argv_utf8 = NULL; |
|
|
|
static int win32_argc = 0; |
|
|
|
|
|
|
|
/** |
|
|
|
* Prepare command line arguments for executable. |
|
|
|
* For Windows - perform wide-char to UTF-8 conversion. |
|
|
|
* Input arguments should be main() function arguments. |
|
|
|
* @param argc_ptr Arguments number (including executable) |
|
|
|
* @param argv_ptr Arguments list. |
|
|
|
*/ |
|
|
|
static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) |
|
|
|
{ |
|
|
|
char *argstr_flat; |
|
|
|
wchar_t **argv_w; |
|
|
|
int i, buffsize = 0, offset = 0; |
|
|
|
|
|
|
|
if (win32_argv_utf8) { |
|
|
|
*argc_ptr = win32_argc; |
|
|
|
*argv_ptr = win32_argv_utf8; |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
win32_argc = 0; |
|
|
|
argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc); |
|
|
|
if (win32_argc <= 0 || !argv_w) |
|
|
|
return; |
|
|
|
|
|
|
|
/* determine the UTF-8 buffer size (including NULL-termination symbols) */ |
|
|
|
for (i = 0; i < win32_argc; i++) |
|
|
|
buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, |
|
|
|
NULL, 0, NULL, NULL); |
|
|
|
|
|
|
|
win32_argv_utf8 = av_mallocz(sizeof(char*) * (win32_argc + 1) + buffsize); |
|
|
|
argstr_flat = (char*)win32_argv_utf8 + sizeof(char*) * (win32_argc + 1); |
|
|
|
if (win32_argv_utf8 == NULL) { |
|
|
|
LocalFree(argv_w); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < win32_argc; i++) { |
|
|
|
win32_argv_utf8[i] = &argstr_flat[offset]; |
|
|
|
offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, |
|
|
|
&argstr_flat[offset], |
|
|
|
buffsize - offset, NULL, NULL); |
|
|
|
} |
|
|
|
win32_argv_utf8[i] = NULL; |
|
|
|
LocalFree(argv_w); |
|
|
|
|
|
|
|
*argc_ptr = win32_argc; |
|
|
|
*argv_ptr = win32_argv_utf8; |
|
|
|
} |
|
|
|
#else |
|
|
|
static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) |
|
|
|
{ |
|
|
|
/* nothing to do */ |
|
|
|
} |
|
|
|
#endif /* WIN32 && !__MINGW32CE__ */ |
|
|
|
|
|
|
|
void parse_options(int argc, char **argv, const OptionDef *options, |
|
|
|
void (* parse_arg_function)(const char*)) |
|
|
|
{ |
|
|
@@ -162,6 +222,9 @@ void parse_options(int argc, char **argv, const OptionDef *options, |
|
|
|
int optindex, handleoptions=1; |
|
|
|
const OptionDef *po; |
|
|
|
|
|
|
|
/* perform system-dependent conversions for arguments list */ |
|
|
|
prepare_app_arguments(&argc, &argv); |
|
|
|
|
|
|
|
/* parse options */ |
|
|
|
optindex = 1; |
|
|
|
while (optindex < argc) { |
|
|
|