widl: Avoid using getopt_long().

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-10-05 11:52:15 +02:00
parent 9c4cbde78f
commit 4bc52e3324
1 changed files with 57 additions and 56 deletions

View File

@ -33,9 +33,6 @@
#include <assert.h>
#include <ctype.h>
#include <signal.h>
#ifdef HAVE_GETOPT_H
# include <getopt.h>
#endif
#include "widl.h"
#include "utils.h"
@ -153,6 +150,8 @@ char *temp_name;
const char *prefix_client = "";
const char *prefix_server = "";
static const char *includedir;
static char *output_name;
static const char *sysroot = "";
int line_number = 1;
@ -186,29 +185,29 @@ enum {
static const char short_options[] =
"b:cC:d:D:EhH:I:m:No:O:pP:rsS:tT:uU:VW";
static const struct option long_options[] = {
{ "acf", 1, NULL, ACF_OPTION },
{ "app_config", 0, NULL, APP_CONFIG_OPTION },
{ "dlldata", 1, NULL, DLLDATA_OPTION },
{ "dlldata-only", 0, NULL, DLLDATA_ONLY_OPTION },
{ "help", 0, NULL, PRINT_HELP },
{ "local-stubs", 1, NULL, LOCAL_STUBS_OPTION },
{ "nostdinc", 0, NULL, NOSTDINC_OPTION },
{ "ns_prefix", 0, NULL, RT_NS_PREFIX },
{ "oldnames", 0, NULL, OLDNAMES_OPTION },
{ "output", 0, NULL, 'o' },
{ "prefix-all", 1, NULL, PREFIX_ALL_OPTION },
{ "prefix-client", 1, NULL, PREFIX_CLIENT_OPTION },
{ "prefix-server", 1, NULL, PREFIX_SERVER_OPTION },
{ "robust", 0, NULL, ROBUST_OPTION },
{ "sysroot", 1, NULL, SYSROOT_OPTION },
{ "target", 0, NULL, 'b' },
{ "winrt", 0, NULL, RT_OPTION },
{ "win32", 0, NULL, WIN32_OPTION },
{ "win64", 0, NULL, WIN64_OPTION },
{ "win32-align", 1, NULL, WIN32_ALIGN_OPTION },
{ "win64-align", 1, NULL, WIN64_ALIGN_OPTION },
{ NULL, 0, NULL, 0 }
static const struct long_option long_options[] = {
{ "acf", 1, ACF_OPTION },
{ "app_config", 0, APP_CONFIG_OPTION },
{ "dlldata", 1, DLLDATA_OPTION },
{ "dlldata-only", 0, DLLDATA_ONLY_OPTION },
{ "help", 0, PRINT_HELP },
{ "local-stubs", 1, LOCAL_STUBS_OPTION },
{ "nostdinc", 0, NOSTDINC_OPTION },
{ "ns_prefix", 0, RT_NS_PREFIX },
{ "oldnames", 0, OLDNAMES_OPTION },
{ "output", 0, 'o' },
{ "prefix-all", 1, PREFIX_ALL_OPTION },
{ "prefix-client", 1, PREFIX_CLIENT_OPTION },
{ "prefix-server", 1, PREFIX_SERVER_OPTION },
{ "robust", 0, ROBUST_OPTION },
{ "sysroot", 1, SYSROOT_OPTION },
{ "target", 0, 'b' },
{ "winrt", 0, RT_OPTION },
{ "win32", 0, WIN32_OPTION },
{ "win64", 0, WIN64_OPTION },
{ "win32-align", 1, WIN32_ALIGN_OPTION },
{ "win64-align", 1, WIN64_ALIGN_OPTION },
{ NULL }
};
static const struct
@ -576,26 +575,10 @@ static void init_argv0_dir( const char *argv0 )
#endif
}
int main(int argc,char *argv[])
static void option_callback( int optc, char *optarg )
{
int i, optc;
int ret = 0;
int opti = 0;
char *output_name = NULL;
const char *sysroot = "";
signal( SIGTERM, exit_on_signal );
signal( SIGINT, exit_on_signal );
#ifdef SIGHUP
signal( SIGHUP, exit_on_signal );
#endif
init_argv0_dir( argv[0] );
init_argv0_target( argv[0] );
now = time(NULL);
while((optc = getopt_long_only(argc, argv, short_options, long_options, &opti)) != EOF) {
switch(optc) {
switch (optc)
{
case DLLDATA_OPTION:
dlldata_name = xstrdup(optarg);
break;
@ -625,7 +608,7 @@ int main(int argc,char *argv[])
break;
case PRINT_HELP:
fprintf(stderr, "%s", usage);
return 0;
exit(0);
case RT_OPTION:
winrt_mode = 1;
break;
@ -743,15 +726,33 @@ int main(int argc,char *argv[])
break;
case 'V':
printf("%s", version_string);
return 0;
exit(0);
case 'W':
pedantic = 1;
break;
default:
fprintf(stderr, "%s", usage);
return 1;
case '?':
fprintf(stderr, "widl: %s\n\n%s", optarg, usage);
exit(1);
}
}
}
int main(int argc,char *argv[])
{
int i;
int ret = 0;
struct strarray files;
signal( SIGTERM, exit_on_signal );
signal( SIGINT, exit_on_signal );
#ifdef SIGHUP
signal( SIGHUP, exit_on_signal );
#endif
init_argv0_dir( argv[0] );
init_argv0_target( argv[0] );
now = time(NULL);
files = parse_options( argc, argv, short_options, long_options, 1, option_callback );
if (stdinc)
{
@ -835,21 +836,21 @@ int main(int argc,char *argv[])
if (!dlldata_name && do_dlldata)
dlldata_name = xstrdup("dlldata.c");
if(optind < argc) {
if (files.count) {
if (do_dlldata && !do_everything) {
struct strarray filenames = empty_strarray;
for ( ; optind < argc; ++optind)
strarray_add(&filenames, replace_extension( get_basename( argv[optind] ), ".idl", "" ));
for (i = 0; i < files.count; i++)
strarray_add(&filenames, replace_extension( get_basename( files.str[i] ), ".idl", "" ));
write_dlldata_list(filenames, 0 /* FIXME */ );
return 0;
}
else if (optind != argc - 1) {
else if (files.count > 1) {
fprintf(stderr, "%s", usage);
return 1;
}
else
input_idl_name = input_name = xstrdup(argv[optind]);
input_idl_name = input_name = xstrdup(files.str[0]);
}
else {
fprintf(stderr, "%s", usage);