From: caballero Date: Wed, 8 Apr 2009 14:46:34 +0000 (+0000) Subject: Changed getopt dependency to boost program_options. X-Git-Tag: EED.02Oct2009~112 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=388889590eb9b32ded2d830fc7c8d2ab4ca44e83;p=creaImageIO.git Changed getopt dependency to boost program_options. --- diff --git a/appli/gimmick/CMakeLists.txt b/appli/gimmick/CMakeLists.txt index b39fa9e..21e988d 100644 --- a/appli/gimmick/CMakeLists.txt +++ b/appli/gimmick/CMakeLists.txt @@ -1,35 +1,5 @@ -#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}) - - FOREACH(GGO_FILE ${ALL_GGO_FILES}) - #MESSAGE(input=${GGO_FILE}) - STRING(REGEX REPLACE "(.*).ggo" - "\\1" GGO_BASENAME - "${GGO_FILE}") - #MESSAGE( base= ${GGO_BASENAME}) - SET(GGO_H ${GGO_BASENAME}_ggo.h) - #MESSAGE(${GGO_H}) - SET(GGO_C ${GGO_BASENAME}_ggo.c) - #MESSAGE(${GGO_C}) - SET(GGO_OUTPUT ${GGO_H} ${GGO_C}) - ADD_CUSTOM_COMMAND(OUTPUT ${GGO_OUTPUT} - COMMAND ${GENGETOPT} - ARGS < ${GGO_FILE} --file-name=${GGO_BASENAME}_ggo -u --conf-parser - DEPENDS ${GGO_FILE} - ) - ENDFOREACH(GGO_FILE) -#========================================================= -#ENDIF(GGO) - INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -SET(SOURCES main gimmick_ggo.c) +SET(SOURCES main) IF(WIN32) ADD_EXECUTABLE(gimmick ${SOURCES}) diff --git a/appli/gimmick/getopt.h b/appli/gimmick/getopt.h deleted file mode 100644 index b7a026c..0000000 --- a/appli/gimmick/getopt.h +++ /dev/null @@ -1,177 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989-1994,1996-1999,2001,2003,2004 - Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#ifndef _GETOPT_H - -#ifndef __need_getopt -# define _GETOPT_H 1 -#endif - -/* If __GNU_LIBRARY__ is not already defined, either we are being used - standalone, or this is the first header included in the source file. - If we are being used with glibc, we need to include , but - that does not exist if we are standalone. So: if __GNU_LIBRARY__ is - not defined, include , which will pull in for us - if it's from glibc. (Why ctype.h? It's guaranteed to exist and it - doesn't flood the namespace with stuff the way some other headers do.) */ -#if !defined __GNU_LIBRARY__ -# include -#endif - -#ifndef __THROW -# ifndef __GNUC_PREREQ -# define __GNUC_PREREQ(maj, min) (0) -# endif -# if defined __cplusplus && __GNUC_PREREQ (2,8) -# define __THROW throw () -# else -# define __THROW -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* 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. */ - -extern char *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 `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. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -#ifndef __need_getopt -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - 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 `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. */ - -struct option -{ - 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; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -# define no_argument 0 -# define required_argument 1 -# define optional_argument 2 -#endif /* need getopt */ - - -/* Get definitions and prototypes for functions to process the - arguments in ARGV (ARGC of them, minus the program name) for - options given in OPTS. - - Return the option character from OPTS just read. Return -1 when - there are no more options. For unrecognized options, or options - missing arguments, `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 `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'. */ - -#ifdef __GNU_LIBRARY__ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) - __THROW; -#else /* not __GNU_LIBRARY__ */ -extern int getopt (); -#endif /* __GNU_LIBRARY__ */ - -#ifndef __need_getopt -extern int getopt_long (int ___argc, char *const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind) - __THROW; -extern int getopt_long_only (int ___argc, char *const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind) - __THROW; - -#endif - -#ifdef __cplusplus -} -#endif - -/* Make sure we later can get all the definitions and declarations. */ -#undef __need_getopt - -#endif /* getopt.h */ diff --git a/appli/gimmick/gimmick.ggo b/appli/gimmick/gimmick.ggo deleted file mode 100644 index f698d5b..0000000 --- a/appli/gimmick/gimmick.ggo +++ /dev/null @@ -1,39 +0,0 @@ -# file gimmick.ggo -package "gimmick" -version "0.1.0" -purpose "" -description "" -usage "gimmick COMMAND [OPTIONS]" - -section "COMMANDS" -option "print" p "Prints the local database tree" flag off -option "file" f "Adds the file to local database" typestr="" string optional -option "dir" d "Adds the directory to local database" typestr="" string optional -option "recurse" r "Recurse into sub-directories" flag off dependon="dir" - -section "OPTIONS" -option "verbose" v "Verbosity level" int default="1" optional -option "debug" D "Debug messages level" int default="0" optional - -#package "" -# version "" -# purpose "" -# usage "" -# description "" - -# args "" - -# option "" -# {details=""} -# {argtype} {typestr=""} -# {values="","",...} -# {default=""} -# {dependon=""} -# {required} {argoptional} {multiple} -# {hidden} - -# option "" flag - -# section "section name" {sectiondesc="optional section description"} - -# text "a textual sentence" diff --git a/appli/gimmick/gimmick_ggo.c b/appli/gimmick/gimmick_ggo.c deleted file mode 100644 index 4eda3b8..0000000 --- a/appli/gimmick/gimmick_ggo.c +++ /dev/null @@ -1,1127 +0,0 @@ -/* - File autogenerated by gengetopt version 2.20 - generated with the following command: - gengetopt --file-name=gimmick_ggo --include-getopt - - The developers of gengetopt consider the fixed text that goes in all - gengetopt output files to be in the public domain: - we make no copyright claims on it. -*/ - -/* If we use autoconf. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - - -#include "gimmick_ggo.h" - -const char *gengetopt_args_info_purpose = ""; - -const char *gengetopt_args_info_usage = "Usage: gimmick COMMAND [OPTIONS]"; - -const char *gengetopt_args_info_description = ""; - -const char *gengetopt_args_info_help[] = { - " -h, --help Print help and exit", - " -V, --version Print version and exit", - "\nCOMMANDS:", - " -p, --print Prints the local database tree (default=off)", - " -f, --file= Adds the file to local database", - " -d, --dir= Adds the directory to local database", - " -r, --recurse Recurse into sub-directories (default=off)", - "\nOPTIONS:", - " -v, --verbose=INT Verbosity level (default=`1')", - " -D, --debug=INT Debug messages level (default=`0')", - 0 -}; - -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, 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); - -static char * -gengetopt_strdup (const char *s); - -static -void clear_given (struct gengetopt_args_info *args_info) -{ - args_info->help_given = 0 ; - args_info->version_given = 0 ; - args_info->print_given = 0 ; - args_info->file_given = 0 ; - args_info->dir_given = 0 ; - args_info->recurse_given = 0 ; - args_info->verbose_given = 0 ; - args_info->debug_given = 0 ; -} - -static -void clear_args (struct gengetopt_args_info *args_info) -{ - args_info->print_flag = 0; - args_info->file_arg = NULL; - args_info->file_orig = NULL; - args_info->dir_arg = NULL; - args_info->dir_orig = NULL; - args_info->recurse_flag = 0; - args_info->verbose_arg = 1; - args_info->verbose_orig = NULL; - args_info->debug_arg = 0; - args_info->debug_orig = NULL; - -} - -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] ; - args_info->file_help = gengetopt_args_info_help[4] ; - args_info->dir_help = gengetopt_args_info_help[5] ; - args_info->recurse_help = gengetopt_args_info_help[6] ; - args_info->verbose_help = gengetopt_args_info_help[8] ; - args_info->debug_help = gengetopt_args_info_help[9] ; - -} - -void -cmdline_parser_print_version (void) -{ - printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION); -} - -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); - - printf("\n%s\n\n", gengetopt_args_info_usage); - - if (strlen(gengetopt_args_info_description) > 0) - printf("%s\n", gengetopt_args_info_description); - - while (gengetopt_args_info_help[i]) - printf("%s\n", gengetopt_args_info_help[i++]); -} - -void -cmdline_parser_init (struct gengetopt_args_info *args_info) -{ - clear_given (args_info); - clear_args (args_info); - init_args_info (args_info); -} - -static void -cmdline_parser_release (struct gengetopt_args_info *args_info) -{ - - if (args_info->file_arg) - { - 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; - } - - clear_given (args_info); -} - -int -cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) -{ - FILE *outfile; - int i = 0; - - outfile = fopen(filename, "w"); - - if (!outfile) - { - fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); - return EXIT_FAILURE; - } - - 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; -} - -void -cmdline_parser_free (struct gengetopt_args_info *args_info) -{ - cmdline_parser_release (args_info); -} - - -/* gengetopt_strdup() */ -/* strdup.c replacement of strdup, which is not standard */ -char * -gengetopt_strdup (const char *s) -{ - char *result = NULL; - if (!s) - return result; - - result = (char*)malloc(strlen(s) + 1); - if (result == (char*)0) - return (char*)0; - strcpy(result, s); - return result; -} - -int -cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info) -{ - return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); -} - -int -cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) -{ - int result; - - result = cmdline_parser_internal (argc, argv, args_info, override, initialize, check_required, NULL); - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) -{ - int result = EXIT_SUCCESS; - - if (cmdline_parser_required2(args_info, prog_name, NULL) > 0) - result = EXIT_FAILURE; - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) -{ - int error = 0; - - /* checks for required options */ - - /* checks for dependences among options */ - if (args_info->recurse_given && ! args_info->dir_given) - { - fprintf (stderr, "%s: '--recurse' ('-r') option depends on option 'dir'%s\n", prog_name, (additional_error ? additional_error : "")); - error = 1; - } - - 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. - * - */ - -/* - * we must include anything we need since this file is not thought to be - * inserted in a file already using getopt.h - * - * Lorenzo - */ - -struct option -{ - 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; -}; - -/* 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. */ - -static char *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 `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; -}; - -/* - * 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, 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; - - if (initialize) - cmdline_parser_init (args_info); - - cmdline_parser_init (&local_args_info); - - optarg = 0; - optind = 0; - opterr = 1; - optopt = '?'; - - while (1) - { - int option_index = 0; - char *stop_char; - - static struct option long_options[] = { - { "help", 0, NULL, 'h' }, - { "version", 0, NULL, 'V' }, - { "print", 0, NULL, 'p' }, - { "file", 1, NULL, 'f' }, - { "dir", 1, NULL, 'd' }, - { "recurse", 0, NULL, 'r' }, - { "verbose", 1, NULL, 'v' }, - { "debug", 1, NULL, 'D' }, - { NULL, 0, NULL, 0 } - }; - - 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. */ - - switch (c) - { - case 'h': /* Print help and exit. */ - cmdline_parser_print_help (); - cmdline_parser_free (&local_args_info); - exit (EXIT_SUCCESS); - - case 'V': /* Print version and exit. */ - cmdline_parser_print_version (); - cmdline_parser_free (&local_args_info); - exit (EXIT_SUCCESS); - - case 'p': /* Prints the local database tree. */ - 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 (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 (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 (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 (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 (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. */ - goto failure; - - default: /* bug: option not considered. */ - fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); - abort (); - } /* switch */ - } /* while */ - - - - if (check_required) - { - error += cmdline_parser_required2 (args_info, argv[0], additional_error); - } - - cmdline_parser_release (&local_args_info); - - if ( error ) - return (EXIT_FAILURE); - - return 0; - -failure: - - cmdline_parser_release (&local_args_info); - return (EXIT_FAILURE); -} diff --git a/appli/gimmick/gimmick_ggo.h b/appli/gimmick/gimmick_ggo.h deleted file mode 100644 index c9f2443..0000000 --- a/appli/gimmick/gimmick_ggo.h +++ /dev/null @@ -1,82 +0,0 @@ -/* gimmick_ggo.h */ - -/* File autogenerated by gengetopt version 2.20 */ - -#ifndef GIMMICK_GGO_H -#define GIMMICK_GGO_H - -/* If we use autoconf. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef CMDLINE_PARSER_PACKAGE -#define CMDLINE_PARSER_PACKAGE "gimmick" -#endif - -#ifndef CMDLINE_PARSER_VERSION -#define CMDLINE_PARSER_VERSION "0.1.0" -#endif - -struct gengetopt_args_info -{ - 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. */ - - 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. */ - -} ; - -extern const char *gengetopt_args_info_purpose; -extern const char *gengetopt_args_info_usage; -extern const char *gengetopt_args_info_help[]; - -int cmdline_parser (int argc, char * const *argv, - struct gengetopt_args_info *args_info); -int cmdline_parser2 (int argc, char * const *argv, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required); -int cmdline_parser_file_save(const char *filename, - struct gengetopt_args_info *args_info); - -void cmdline_parser_print_help(void); -void cmdline_parser_print_version(void); - -void cmdline_parser_init (struct gengetopt_args_info *args_info); -void cmdline_parser_free (struct gengetopt_args_info *args_info); - -int cmdline_parser_required (struct gengetopt_args_info *args_info, - const char *prog_name); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* GIMMICK_GGO_H */ diff --git a/appli/gimmick/main.cxx b/appli/gimmick/main.cxx index 1ce38ed..274efe7 100644 --- a/appli/gimmick/main.cxx +++ b/appli/gimmick/main.cxx @@ -1,53 +1,89 @@ +#include + +using namespace boost; +namespace po = boost::program_options; + #include #include -#include +using namespace std; -int main(int argc, char* argv[]) +int main(int ac, char* av[]) { - gengetopt_args_info args; - if (cmdline_parser (argc, argv, &args) != 0) return 0 ; - - creaImageIO::Gimmick g; - if (args.verbose_given) g.SetMessageLevel(args.verbose_arg); - if (args.debug_given) g.SetDebugMessageLevel(args.debug_arg); - - bool something_to_do = - args.dir_given | - args.file_given | - args.print_given; - - if (!something_to_do) - { - std::cout << "Nothing to do !" << std::endl; - return 0; - } + creaImageIO::Gimmick g; + int verb,deb; + std::string handler("Local database"); + + //Describes first group of options + po::options_description generic("GENERIC"); + generic.add_options() + ("help,h", "Print help and exit") + ("version,V", "Print version and exit"); + + //Describes second group of options + po::options_description command("COMMANDS"); + command.add_options() + ("print,p","Prints the local database tree (default=off)") + ("file,f",po::value< vector >(),"Adds the file to the local database") + ("dir,d",po::value< vector >(),"Adds the directory to the local database") + ("recurse,r","Recurse into sub-directories (default=off)"); + + //Describes third group of options + po::options_description option("OPTIONS"); + option.add_options() + ("verbose,v",po::value(&verb),"Verbosity level (default=`1')") + ("debug,D",po::value(&deb),"Debug messages level (default=`0')"); + + + //Adds the groups into a big one + po::options_description cmdline_options; + cmdline_options.add(generic).add(command).add(option); + + //Adds the corresponding variables + po::variables_map vm; + po::store(po::parse_command_line(ac, av, cmdline_options), vm); + po::notify(vm); + + //Does something on each option + //GENERIC + if (vm.count("help")) { + cout << "Usage: gimmick COMMAND [OPTIONS]:\n"; + cout << cmdline_options << "\n"; + } + if (vm.count("version")) { + cout << "gimmick 0.1.0\n"; + } + + //OPTIONS + if (vm.count("verbose")) { + g.SetMessageLevel(verb); + cout << "Verbose level is now "< files; - // TO DO : multiple files given - files.push_back(args.file_arg); - g.AddFiles(handler,files); + g.Initialize(); + if (vm.count("print")) { + g.GetTreeHandler(handler)->LoadChildren(0,0); + g.Print(handler); } - if (args.dir_given) - { - g.AddDir(handler,args.dir_arg, args.recurse_given); + if (vm.count("file")) { + std::vector files=vm["file"].as< vector >(); + cout << "Include paths are: " << vm["file"].as< vector >().front() << "\n"; + g.AddFiles(handler,files); } - - if (args.print_given) - { - g.GetTreeHandler(handler)->LoadChildren(0,0); - g.Print(handler); + if (vm.count("dir")) { + std::vector dirs=vm["dir"].as< vector >(); + g.AddDir(handler,dirs.front(), vm.count("recurse")); } - - g.Finalize(); + g.Finalize(); } catch (crea::Exception e) {