diff options
Diffstat (limited to 'src/cmdline.opt')
-rw-r--r-- | src/cmdline.opt | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/src/cmdline.opt b/src/cmdline.opt new file mode 100644 index 0000000..25dc542 --- /dev/null +++ b/src/cmdline.opt @@ -0,0 +1,226 @@ +/* This file is part of Eclat. + Copyright (C) 2012 Sergey Poznyakoff. + + Eclat is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Eclat 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eclat. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_GETOPT_H +# include <getopt.h> +#endif + +static char *pp_cmd_buffer; +static size_t pp_cmd_bufsize; +static size_t pp_cmd_buflevel; + +struct replvar { + char **s_ptr; + char *s_val; +}; + +int +replace_string_var(void *p) +{ + struct replvar *rv = p; + *rv->s_ptr = rv->s_val; + return 0; +} + +OPTIONS_BEGIN("eclat", + [<EC2 Command Line Administrator Tool>],[<>], + [<gnu>], + [<copyright_year=2012>], + [<copyright_holder=Sergey Poznyakoff>]) + +GROUP(Selecting program mode) + +OPTION(lint,t,, + [<parse configuration file and exit>]) +BEGIN + lint_mode = 1; +END + +OPTION(,E,, + [<preprocess config and exit>]) +BEGIN + preprocess_only = 1; +END + +OPTION(dry-run,n,, + [<do nothing, print almost everything>]) +BEGIN + dry_run_mode = 1; +END + +OPTION(config-file,c,FILE, + [<use FILE instead of the default configuration>]) +BEGIN + conffile = optarg; +END + +GROUP(Commands) + +OPTION(start-instances,,, + [<Start named instances>]) +BEGIN + eclat_command = eclat_command_start_instances; +END + +OPTION(stop-instances,,, + [<Stop named instances>]) +BEGIN + eclat_command = eclat_command_stop_instances; +END + +GROUP(Modifiers) + +OPTION(region,,NAME, + [<define AWS region>]) +BEGIN + struct replvar *rv = grecs_malloc(sizeof(*rv)); + rv->s_ptr = ®ion_name; + rv->s_val = optarg; + add_config_finish_hook(replace_string_var, rv); +END + +OPTION(access-file,a,NAME, + [<set access file>]) +BEGIN + struct replvar *rv = grecs_malloc(sizeof(*rv)); + rv->s_ptr = &access_file_name; + rv->s_val = optarg; + add_config_finish_hook(replace_string_var, rv); +END + +OPTION(access-key,O,KEY, + [<set access key to use>]) +BEGIN + access_key = optarg; +END + +OPTION(secret-key,W,KEY, + [<set secret key to use>]) +BEGIN + secret_key = optarg; +END + +OPTION(ssl,,, + [<use SSL (HTTPS) connection>]) +BEGIN + use_ssl = 1; +END + +GROUP(Preprocessor control) + +OPTION(include-directory,I,DIR, + [<add include directory>]) +BEGIN + grecs_preproc_add_include_dir(optarg); +END + +OPTION(define,D,SYMBOL[=VALUE], + [<define a preprocessor symbol>]) +BEGIN + size_t len; + char *p; + + len = 4; + for (p = optarg; *p; p++) { + if (*p == '\\' || *p == '"') + len++; + len++; + } + + if (pp_cmd_buflevel + len + 1 > pp_cmd_bufsize) { + pp_cmd_bufsize = pp_cmd_buflevel + len + 1; + pp_cmd_buffer = grecs_realloc(pp_cmd_buffer, pp_cmd_bufsize); + } + memcpy(pp_cmd_buffer + pp_cmd_buflevel, " \"-D", 4); + pp_cmd_buflevel += 4; + + p = optarg; + do { + if (*p == '\\' || *p == '"') + pp_cmd_buffer[pp_cmd_buflevel++] = '\\'; + pp_cmd_buffer[pp_cmd_buflevel++] = *p; + } while (*p++); +END + +OPTION(preprocessor,,COMMAND, + [<use COMMAND instead of the default preprocessor>]) +BEGIN + grecs_preprocessor = optarg; +END + +OPTION(no-preprocessor,,, + [<disable preprocessing>]) +BEGIN + grecs_preprocessor = NULL; +END + +GROUP(Debugging) + +OPTION(dump-grammar-trace,,, + [<dump configuration grammar traces>]) +BEGIN + grecs_gram_trace (1); +END + +OPTION(dump-lex-trace,,, + [<dump lexical analyzer traces>]) +BEGIN + grecs_lex_trace (1); +END + +OPTION(debug,d,CAT[.LEVEL], + [<set debugging level>]) +BEGIN + if (parse_debug_level(optarg)) { + die(EX_USAGE, "invalid debugging category or level"); + } +END + +GROUP([<Additional help>]) +OPTION(config-help,,, + [<show configuration file summary>]) +BEGIN + config_help(); + exit(0); +END + +OPTIONS_END + +void +set_program_name(const char *arg) +{ + program_name = strrchr(arg, '/'); + if (!program_name) + program_name = arg; + else + program_name++; +} + +void +parse_options(int argc, char *argv[], int *index) +{ + GETOPT(argc, argv, *index, exit(EX_USAGE)) + + if (pp_cmd_buffer && grecs_preprocessor) { + char *cmd = grecs_malloc(strlen(grecs_preprocessor) + + pp_cmd_buflevel + 1); + strcpy(cmd, grecs_preprocessor); + strcat(cmd, pp_cmd_buffer); + grecs_preprocessor = cmd; + free(pp_cmd_buffer); + } +} + |