* 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. */
| 181 | * @param argv_ptr Arguments list. |
| 182 | */ |
| 183 | static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) |
| 184 | { |
| 185 | char *argstr_flat; |
| 186 | wchar_t **argv_w; |
| 187 | int i, buffsize = 0, offset = 0; |
| 188 | |
| 189 | if (win32_argv_utf8) { |
| 190 | *argc_ptr = win32_argc; |
| 191 | *argv_ptr = win32_argv_utf8; |
| 192 | return; |
| 193 | } |
| 194 | |
| 195 | win32_argc = 0; |
| 196 | argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc); |
| 197 | if (win32_argc <= 0 || !argv_w) |
| 198 | return; |
| 199 | |
| 200 | /* determine the UTF-8 buffer size (including NULL-termination symbols) */ |
| 201 | for (i = 0; i < win32_argc; i++) |
| 202 | buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, |
| 203 | NULL, 0, NULL, NULL); |
| 204 | |
| 205 | win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize); |
| 206 | argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1); |
| 207 | if (!win32_argv_utf8) { |
| 208 | LocalFree(argv_w); |
| 209 | return; |
| 210 | } |
| 211 | |
| 212 | for (i = 0; i < win32_argc; i++) { |
| 213 | win32_argv_utf8[i] = &argstr_flat[offset]; |
| 214 | offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, |
| 215 | &argstr_flat[offset], |
| 216 | buffsize - offset, NULL, NULL); |
| 217 | } |
| 218 | win32_argv_utf8[i] = NULL; |
| 219 | LocalFree(argv_w); |
| 220 | |
| 221 | *argc_ptr = win32_argc; |
| 222 | *argv_ptr = win32_argv_utf8; |
| 223 | } |
| 224 | #else |
| 225 | static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) |
| 226 | { |
no test coverage detected