From: caballero Date: Tue, 17 Feb 2009 17:17:32 +0000 (+0000) Subject: Corrected ggo to work in win32. X-Git-Tag: EED.02Oct2009~188 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=ba6e0d962a85043a44aa79edb5bfb2f146e288d0;p=creaImageIO.git Corrected ggo to work in win32. Added file selector to add file and event table. --- diff --git a/appli/gimmick/CMakeLists.txt b/appli/gimmick/CMakeLists.txt index 7f9f7ad..b39fa9e 100644 --- a/appli/gimmick/CMakeLists.txt +++ b/appli/gimmick/CMakeLists.txt @@ -1,28 +1,32 @@ -IF(GGO) +#IF(GGO) + SET(GENGETOPT gengetopt) +IF(WIN32) + SET(GENGETOPT C:/Users/Juan/Downloads/gengetopt) +ENDIF(WIN32) #========================================================= # Find ggo (gengetopt) files (http://www.gnu.org/software/gengetopt/) FILE(GLOB ALL_GGO_FILES *.ggo) - MESSAGE(${ALL_GGO_FILES}) + #MESSAGE(${ALL_GGO_FILES}) FOREACH(GGO_FILE ${ALL_GGO_FILES}) #MESSAGE(input=${GGO_FILE}) STRING(REGEX REPLACE "(.*).ggo" "\\1" GGO_BASENAME "${GGO_FILE}") - MESSAGE( base= ${GGO_BASENAME}) + #MESSAGE( base= ${GGO_BASENAME}) SET(GGO_H ${GGO_BASENAME}_ggo.h) - MESSAGE(${GGO_H}) + #MESSAGE(${GGO_H}) SET(GGO_C ${GGO_BASENAME}_ggo.c) - MESSAGE(${GGO_C}) + #MESSAGE(${GGO_C}) SET(GGO_OUTPUT ${GGO_H} ${GGO_C}) ADD_CUSTOM_COMMAND(OUTPUT ${GGO_OUTPUT} - COMMAND gengetopt + COMMAND ${GENGETOPT} ARGS < ${GGO_FILE} --file-name=${GGO_BASENAME}_ggo -u --conf-parser DEPENDS ${GGO_FILE} ) ENDFOREACH(GGO_FILE) #========================================================= -ENDIF(GGO) +#ENDIF(GGO) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(SOURCES main gimmick_ggo.c) diff --git a/appli/gimmick/gimmick_ggo.c b/appli/gimmick/gimmick_ggo.c index 72e99f4..d6deab0 100644 --- a/appli/gimmick/gimmick_ggo.c +++ b/appli/gimmick/gimmick_ggo.c @@ -1,7 +1,7 @@ /* - File autogenerated by gengetopt version 2.22 + File autogenerated by gengetopt version 2.20 generated with the following command: - gengetopt --file-name=/home/guigues/coding/CreaTools/creaImageIO/appli/gimmick/gimmick_ggo -u --conf-parser + gengetopt --include-getopt --file-name=gimmick_ggo The developers of gengetopt consider the fixed text that goes in all gengetopt output files to be in the public domain: @@ -17,9 +17,8 @@ #include #include -#include "getopt.h" -#include "/home/guigues/coding/CreaTools/creaImageIO/appli/gimmick/gimmick_ggo.h" +#include "gimmick_ggo.h" const char *gengetopt_args_info_purpose = ""; @@ -41,47 +40,16 @@ const char *gengetopt_args_info_help[] = { 0 }; -typedef enum {ARG_NO - , ARG_FLAG - , ARG_STRING - , ARG_INT -} cmdline_parser_arg_type; - static void clear_given (struct gengetopt_args_info *args_info); static void clear_args (struct gengetopt_args_info *args_info); static int -cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params, const char *additional_error); +cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required, const char *additional_error); static int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); -struct line_list -{ - char * string_arg; - struct line_list * next; -}; - -static struct line_list *cmd_line_list = 0; -static struct line_list *cmd_line_list_tmp = 0; - -static void -free_cmd_list(void) -{ - /* free the list of a previous call */ - if (cmd_line_list) - { - while (cmd_line_list) { - cmd_line_list_tmp = cmd_line_list; - cmd_line_list = cmd_line_list->next; - free (cmd_line_list_tmp->string_arg); - free (cmd_line_list_tmp); - } - } -} - static char * gengetopt_strdup (const char *s); @@ -118,8 +86,6 @@ void clear_args (struct gengetopt_args_info *args_info) static void init_args_info(struct gengetopt_args_info *args_info) { - - args_info->help_help = gengetopt_args_info_help[0] ; args_info->version_help = gengetopt_args_info_help[1] ; args_info->print_help = gengetopt_args_info_help[3] ; @@ -137,26 +103,20 @@ cmdline_parser_print_version (void) printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION); } -static void print_help_common(void) { +void +cmdline_parser_print_help (void) +{ + int i = 0; cmdline_parser_print_version (); if (strlen(gengetopt_args_info_purpose) > 0) printf("\n%s\n", gengetopt_args_info_purpose); - if (strlen(gengetopt_args_info_usage) > 0) - printf("\n%s\n", gengetopt_args_info_usage); - - printf("\n"); + printf("\n%s\n\n", gengetopt_args_info_usage); if (strlen(gengetopt_args_info_description) > 0) printf("%s\n", gengetopt_args_info_description); -} -void -cmdline_parser_print_help (void) -{ - int i = 0; - print_help_common(); while (gengetopt_args_info_help[i]) printf("%s\n", gengetopt_args_info_help[i++]); } @@ -167,108 +127,44 @@ cmdline_parser_init (struct gengetopt_args_info *args_info) clear_given (args_info); clear_args (args_info); init_args_info (args_info); - - args_info->inputs = NULL; - args_info->inputs_num = 0; -} - -void -cmdline_parser_params_init(struct cmdline_parser_params *params) -{ - if (params) - { - params->override = 0; - params->initialize = 1; - params->check_required = 1; - params->check_ambiguity = 0; - params->print_errors = 1; - } -} - -struct cmdline_parser_params * -cmdline_parser_params_create(void) -{ - struct cmdline_parser_params *params = - (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); - cmdline_parser_params_init(params); - return params; } -static void -free_string_field (char **s) -{ - if (*s) - { - free (*s); - *s = 0; - } -} - - static void cmdline_parser_release (struct gengetopt_args_info *args_info) { - unsigned int i; - free_string_field (&(args_info->file_arg)); - free_string_field (&(args_info->file_orig)); - free_string_field (&(args_info->dir_arg)); - free_string_field (&(args_info->dir_orig)); - free_string_field (&(args_info->verbose_orig)); - free_string_field (&(args_info->debug_orig)); - - for (i = 0; i < args_info->inputs_num; ++i) - free (args_info->inputs [i]); - - if (args_info->inputs_num) - free (args_info->inputs); - - clear_given (args_info); -} - - -static void -write_into_file(FILE *outfile, const char *opt, const char *arg, char *values[]) -{ - if (arg) { - fprintf(outfile, "%s=\"%s\"\n", opt, arg); - } else { - fprintf(outfile, "%s\n", opt); - } -} - - -int -cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) -{ - int i = 0; - - if (!outfile) + if (args_info->file_arg) { - fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); - return EXIT_FAILURE; + free (args_info->file_arg); /* free previous argument */ + args_info->file_arg = 0; + } + if (args_info->file_orig) + { + free (args_info->file_orig); /* free previous argument */ + args_info->file_orig = 0; + } + if (args_info->dir_arg) + { + free (args_info->dir_arg); /* free previous argument */ + args_info->dir_arg = 0; + } + if (args_info->dir_orig) + { + free (args_info->dir_orig); /* free previous argument */ + args_info->dir_orig = 0; + } + if (args_info->verbose_orig) + { + free (args_info->verbose_orig); /* free previous argument */ + args_info->verbose_orig = 0; + } + if (args_info->debug_orig) + { + free (args_info->debug_orig); /* free previous argument */ + args_info->debug_orig = 0; } - - if (args_info->help_given) - write_into_file(outfile, "help", 0, 0 ); - if (args_info->version_given) - write_into_file(outfile, "version", 0, 0 ); - if (args_info->print_given) - write_into_file(outfile, "print", 0, 0 ); - if (args_info->file_given) - write_into_file(outfile, "file", args_info->file_orig, 0); - if (args_info->dir_given) - write_into_file(outfile, "dir", args_info->dir_orig, 0); - if (args_info->recurse_given) - write_into_file(outfile, "recurse", 0, 0 ); - if (args_info->verbose_given) - write_into_file(outfile, "verbose", args_info->verbose_orig, 0); - if (args_info->debug_given) - write_into_file(outfile, "debug", args_info->debug_orig, 0); - - i = EXIT_SUCCESS; - return i; + clear_given (args_info); } int @@ -285,9 +181,50 @@ cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_ return EXIT_FAILURE; } - i = cmdline_parser_dump(outfile, args_info); + if (args_info->help_given) { + fprintf(outfile, "%s\n", "help"); + } + if (args_info->version_given) { + fprintf(outfile, "%s\n", "version"); + } + if (args_info->print_given) { + fprintf(outfile, "%s\n", "print"); + } + if (args_info->file_given) { + if (args_info->file_orig) { + fprintf(outfile, "%s=\"%s\"\n", "file", args_info->file_orig); + } else { + fprintf(outfile, "%s\n", "file"); + } + } + if (args_info->dir_given) { + if (args_info->dir_orig) { + fprintf(outfile, "%s=\"%s\"\n", "dir", args_info->dir_orig); + } else { + fprintf(outfile, "%s\n", "dir"); + } + } + if (args_info->recurse_given) { + fprintf(outfile, "%s\n", "recurse"); + } + if (args_info->verbose_given) { + if (args_info->verbose_orig) { + fprintf(outfile, "%s=\"%s\"\n", "verbose", args_info->verbose_orig); + } else { + fprintf(outfile, "%s\n", "verbose"); + } + } + if (args_info->debug_given) { + if (args_info->debug_orig) { + fprintf(outfile, "%s=\"%s\"\n", "debug", args_info->debug_orig); + } else { + fprintf(outfile, "%s\n", "debug"); + } + } + fclose (outfile); + i = EXIT_SUCCESS; return i; } @@ -297,7 +234,9 @@ cmdline_parser_free (struct gengetopt_args_info *args_info) cmdline_parser_release (args_info); } -/** @brief replacement of strdup, which is not standard */ + +/* gengetopt_strdup() */ +/* strdup.c replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { @@ -318,35 +257,12 @@ cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_i return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); } -int -cmdline_parser_ext (int argc, char * const *argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params) -{ - int result; - result = cmdline_parser_internal (argc, argv, args_info, params, NULL); - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - int cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { int result; - struct cmdline_parser_params params; - - params.override = override; - params.initialize = initialize; - params.check_required = check_required; - params.check_ambiguity = 0; - params.print_errors = 1; - result = cmdline_parser_internal (argc, argv, args_info, ¶ms, NULL); + result = cmdline_parser_internal (argc, argv, args_info, override, initialize, check_required, NULL); if (result == EXIT_FAILURE) { @@ -391,140 +307,636 @@ cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *pro return error; } +/* + * Extracted from the glibc source tree, version 2.3.6 + * + * Licensed under the GPL as per the whole glibc source tree. + * + * This file was modified so that getopt_long can be called + * many times without risking previous memory to be spoiled. + * + * Modified by Andre Noll and Lorenzo Bettini for use in + * GNU gengetopt generated files. + * + */ -static char *package_name = 0; - -/** - * @brief updates an option - * @param field the generic pointer to the field to update - * @param orig_field the pointer to the orig field - * @param field_given the pointer to the number of occurrence of this option - * @param prev_given the pointer to the number of occurrence already seen - * @param value the argument for this option (if null no arg was specified) - * @param possible_values the possible values for this option (if specified) - * @param default_value the default value (in case the option only accepts fixed values) - * @param arg_type the type of this option - * @param check_ambiguity @see cmdline_parser_params.check_ambiguity - * @param override @see cmdline_parser_params.override - * @param no_free whether to free a possible previous value - * @param multiple_option whether this is a multiple option - * @param long_opt the corresponding long option - * @param short_opt the corresponding short option (or '-' if none) - * @param additional_error possible further error specification +/* + * we must include anything we need since this file is not thought to be + * inserted in a file already using getopt.h + * + * Lorenzo */ -static -int update_arg(void *field, char **orig_field, - unsigned int *field_given, unsigned int *prev_given, - char *value, char *possible_values[], const char *default_value, - cmdline_parser_arg_type arg_type, - int check_ambiguity, int override, - int no_free, int multiple_option, - const char *long_opt, char short_opt, - const char *additional_error) + +struct option { - char *stop_char = 0; - const char *val = value; - int found; - char **string_field; + const char *name; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; - stop_char = 0; - found = 0; +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ - if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) - { - if (short_opt != '-') - fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", - package_name, long_opt, short_opt, - (additional_error ? additional_error : "")); - else - fprintf (stderr, "%s: `--%s' option given more than once%s\n", - package_name, long_opt, - (additional_error ? additional_error : "")); - return 1; /* failure */ - } +static char *optarg; - - if (field_given && *field_given && ! override) - return 0; - if (prev_given) - (*prev_given)++; - if (field_given) - (*field_given)++; - if (possible_values) - val = possible_values[found]; - - switch(arg_type) { - case ARG_FLAG: - *((int *)field) = !*((int *)field); - break; - case ARG_INT: - if (val) *((int *)field) = strtol (val, &stop_char, 0); - break; - case ARG_STRING: - if (val) { - string_field = (char **)field; - if (!no_free && *string_field) - free (*string_field); /* free previous string */ - *string_field = gengetopt_strdup (val); - } - break; - default: - break; - }; - - /* check numeric conversion */ - switch(arg_type) { - case ARG_INT: - if (val && !(stop_char && *stop_char == '\0')) { - fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val); - return 1; /* failure */ - } - break; - default: - ; - }; - - /* store the original value */ - switch(arg_type) { - case ARG_NO: - case ARG_FLAG: - break; - default: - if (value && orig_field) { - if (no_free) { - *orig_field = value; - } else { - if (*orig_field) - free (*orig_field); /* free previous string */ - *orig_field = gengetopt_strdup (value); - } - } - }; +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +static int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +static int opterr; + +/* Set to an option character which was unrecognized. */ + +static int optopt; + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. +*/ +/* + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `custom_optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +/* Names for the values of the `has_arg' field of `struct option'. */ +#ifndef no_argument +#define no_argument 0 +#endif + +#ifndef required_argument +#define required_argument 1 +#endif + +#ifndef optional_argument +#define optional_argument 2 +#endif + +struct custom_getopt_data { + /* + * These have exactly the same meaning as the corresponding global variables, + * except that they are used for the reentrant versions of getopt. + */ + int custom_optind; + int custom_opterr; + int custom_optopt; + char *custom_optarg; + + /* True if the internal members have been initialized. */ + int initialized; + + /* + * The next char to be scanned in the option-element in which the last option + * character we returned was found. This allows us to pick up the scan where + * we left off. If this is zero, or a null string, it means resume the scan by + * advancing to the next ARGV-element. + */ + char *nextchar; + + /* + * Describe the part of ARGV that contains non-options that have been skipped. + * `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is + * the index after the last of them. + */ + int first_nonopt; + int last_nonopt; +}; - return 0; /* OK */ +/* + * the variables optarg, optind, opterr and optopt are renamed with + * the custom_ prefix so that they don't interfere with getopt ones. + * + * Moreover they're static so they are visible only from within the + * file where this very file will be included. + */ + +/* + * For communication from `custom_getopt' to the caller. When `custom_getopt' finds an + * option that takes an argument, the argument value is returned here. + */ +static char *custom_optarg; + +/* + * Index in ARGV of the next element to be scanned. This is used for + * communication to and from the caller and for communication between + * successive calls to `custom_getopt'. + * + * On entry to `custom_getopt', 1 means this is the first call; initialize. + * + * When `custom_getopt' returns -1, this is the index of the first of the non-option + * elements that the caller should itself scan. + * + * Otherwise, `custom_optind' communicates from one call to the next how much of ARGV + * has been scanned so far. + * + * 1003.2 says this must be 1 before any call. + */ +static int custom_optind = 1; + +/* + * Callers store zero here to inhibit the error message for unrecognized + * options. + */ +static int custom_opterr = 1; + +/* + * Set to an option character which was unrecognized. This must be initialized + * on some systems to avoid linking in the system's own getopt implementation. + */ +static int custom_optopt = '?'; + +/* + * Exchange two adjacent subsequences of ARGV. One subsequence is elements + * [first_nonopt,last_nonopt) which contains all the non-options that have been + * skipped so far. The other is elements [last_nonopt,custom_optind), which contains + * all the options processed since those non-options were skipped. + * `first_nonopt' and `last_nonopt' are relocated so that they describe the new + * indices of the non-options in ARGV after they are moved. + */ +static void exchange(char **argv, struct custom_getopt_data *d) +{ + int bottom = d->first_nonopt; + int middle = d->last_nonopt; + int top = d->custom_optind; + char *tem; + + /* + * Exchange the shorter segment with the far end of the longer segment. + * That puts the shorter segment into the right place. It leaves the + * longer segment in the right place overall, but it consists of two + * parts that need to be swapped next. + */ + while (top > middle && middle > bottom) { + if (top - middle > middle - bottom) { + /* Bottom segment is the short one. */ + int len = middle - bottom; + int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) { + tem = argv[bottom + i]; + argv[bottom + i] = + argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } else { + /* Top segment is the short one. */ + int len = top - middle; + int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + /* Update records for the slots the non-options now occupy. */ + d->first_nonopt += (d->custom_optind - d->last_nonopt); + d->last_nonopt = d->custom_optind; +} + +/* Initialize the internal data when the first call is made. */ +static void custom_getopt_initialize(struct custom_getopt_data *d) +{ + /* + * Start processing options with ARGV-element 1 (since ARGV-element 0 + * is the program name); the sequence of previously skipped non-option + * ARGV-elements is empty. + */ + d->first_nonopt = d->last_nonopt = d->custom_optind; + d->nextchar = NULL; + d->initialized = 1; +} + +#define NONOPTION_P (argv[d->custom_optind][0] != '-' || argv[d->custom_optind][1] == '\0') + +/* return: zero: continue, nonzero: return given value to user */ +static int shuffle_argv(int argc, char *const *argv,const struct option *longopts, + struct custom_getopt_data *d) +{ + /* + * Give FIRST_NONOPT & LAST_NONOPT rational values if CUSTOM_OPTIND has been + * moved back by the user (who may also have changed the arguments). + */ + if (d->last_nonopt > d->custom_optind) + d->last_nonopt = d->custom_optind; + if (d->first_nonopt > d->custom_optind) + d->first_nonopt = d->custom_optind; + /* + * If we have just processed some options following some + * non-options, exchange them so that the options come first. + */ + if (d->first_nonopt != d->last_nonopt && + d->last_nonopt != d->custom_optind) + exchange((char **) argv, d); + else if (d->last_nonopt != d->custom_optind) + d->first_nonopt = d->custom_optind; + /* + * Skip any additional non-options and extend the range of + * non-options previously skipped. + */ + while (d->custom_optind < argc && NONOPTION_P) + d->custom_optind++; + d->last_nonopt = d->custom_optind; + /* + * The special ARGV-element `--' means premature end of options. Skip + * it like a null option, then exchange with previous non-options as if + * it were an option, then skip everything else like a non-option. + */ + if (d->custom_optind != argc && !strcmp(argv[d->custom_optind], "--")) { + d->custom_optind++; + if (d->first_nonopt != d->last_nonopt + && d->last_nonopt != d->custom_optind) + exchange((char **) argv, d); + else if (d->first_nonopt == d->last_nonopt) + d->first_nonopt = d->custom_optind; + d->last_nonopt = argc; + d->custom_optind = argc; + } + /* + * If we have done all the ARGV-elements, stop the scan and back over + * any non-options that we skipped and permuted. + */ + if (d->custom_optind == argc) { + /* + * Set the next-arg-index to point at the non-options that we + * previously skipped, so the caller will digest them. + */ + if (d->first_nonopt != d->last_nonopt) + d->custom_optind = d->first_nonopt; + return -1; + } + /* + * If we have come to a non-option and did not permute it, either stop + * the scan or describe it to the caller and pass it by. + */ + if (NONOPTION_P) { + d->custom_optarg = argv[d->custom_optind++]; + return 1; + } + /* + * We have found another option-ARGV-element. Skip the initial + * punctuation. + */ + d->nextchar = (argv[d->custom_optind] + 1 + (longopts != NULL && argv[d->custom_optind][1] == '-')); + return 0; +} + +/* + * Check whether the ARGV-element is a long option. + * + * If there's a long option "fubar" and the ARGV-element is "-fu", consider + * that an abbreviation of the long option, just like "--fu", and not "-f" with + * arg "u". + * + * This distinction seems to be the most useful approach. + * + */ +static int check_long_opt(int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind, + int print_errors, struct custom_getopt_data *d) +{ + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = d->nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match or abbreviated matches */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp(p->name, d->nextchar, nameend - d->nextchar)) { + if ((unsigned int) (nameend - d->nextchar) + == (unsigned int) strlen(p->name)) { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } else if (pfound == NULL) { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } else if (pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) { + if (print_errors) { + fprintf(stderr, + "%s: option `%s' is ambiguous\n", + argv[0], argv[d->custom_optind]); + } + d->nextchar += strlen(d->nextchar); + d->custom_optind++; + d->custom_optopt = 0; + return '?'; + } + if (pfound) { + option_index = indfound; + d->custom_optind++; + if (*nameend) { + if (pfound->has_arg != no_argument) + d->custom_optarg = nameend + 1; + else { + if (print_errors) { + if (argv[d->custom_optind - 1][1] == '-') { + /* --option */ + fprintf(stderr, "%s: option `--%s' doesn't allow an argument\n", + argv[0], pfound->name); + } else { + /* +option or -option */ + fprintf(stderr, "%s: option `%c%s' doesn't allow an argument\n", + argv[0], argv[d->custom_optind - 1][0], pfound->name); + } + + } + d->nextchar += strlen(d->nextchar); + d->custom_optopt = pfound->val; + return '?'; + } + } else if (pfound->has_arg == required_argument) { + if (d->custom_optind < argc) + d->custom_optarg = argv[d->custom_optind++]; + else { + if (print_errors) { + fprintf(stderr, + "%s: option `%s' requires an argument\n", + argv[0], + argv[d->custom_optind - 1]); + } + d->nextchar += strlen(d->nextchar); + d->custom_optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + d->nextchar += strlen(d->nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + /* + * Can't find it as a long option. If this is not getopt_long_only, or + * the option starts with '--' or is not a valid short option, then + * it's an error. Otherwise interpret it as a short option. + */ + if (print_errors) { + if (argv[d->custom_optind][1] == '-') { + /* --option */ + fprintf(stderr, + "%s: unrecognized option `--%s'\n", + argv[0], d->nextchar); + } else { + /* +option or -option */ + fprintf(stderr, + "%s: unrecognized option `%c%s'\n", + argv[0], argv[d->custom_optind][0], + d->nextchar); + } + } + d->nextchar = (char *) ""; + d->custom_optind++; + d->custom_optopt = 0; + return '?'; } +static int check_short_opt(int argc, char *const *argv, const char *optstring, + int print_errors, struct custom_getopt_data *d) +{ + char c = *d->nextchar++; + char *temp = strchr(optstring, c); + + /* Increment `custom_optind' when we start to process its last character. */ + if (*d->nextchar == '\0') + ++d->custom_optind; + if (!temp || c == ':') { + if (print_errors) + fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); + + d->custom_optopt = c; + return '?'; + } + if (temp[1] == ':') { + if (temp[2] == ':') { + /* This is an option that accepts an argument optionally. */ + if (*d->nextchar != '\0') { + d->custom_optarg = d->nextchar; + d->custom_optind++; + } else + d->custom_optarg = NULL; + d->nextchar = NULL; + } else { + /* This is an option that requires an argument. */ + if (*d->nextchar != '\0') { + d->custom_optarg = d->nextchar; + /* + * If we end this ARGV-element by taking the + * rest as an arg, we must advance to the next + * element now. + */ + d->custom_optind++; + } else if (d->custom_optind == argc) { + if (print_errors) { + fprintf(stderr, + "%s: option requires an argument -- %c\n", + argv[0], c); + } + d->custom_optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } else + /* + * We already incremented `custom_optind' once; + * increment it again when taking next ARGV-elt + * as argument. + */ + d->custom_optarg = argv[d->custom_optind++]; + d->nextchar = NULL; + } + } + return c; +} + +/* + * Scan elements of ARGV for option characters given in OPTSTRING. + * + * If an element of ARGV starts with '-', and is not exactly "-" or "--", + * then it is an option element. The characters of this element + * (aside from the initial '-') are option characters. If `getopt' + * is called repeatedly, it returns successively each of the option characters + * from each of the option elements. + * + * If `getopt' finds another option character, it returns that character, + * updating `custom_optind' and `nextchar' so that the next call to `getopt' can + * resume the scan with the following option character or ARGV-element. + * + * If there are no more option characters, `getopt' returns -1. + * Then `custom_optind' is the index in ARGV of the first ARGV-element + * that is not an option. (The ARGV-elements have been permuted + * so that those that are not options now come last.) + * + * OPTSTRING is a string containing the legitimate option characters. + * If an option character is seen that is not listed in OPTSTRING, + * return '?' after printing an error message. If you set `custom_opterr' to + * zero, the error message is suppressed but we still return '?'. + * + * If a char in OPTSTRING is followed by a colon, that means it wants an arg, + * so the following text in the same ARGV-element, or the text of the following + * ARGV-element, is returned in `custom_optarg'. Two colons mean an option that + * wants an optional arg; if there is text in the current ARGV-element, + * it is returned in `custom_optarg', otherwise `custom_optarg' is set to zero. + * + * If OPTSTRING starts with `-' or `+', it requests different methods of + * handling the non-option ARGV-elements. + * See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + * + * Long-named options begin with `--' instead of `-'. + * Their names may be abbreviated as long as the abbreviation is unique + * or is an exact match for some defined option. If they have an + * argument, it follows the option name in the same ARGV-element, separated + * from the option name by a `=', or else the in next ARGV-element. + * When `getopt' finds a long-named option, it returns 0 if that option's + * `flag' field is nonzero, the value of the option's `val' field + * if the `flag' field is zero. + * + * The elements of ARGV aren't really const, because we permute them. + * But we pretend they're const in the prototype to be compatible + * with other systems. + * + * LONGOPTS is a vector of `struct option' terminated by an + * element containing a name which is zero. + * + * LONGIND returns the index in LONGOPT of the long-named option found. + * It is only valid when a long-named option has been found by the most + * recent call. + * + * Return the option character from OPTS just read. Return -1 when there are + * no more options. For unrecognized options, or options missing arguments, + * `custom_optopt' is set to the option letter, and '?' is returned. + * + * The OPTS string is a list of characters which are recognized option letters, + * optionally followed by colons, specifying that that letter takes an + * argument, to be placed in `custom_optarg'. + * + * If a letter in OPTS is followed by two colons, its argument is optional. + * This behavior is specific to the GNU `getopt'. + * + * The argument `--' causes premature termination of argument scanning, + * explicitly telling `getopt' that there are no more options. If OPTS begins + * with `--', then non-option arguments are treated as arguments to the option + * '\0'. This behavior is specific to the GNU `getopt'. + */ + +static int getopt_internal_r(int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind, + struct custom_getopt_data *d) +{ + int ret, print_errors = d->custom_opterr; + + if (optstring[0] == ':') + print_errors = 0; + if (argc < 1) + return -1; + d->custom_optarg = NULL; + + /* + * This is a big difference with GNU getopt, since optind == 0 + * means initialization while here 1 means first call. + */ + if (d->custom_optind == 0 || !d->initialized) { + if (d->custom_optind == 0) + d->custom_optind = 1; /* Don't scan ARGV[0], the program name. */ + custom_getopt_initialize(d); + } + if (d->nextchar == NULL || *d->nextchar == '\0') { + ret = shuffle_argv(argc, argv, longopts, d); + if (ret) + return ret; + } + if (longopts && (argv[d->custom_optind][1] == '-' )) + return check_long_opt(argc, argv, optstring, longopts, + longind, print_errors, d); + return check_short_opt(argc, argv, optstring, print_errors, d); +} + +static int custom_getopt_internal(int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind) +{ + int result; + /* Keep a global copy of all internal members of d */ + static struct custom_getopt_data d; + + d.custom_optind = custom_optind; + d.custom_opterr = custom_opterr; + result = getopt_internal_r(argc, argv, optstring, longopts, + longind, &d); + custom_optind = d.custom_optind; + custom_optarg = d.custom_optarg; + custom_optopt = d.custom_optopt; + return result; +} + +static int custom_getopt_long (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return custom_getopt_internal(argc, argv, options, long_options, + opt_index); +} int -cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params, const char *additional_error) +cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required, const char *additional_error) { int c; /* Character of the parsed option. */ int error = 0; struct gengetopt_args_info local_args_info; - - int override; - int initialize; - int check_required; - int check_ambiguity; - - package_name = argv[0]; - - override = params->override; - initialize = params->initialize; - check_required = params->check_required; - check_ambiguity = params->check_ambiguity; if (initialize) cmdline_parser_init (args_info); @@ -533,12 +945,13 @@ cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_inf optarg = 0; optind = 0; - opterr = params->print_errors; + opterr = 1; optopt = '?'; while (1) { int option_index = 0; + char *stop_char; static struct option long_options[] = { { "help", 0, NULL, 'h' }, @@ -552,7 +965,18 @@ cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_inf { NULL, 0, NULL, 0 } }; - c = getopt_long (argc, argv, "hVpf:d:rv:D:", long_options, &option_index); + stop_char = 0; + custom_optarg = optarg; + custom_optind = optind; + custom_opterr = opterr; + custom_optopt = optopt; + + c = custom_getopt_long (argc, argv, "hVpf:d:rv:D:", long_options, &option_index); + + optarg = custom_optarg; + optind = custom_optind; + opterr = custom_opterr; + optopt = custom_optopt; if (c == -1) break; /* Exit from `while (1)' loop. */ @@ -569,74 +993,108 @@ cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_inf exit (EXIT_SUCCESS); case 'p': /* Prints the local database tree. */ - - - if (update_arg((void *)&(args_info->print_flag), 0, &(args_info->print_given), - &(local_args_info.print_given), optarg, 0, 0, ARG_FLAG, - check_ambiguity, override, 1, 0, "print", 'p', - additional_error)) - goto failure; - + if (local_args_info.print_given) + { + fprintf (stderr, "%s: `--print' (`-p') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->print_given && ! override) + continue; + local_args_info.print_given = 1; + args_info->print_given = 1; + args_info->print_flag = !(args_info->print_flag); break; + case 'f': /* Adds the file to local database. */ - - - if (update_arg( (void *)&(args_info->file_arg), - &(args_info->file_orig), &(args_info->file_given), - &(local_args_info.file_given), optarg, 0, 0, ARG_STRING, - check_ambiguity, override, 0, 0, - "file", 'f', - additional_error)) - goto failure; - + if (local_args_info.file_given) + { + fprintf (stderr, "%s: `--file' (`-f') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->file_given && ! override) + continue; + local_args_info.file_given = 1; + args_info->file_given = 1; + if (args_info->file_arg) + free (args_info->file_arg); /* free previous string */ + args_info->file_arg = gengetopt_strdup (optarg); + if (args_info->file_orig) + free (args_info->file_orig); /* free previous string */ + args_info->file_orig = gengetopt_strdup (optarg); break; + case 'd': /* Adds the directory to local database. */ - - - if (update_arg( (void *)&(args_info->dir_arg), - &(args_info->dir_orig), &(args_info->dir_given), - &(local_args_info.dir_given), optarg, 0, 0, ARG_STRING, - check_ambiguity, override, 0, 0, - "dir", 'd', - additional_error)) - goto failure; - + if (local_args_info.dir_given) + { + fprintf (stderr, "%s: `--dir' (`-d') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->dir_given && ! override) + continue; + local_args_info.dir_given = 1; + args_info->dir_given = 1; + if (args_info->dir_arg) + free (args_info->dir_arg); /* free previous string */ + args_info->dir_arg = gengetopt_strdup (optarg); + if (args_info->dir_orig) + free (args_info->dir_orig); /* free previous string */ + args_info->dir_orig = gengetopt_strdup (optarg); break; + case 'r': /* Recurse into sub-directories. */ - - - if (update_arg((void *)&(args_info->recurse_flag), 0, &(args_info->recurse_given), - &(local_args_info.recurse_given), optarg, 0, 0, ARG_FLAG, - check_ambiguity, override, 1, 0, "recurse", 'r', - additional_error)) - goto failure; - + if (local_args_info.recurse_given) + { + fprintf (stderr, "%s: `--recurse' (`-r') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->recurse_given && ! override) + continue; + local_args_info.recurse_given = 1; + args_info->recurse_given = 1; + args_info->recurse_flag = !(args_info->recurse_flag); break; + case 'v': /* Verbosity level. */ - - - if (update_arg( (void *)&(args_info->verbose_arg), - &(args_info->verbose_orig), &(args_info->verbose_given), - &(local_args_info.verbose_given), optarg, 0, "1", ARG_INT, - check_ambiguity, override, 0, 0, - "verbose", 'v', - additional_error)) + if (local_args_info.verbose_given) + { + fprintf (stderr, "%s: `--verbose' (`-v') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->verbose_given && ! override) + continue; + local_args_info.verbose_given = 1; + args_info->verbose_given = 1; + args_info->verbose_arg = strtol (optarg, &stop_char, 0); + if (!(stop_char && *stop_char == '\0')) { + fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg); goto failure; - + } + if (args_info->verbose_orig) + free (args_info->verbose_orig); /* free previous string */ + args_info->verbose_orig = gengetopt_strdup (optarg); break; + case 'D': /* Debug messages level. */ - - - if (update_arg( (void *)&(args_info->debug_arg), - &(args_info->debug_orig), &(args_info->debug_given), - &(local_args_info.debug_given), optarg, 0, "0", ARG_INT, - check_ambiguity, override, 0, 0, - "debug", 'D', - additional_error)) + if (local_args_info.debug_given) + { + fprintf (stderr, "%s: `--debug' (`-D') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; + } + if (args_info->debug_given && ! override) + continue; + local_args_info.debug_given = 1; + args_info->debug_given = 1; + args_info->debug_arg = strtol (optarg, &stop_char, 0); + if (!(stop_char && *stop_char == '\0')) { + fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg); goto failure; - + } + if (args_info->debug_orig) + free (args_info->debug_orig); /* free previous string */ + args_info->debug_orig = gengetopt_strdup (optarg); break; + case 0: /* Long option with no short option */ case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ @@ -660,30 +1118,6 @@ cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_inf if ( error ) return (EXIT_FAILURE); - if (optind < argc) - { - int i = 0 ; - int found_prog_name = 0; - /* whether program name, i.e., argv[0], is in the remaining args - (this may happen with some implementations of getopt, - but surely not with the one included by gengetopt) */ - - i = optind; - while (i < argc) - if (argv[i++] == argv[0]) { - found_prog_name = 1; - break; - } - i = 0; - - args_info->inputs_num = argc - optind - found_prog_name; - args_info->inputs = - (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; - while (optind < argc) - if (argv[optind++] != argv[0]) - args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ; - } - return 0; failure: @@ -691,215 +1125,3 @@ failure: cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); } - -#ifndef CONFIG_FILE_LINE_SIZE -#define CONFIG_FILE_LINE_SIZE 2048 -#endif -#define ADDITIONAL_ERROR " in configuration file " - -#define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3) -/* 3 is for "--" and "=" */ - -static int -_cmdline_parser_configfile (char * const filename, int *my_argc) -{ - FILE* file; - char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1]; - char linebuf[CONFIG_FILE_LINE_SIZE]; - int line_num = 0; - int result = 0, equal; - char *fopt, *farg; - char *str_index; - size_t len, next_token; - char delimiter; - - if ((file = fopen(filename, "r")) == NULL) - { - fprintf (stderr, "%s: Error opening configuration file '%s'\n", - CMDLINE_PARSER_PACKAGE, filename); - return EXIT_FAILURE; - } - - while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL) - { - ++line_num; - my_argv[0] = '\0'; - len = strlen(linebuf); - if (len > (CONFIG_FILE_LINE_BUFFER_SIZE-1)) - { - fprintf (stderr, "%s:%s:%d: Line too long in configuration file\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - result = EXIT_FAILURE; - break; - } - - /* find first non-whitespace character in the line */ - next_token = strspn (linebuf, " \t\r\n"); - str_index = linebuf + next_token; - - if ( str_index[0] == '\0' || str_index[0] == '#') - continue; /* empty line or comment line is skipped */ - - fopt = str_index; - - /* truncate fopt at the end of the first non-valid character */ - next_token = strcspn (fopt, " \t\r\n="); - - if (fopt[next_token] == '\0') /* the line is over */ - { - farg = NULL; - equal = 0; - goto noarg; - } - - /* remember if equal sign is present */ - equal = (fopt[next_token] == '='); - fopt[next_token++] = '\0'; - - /* advance pointers to the next token after the end of fopt */ - next_token += strspn (fopt + next_token, " \t\r\n"); - - /* check for the presence of equal sign, and if so, skip it */ - if ( !equal ) - if ((equal = (fopt[next_token] == '='))) - { - next_token++; - next_token += strspn (fopt + next_token, " \t\r\n"); - } - str_index += next_token; - - /* find argument */ - farg = str_index; - if ( farg[0] == '\"' || farg[0] == '\'' ) - { /* quoted argument */ - str_index = strchr (++farg, str_index[0] ); /* skip opening quote */ - if (! str_index) - { - fprintf - (stderr, - "%s:%s:%d: unterminated string in configuration file\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - result = EXIT_FAILURE; - break; - } - } - else - { /* read up the remaining part up to a delimiter */ - next_token = strcspn (farg, " \t\r\n#\'\""); - str_index += next_token; - } - - /* truncate farg at the delimiter and store it for further check */ - delimiter = *str_index, *str_index++ = '\0'; - - /* everything but comment is illegal at the end of line */ - if (delimiter != '\0' && delimiter != '#') - { - str_index += strspn(str_index, " \t\r\n"); - if (*str_index != '\0' && *str_index != '#') - { - fprintf - (stderr, - "%s:%s:%d: malformed string in configuration file\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - result = EXIT_FAILURE; - break; - } - } - - noarg: - if (!strcmp(fopt,"include")) { - if (farg && *farg) { - result = _cmdline_parser_configfile(farg, my_argc); - } else { - fprintf(stderr, "%s:%s:%d: include requires a filename argument.\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - } - continue; - } - len = strlen(fopt); - strcat (my_argv, len > 1 ? "--" : "-"); - strcat (my_argv, fopt); - if (len > 1 && ((farg && *farg) || equal)) - strcat (my_argv, "="); - if (farg && *farg) - strcat (my_argv, farg); - ++(*my_argc); - - cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list)); - cmd_line_list_tmp->next = cmd_line_list; - cmd_line_list = cmd_line_list_tmp; - cmd_line_list->string_arg = gengetopt_strdup(my_argv); - } /* while */ - - if (file) - fclose(file); - return result; -} - -int -cmdline_parser_configfile (char * const filename, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required) -{ - struct cmdline_parser_params params; - - params.override = override; - params.initialize = initialize; - params.check_required = check_required; - params.check_ambiguity = 0; - params.print_errors = 1; - - return cmdline_parser_config_file (filename, args_info, ¶ms); -} - -int -cmdline_parser_config_file (char * const filename, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params) -{ - int i, result; - int my_argc = 1; - char **my_argv_arg; - char *additional_error; - - /* store the program name */ - cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list)); - cmd_line_list_tmp->next = cmd_line_list; - cmd_line_list = cmd_line_list_tmp; - cmd_line_list->string_arg = gengetopt_strdup (CMDLINE_PARSER_PACKAGE); - - result = _cmdline_parser_configfile(filename, &my_argc); - - if (result != EXIT_FAILURE) { - my_argv_arg = (char **) malloc((my_argc+1) * sizeof(char *)); - cmd_line_list_tmp = cmd_line_list; - - for (i = my_argc - 1; i >= 0; --i) { - my_argv_arg[i] = cmd_line_list_tmp->string_arg; - cmd_line_list_tmp = cmd_line_list_tmp->next; - } - - my_argv_arg[my_argc] = 0; - - additional_error = (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1); - strcpy (additional_error, ADDITIONAL_ERROR); - strcat (additional_error, filename); - result = - cmdline_parser_internal (my_argc, my_argv_arg, args_info, - params, - additional_error); - - free (additional_error); - free (my_argv_arg); - } - - free_cmd_list(); - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} diff --git a/appli/gimmick/gimmick_ggo.h b/appli/gimmick/gimmick_ggo.h index f788976..c9f2443 100644 --- a/appli/gimmick/gimmick_ggo.h +++ b/appli/gimmick/gimmick_ggo.h @@ -1,9 +1,6 @@ -/** @file gimmick_ggo.h - * @brief The header file for the command line option parser - * generated by GNU Gengetopt version 2.22 - * http://www.gnu.org/software/gengetopt. - * DO NOT modify this file, since it can be overwritten - * @author GNU Gengetopt by Lorenzo Bettini */ +/* gimmick_ggo.h */ + +/* File autogenerated by gengetopt version 2.20 */ #ifndef GIMMICK_GGO_H #define GIMMICK_GGO_H @@ -13,198 +10,68 @@ #include "config.h" #endif -#include /* for FILE */ - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifndef CMDLINE_PARSER_PACKAGE -/** @brief the program name */ #define CMDLINE_PARSER_PACKAGE "gimmick" #endif #ifndef CMDLINE_PARSER_VERSION -/** @brief the program version */ #define CMDLINE_PARSER_VERSION "0.1.0" #endif -/** @brief Where the command line options are stored */ struct gengetopt_args_info { - const char *help_help; /**< @brief Print help and exit help description. */ - const char *version_help; /**< @brief Print version and exit help description. */ - int print_flag; /**< @brief Prints the local database tree (default=off). */ - const char *print_help; /**< @brief Prints the local database tree help description. */ - char * file_arg; /**< @brief Adds the file to local database. */ - char * file_orig; /**< @brief Adds the file to local database original value given at command line. */ - const char *file_help; /**< @brief Adds the file to local database help description. */ - char * dir_arg; /**< @brief Adds the directory to local database. */ - char * dir_orig; /**< @brief Adds the directory to local database original value given at command line. */ - const char *dir_help; /**< @brief Adds the directory to local database help description. */ - int recurse_flag; /**< @brief Recurse into sub-directories (default=off). */ - const char *recurse_help; /**< @brief Recurse into sub-directories help description. */ - int verbose_arg; /**< @brief Verbosity level (default='1'). */ - char * verbose_orig; /**< @brief Verbosity level original value given at command line. */ - const char *verbose_help; /**< @brief Verbosity level help description. */ - int debug_arg; /**< @brief Debug messages level (default='0'). */ - char * debug_orig; /**< @brief Debug messages level original value given at command line. */ - const char *debug_help; /**< @brief Debug messages level help description. */ + const char *help_help; /* Print help and exit help description. */ + const char *version_help; /* Print version and exit help description. */ + int print_flag; /* Prints the local database tree (default=off). */ + const char *print_help; /* Prints the local database tree help description. */ + char * file_arg; /* Adds the file to local database. */ + char * file_orig; /* Adds the file to local database original value given at command line. */ + const char *file_help; /* Adds the file to local database help description. */ + char * dir_arg; /* Adds the directory to local database. */ + char * dir_orig; /* Adds the directory to local database original value given at command line. */ + const char *dir_help; /* Adds the directory to local database help description. */ + int recurse_flag; /* Recurse into sub-directories (default=off). */ + const char *recurse_help; /* Recurse into sub-directories help description. */ + int verbose_arg; /* Verbosity level (default='1'). */ + char * verbose_orig; /* Verbosity level original value given at command line. */ + const char *verbose_help; /* Verbosity level help description. */ + int debug_arg; /* Debug messages level (default='0'). */ + char * debug_orig; /* Debug messages level original value given at command line. */ + const char *debug_help; /* Debug messages level help description. */ - unsigned int help_given ; /**< @brief Whether help was given. */ - unsigned int version_given ; /**< @brief Whether version was given. */ - unsigned int print_given ; /**< @brief Whether print was given. */ - unsigned int file_given ; /**< @brief Whether file was given. */ - unsigned int dir_given ; /**< @brief Whether dir was given. */ - unsigned int recurse_given ; /**< @brief Whether recurse was given. */ - unsigned int verbose_given ; /**< @brief Whether verbose was given. */ - unsigned int debug_given ; /**< @brief Whether debug was given. */ + int help_given ; /* Whether help was given. */ + int version_given ; /* Whether version was given. */ + int print_given ; /* Whether print was given. */ + int file_given ; /* Whether file was given. */ + int dir_given ; /* Whether dir was given. */ + int recurse_given ; /* Whether recurse was given. */ + int verbose_given ; /* Whether verbose was given. */ + int debug_given ; /* Whether debug was given. */ - char **inputs ; /**< @brief unamed options (options without names) */ - unsigned inputs_num ; /**< @brief unamed options number */ -} ; - -/** @brief The additional parameters to pass to parser functions */ -struct cmdline_parser_params -{ - int override; /**< @brief whether to override possibly already present options (default 0) */ - int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ - int check_required; /**< @brief whether to check that all required options were provided (default 1) */ - int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ - int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ } ; -/** @brief the purpose string of the program */ extern const char *gengetopt_args_info_purpose; -/** @brief the usage string of the program */ extern const char *gengetopt_args_info_usage; -/** @brief all the lines making the help output */ extern const char *gengetopt_args_info_help[]; -/** - * The command line parser - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @return 0 if everything went fine, NON 0 if an error took place - */ int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info); - -/** - * The command line parser (version with additional parameters - deprecated) - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @param override whether to override possibly already present options - * @param initialize whether to initialize the option structure my_args_info - * @param check_required whether to check that all required options were provided - * @return 0 if everything went fine, NON 0 if an error took place - * @deprecated use cmdline_parser_ext() instead - */ int cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required); - -/** - * The command line parser (version with additional parameters) - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @param params additional parameters for the parser - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_ext (int argc, char * const *argv, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params); - -/** - * Save the contents of the option struct into an already open FILE stream. - * @param outfile the stream where to dump options - * @param args_info the option struct to dump - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_dump(FILE *outfile, - struct gengetopt_args_info *args_info); - -/** - * Save the contents of the option struct into a (text) file. - * This file can be read by the config file parser (if generated by gengetopt) - * @param filename the file where to save - * @param args_info the option struct to save - * @return 0 if everything went fine, NON 0 if an error took place - */ int cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info); -/** - * Print the help - */ void cmdline_parser_print_help(void); -/** - * Print the version - */ void cmdline_parser_print_version(void); -/** - * Initializes all the fields a cmdline_parser_params structure - * to their default values - * @param params the structure to initialize - */ -void cmdline_parser_params_init(struct cmdline_parser_params *params); - -/** - * Allocates dynamically a cmdline_parser_params structure and initializes - * all its fields to their default values - * @return the created and initialized cmdline_parser_params structure - */ -struct cmdline_parser_params *cmdline_parser_params_create(void); - -/** - * Initializes the passed gengetopt_args_info structure's fields - * (also set default values for options that have a default) - * @param args_info the structure to initialize - */ void cmdline_parser_init (struct gengetopt_args_info *args_info); -/** - * Deallocates the string fields of the gengetopt_args_info structure - * (but does not deallocate the structure itself) - * @param args_info the structure to deallocate - */ void cmdline_parser_free (struct gengetopt_args_info *args_info); -/** - * The config file parser (deprecated version) - * @param filename the name of the config file - * @param args_info the structure where option information will be stored - * @param override whether to override possibly already present options - * @param initialize whether to initialize the option structure my_args_info - * @param check_required whether to check that all required options were provided - * @return 0 if everything went fine, NON 0 if an error took place - * @deprecated use cmdline_parser_config_file() instead - */ -int cmdline_parser_configfile (char * const filename, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required); - -/** - * The config file parser - * @param filename the name of the config file - * @param args_info the structure where option information will be stored - * @param params additional parameters for the parser - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_config_file (char * const filename, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params); - -/** - * Checks that all the required options were specified - * @param args_info the structure to check - * @param prog_name the name of the program that will be used to print - * possible errors - * @return - */ int cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name); diff --git a/src2/creaImageIOWxGimmickView.cpp b/src2/creaImageIOWxGimmickView.cpp index aee84ab..7e79bc3 100644 --- a/src2/creaImageIOWxGimmickView.cpp +++ b/src2/creaImageIOWxGimmickView.cpp @@ -1,7 +1,7 @@ #include #include #include - +using namespace crea; // Icons #include "icons/accept.xpm" #include "icons/add.xpm" @@ -87,6 +87,9 @@ namespace creaImageIO mNotebook = new wxNotebook(mSplitter, -1,wxDefaultPosition, wxDefaultSize, 0); + //Gimmick + mGimmick=gimmick; + // Create the views CreateTreeViews(); @@ -216,9 +219,66 @@ namespace creaImageIO } } } + + //================================================= + void WxGimmickView::OnAddFile(wxCommandEvent& event) + { + long style = wxOPEN | wxFILE_MUST_EXIST | wxFD_MULTIPLE; + std::string wc("*.*"); + wxFileDialog* FD = new wxFileDialog( 0, + _T("Select file"), + "", + _T(""), + std2wx(wc), + style, + wxDefaultPosition); + + if (FD->ShowModal()==wxID_OK) + { + wxArrayString files; + FD->GetPaths(files); + unsigned int i; + std::vector filenames; + for (i=0;iGetItemData(mItemOfMenu); + DicomDatabase* db = data->GetDicomNode()->GetDicomDatabase(); + DicomDatabase::UpdateSummary summary; + wxProgressDialog* progress = + new wxProgressDialog(_T("Adding file(s)"), + _T(""), + 1000, + this, + wxPD_ELAPSED_TIME | + wxPD_ESTIMATED_TIME | + wxPD_REMAINING_TIME | + wxPD_CAN_ABORT ); + + db->AddFiles(filenames,progress,summary); + + progress->Pulse(_T("Updating view...")); + UpdateDicomDatabaseView(db); + delete progress; + DisplayUpdateSummary(summary,this); + */ + } + + } + //================================================= + BEGIN_EVENT_TABLE(WxGimmickView, wxPanel) + EVT_TOOL(TOOL_ADDFILE_ID, WxGimmickView::OnAddFile) + END_EVENT_TABLE() } // EO namespace creaImageIO diff --git a/src2/creaImageIOWxGimmickView.h b/src2/creaImageIOWxGimmickView.h index 4c0775b..a7f78e1 100644 --- a/src2/creaImageIOWxGimmickView.h +++ b/src2/creaImageIOWxGimmickView.h @@ -60,6 +60,12 @@ namespace creaImageIO wxImageList * mIcon; void CreateIconList(); + Gimmick * mGimmick; + /// Callback for adding a file + void OnAddFile(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() + }; // EO class WxGimmickView //=====================================================================