* 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. */
| 245 | * @param argv_ptr Arguments list. |
| 246 | */ |
| 247 | static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) |
| 248 | { |
| 249 | char *argstr_flat; |
| 250 | wchar_t **argv_w; |
| 251 | int i, buffsize = 0, offset = 0; |
| 252 | |
| 253 | if (win32_argv_utf8) { |
| 254 | *argc_ptr = win32_argc; |
| 255 | *argv_ptr = win32_argv_utf8; |
| 256 | return; |
| 257 | } |
| 258 | |
| 259 | win32_argc = 0; |
| 260 | argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc); |
| 261 | if (win32_argc <= 0 || !argv_w) |
| 262 | return; |
| 263 | |
| 264 | /* determine the UTF-8 buffer size (including NULL-termination symbols) */ |
| 265 | for (i = 0; i < win32_argc; i++) |
| 266 | buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, |
| 267 | NULL, 0, NULL, NULL); |
| 268 | |
| 269 | win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize); |
| 270 | argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1); |
| 271 | if (!win32_argv_utf8) { |
| 272 | LocalFree(argv_w); |
| 273 | return; |
| 274 | } |
| 275 | |
| 276 | for (i = 0; i < win32_argc; i++) { |
| 277 | win32_argv_utf8[i] = &argstr_flat[offset]; |
| 278 | offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, |
| 279 | &argstr_flat[offset], |
| 280 | buffsize - offset, NULL, NULL); |
| 281 | } |
| 282 | win32_argv_utf8[i] = NULL; |
| 283 | LocalFree(argv_w); |
| 284 | |
| 285 | *argc_ptr = win32_argc; |
| 286 | *argv_ptr = win32_argv_utf8; |
| 287 | } |
| 288 | #else |
| 289 | static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) |
| 290 | { |
no outgoing calls
no test coverage detected