e2e5b01d77
Restore the "main" name since that is used everywhere else except for Windows. On Windows, "main" is renamed via a macro to avoid a conflict with "wmain" and to allow it to be called in cli_main.c. For those wondering, GUI applications (such as Qt) have a different entry point, namely WinMain. In Qt5, src/winmain/qtmain_win.cpp defines WinMain, but seems to convert its arguments from Unicode to CP_ACP (ASCII). It might not support UTF-8, but I did not verify this. Change-Id: I93fa59324eb2ef95a305b08fc5ba34d49cc73bf0 Reviewed-on: https://code.wireshark.org/review/31208 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Reviewed-by: Anders Broman <a.broman58@gmail.com>
73 lines
1.8 KiB
C
73 lines
1.8 KiB
C
/*
|
|
* Compile and link this with all CLI programs where the main routine
|
|
* should get UTF-8 arguments on Windows. In those programs, include the
|
|
* cli_main.h header to rename main to real_main on Windows.
|
|
*
|
|
* This is used in software licensed under the GPLv2, and its license MUST
|
|
* be compatible with that license.
|
|
*
|
|
* This is used in software licensed under the Apache 2.0 license, and its
|
|
* license MUST be compatible with that license.
|
|
*
|
|
* For that purpose, we use the MIT (X11) license.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include "cli_main.h"
|
|
|
|
#ifdef _WIN32
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
int
|
|
wmain(int argc, wchar_t *wc_argv[])
|
|
{
|
|
char **argv;
|
|
int i;
|
|
|
|
argv = (char **)malloc((argc + 1) * sizeof(char *));
|
|
if (argv == NULL) {
|
|
fprintf(stderr, "Out of memory for converted argument list\n");
|
|
return 2;
|
|
}
|
|
for (i = 0; i < argc; i++) {
|
|
/*
|
|
* XXX = use WC_ERR_INVALID_CHARS rather than 0, and fail if
|
|
* the argument isn't valid UTF-16?
|
|
*/
|
|
int width;
|
|
char *utf8_string;
|
|
|
|
width = WideCharToMultiByte(CP_UTF8, 0, wc_argv[i], -1, NULL, 0,
|
|
NULL, NULL);
|
|
if (width == 0) {
|
|
fprintf(stderr, "WideCharToMultiByte failed: %d\n",
|
|
width);
|
|
return 2;
|
|
}
|
|
utf8_string = malloc(width);
|
|
if (utf8_string == NULL) {
|
|
fprintf(stderr,
|
|
"Out of memory for converted argument list\n");
|
|
return 2;
|
|
}
|
|
if (WideCharToMultiByte(CP_UTF8, 0, wc_argv[i], -1, utf8_string,
|
|
width, NULL, NULL) == 0) {
|
|
fprintf(stderr, "WideCharToMultiByte failed: %d\n",
|
|
width);
|
|
return 2;
|
|
}
|
|
argv[i] = utf8_string;
|
|
}
|
|
argv[i] = NULL;
|
|
/*
|
|
* The original "main" routine was renamed to "real_main" via a macro in
|
|
* the cli_main.h header file since either "main" or "wmain" can be
|
|
* defined on Windows, but not both.
|
|
*/
|
|
return real_main(argc, argv);
|
|
}
|
|
#endif
|