Viewing file: cmdline.c (78.75 KB) -rw-rw-r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* File autogenerated by gengetopt version 2.22.2 generated with the following command: /usr/bin/gengetopt --unamed-opts --input=src/generated_src/phc.ggo --file-name=src/generated/cmdline
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 <stdio.h> #include <stdlib.h> #include <string.h>
#ifndef FIX_UNUSED #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ #endif
#include "getopt.h"
#include "src/generated/cmdline.h"
const char *gengetopt_args_info_purpose = "";
const char *gengetopt_args_info_usage = "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]... [FILES]...";
const char *gengetopt_args_info_description = "";
const char *gengetopt_args_info_full_help[] = { " -h, --help Print help and exit", " --full-help Print help, including hidden options, and exit", " -V, --version Print version and exit", "\nGENERAL OPTIONS:", " -v, --verbose Verbose output (default=off)", " -c, --compile Compile (default=off)", " --pretty-print Pretty print input according to the Zend style \n guidelines (default=off)", " --obfuscate Obfuscate input (default=off)", " --run=STRING Run the specified plugin (may be specified \n multiple times)", " --r-option=STRING Pass option to a plugin (specify multiple flags \n in the same order as multiple plugins - 1 \n option only per plugin)", " -d, --define=STRING Define ini entry (only affects -c and \n --include)", " --no-warnings Allow warnings to be printed (default=off)", "\nINPUT OPTIONS:", " --read-xml=PASSNAME Assume the input is in XML format. Start \n processing after the named pass (passes are \n ast|hir|mir)", " --no-xml-validation Toggle XML validation (default=on)", " --include Parse included or required files at \n compile-time (default=off)", " --include-harder Try harder to find included files, possibly \n slightly breaking some of PHP's rules \n (default=off)", " --include-regexp Use regular expressions to find include files \n (default=off)", " --include-name Try even harder to find include files, \n searching the basename of the include \n argument. (default=off)", " --include-searchdir=DIRECTORY\n Search regular expressions starting from the \n search directory", "\nCOMPILATION OPTIONS:", " -C, --c-option=STRING Pass option to the C compile (e.g., -C-g; can \n be specified multiple times)", " --generate-c Generate C code (default=off)", " --extension=EXTENSION Generate a PHP extension called EXTENSION \n instead of a standalone application", " --web-app=CONFIG Generate a web-application (experimental)", " --with-php=PATH PHP installation path", " -O, --optimize=STRING Optimize (default=`0')", " -o, --output=FILE Place executable into file FILE", " -e, --execute Run executable after compiling (implies -c) \n (default=off)", "\nPRETTY PRINTING OPTIONS:", " --next-line-curlies Output the opening curly on the next line \n instead of on the same line (default=off)", " --no-leading-tab Don't start every line in between <?php .. ?> \n with a tab (default=off)", " --tab=STRING String to use for tabs while unparsing \n (default=`\t')", " --no-hash-bang Do not output any #! lines (default=off)", "\nOUTPUT OPTIONS:", " --dump=PASSNAME Dump input as PHP (although potentially with \n gotos and labels) after PASSNAME", " --dump-xml=PASSNAME Dump input as XML after PASSNAME", " --dump-dot=PASSNAME Dump input as DOT after PASSNAME", " --dump-parse-tree Dump parse tree as DOT (default=off)", " --dump-tokens Dump list of tokens from the lexer \n (default=off)", " --list-passes List of available passes (for PASSNAME) \n (default=off)", "\nPHP PRINTING OPTIONS:", " --convert-uppered Use legal PHP when dumping MIR as PHP \n (default=off)", "\nDOT PRINTING OPTIONS:", " --no-dot-line-numbers Don't show line numbers when dumping DOT/XML \n (default=off)", " --no-dot-nulls Don't show NULLs when dumping DOT \n (default=off)", " --no-dot-empty-lists Don't show empty lists when dumping DOT \n (default=off)", "\nXML PRINTING OPTIONS:", " --no-xml-line-numbers Don't show line numbers when dumping DOT \n (default=off)", " --no-xml-base-64 Don't encode any strings into base64 when \n dumping XML (default=off)", " --no-xml-attrs When dumping XML, omit node attributes \n (default=off)", "\nOPTIMIZATION OPTIONS:", " --flow-insensitive Turn off flow-sensitivity (default=off)", " --call-string-length=LENGTH\n Choose the call-string length ('0' indicates \n infinite call-string) (default=`0')", " --ssi-type=FLAVOR Select SSI flavor. (possible values=\"ssi\", \n \"essa\" default=`ssi')", "\nDEBUGGING PHC:", " --stats Print compile-time statistics (default=off)", " --rt-stats Print statistics about a program at run-time \n (default=off)", " --cfg-dump=PASSNAME Dump CFG after the pass named 'PASSNAME'", " --debug=PASSNAME Print debugging information for the pass named \n 'PASSNAME", " --dont-fail Dont fail on error (after parsing) \n (default=off)", " --disable=PASSNAME Disable the pass named 'PASSNAME'", " --pause Pause compilation at pause() statements (in phc \n source, not user code) (default=off)", "\nMore options are available via --full-help", 0 };
static void init_help_array(void) { gengetopt_args_info_help[0] = gengetopt_args_info_full_help[0]; gengetopt_args_info_help[1] = gengetopt_args_info_full_help[1]; gengetopt_args_info_help[2] = gengetopt_args_info_full_help[2]; gengetopt_args_info_help[3] = gengetopt_args_info_full_help[3]; gengetopt_args_info_help[4] = gengetopt_args_info_full_help[4]; gengetopt_args_info_help[5] = gengetopt_args_info_full_help[5]; gengetopt_args_info_help[6] = gengetopt_args_info_full_help[6]; gengetopt_args_info_help[7] = gengetopt_args_info_full_help[7]; gengetopt_args_info_help[8] = gengetopt_args_info_full_help[8]; gengetopt_args_info_help[9] = gengetopt_args_info_full_help[9]; gengetopt_args_info_help[10] = gengetopt_args_info_full_help[10]; gengetopt_args_info_help[11] = gengetopt_args_info_full_help[11]; gengetopt_args_info_help[12] = gengetopt_args_info_full_help[12]; gengetopt_args_info_help[13] = gengetopt_args_info_full_help[13]; gengetopt_args_info_help[14] = gengetopt_args_info_full_help[15]; gengetopt_args_info_help[15] = gengetopt_args_info_full_help[16]; gengetopt_args_info_help[16] = gengetopt_args_info_full_help[17]; gengetopt_args_info_help[17] = gengetopt_args_info_full_help[18]; gengetopt_args_info_help[18] = gengetopt_args_info_full_help[19]; gengetopt_args_info_help[19] = gengetopt_args_info_full_help[20]; gengetopt_args_info_help[20] = gengetopt_args_info_full_help[21]; gengetopt_args_info_help[21] = gengetopt_args_info_full_help[23]; gengetopt_args_info_help[22] = gengetopt_args_info_full_help[24]; gengetopt_args_info_help[23] = gengetopt_args_info_full_help[26]; gengetopt_args_info_help[24] = gengetopt_args_info_full_help[27]; gengetopt_args_info_help[25] = gengetopt_args_info_full_help[28]; gengetopt_args_info_help[26] = gengetopt_args_info_full_help[29]; gengetopt_args_info_help[27] = gengetopt_args_info_full_help[30]; gengetopt_args_info_help[28] = gengetopt_args_info_full_help[31]; gengetopt_args_info_help[29] = gengetopt_args_info_full_help[32]; gengetopt_args_info_help[30] = gengetopt_args_info_full_help[33]; gengetopt_args_info_help[31] = gengetopt_args_info_full_help[34]; gengetopt_args_info_help[32] = gengetopt_args_info_full_help[35]; gengetopt_args_info_help[33] = gengetopt_args_info_full_help[36]; gengetopt_args_info_help[34] = gengetopt_args_info_full_help[37]; gengetopt_args_info_help[35] = gengetopt_args_info_full_help[40]; gengetopt_args_info_help[36] = gengetopt_args_info_full_help[51]; gengetopt_args_info_help[37] = gengetopt_args_info_full_help[52]; gengetopt_args_info_help[38] = gengetopt_args_info_full_help[53]; gengetopt_args_info_help[39] = gengetopt_args_info_full_help[54]; gengetopt_args_info_help[40] = gengetopt_args_info_full_help[63]; gengetopt_args_info_help[41] = 0; }
const char *gengetopt_args_info_help[42];
typedef enum {ARG_NO , ARG_FLAG , ARG_STRING , ARG_INT , ARG_ENUM } 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);
static int cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error);
const char *cmdline_parser_ssi_type_values[] = {"ssi", "essa", 0}; /*< Possible values for ssi-type. */
static char * gengetopt_strdup (const char *s);
static void clear_given (struct gengetopt_args_info *args_info) { args_info->help_given = 0 ; args_info->full_help_given = 0 ; args_info->version_given = 0 ; args_info->verbose_given = 0 ; args_info->compile_given = 0 ; args_info->pretty_print_given = 0 ; args_info->obfuscate_given = 0 ; args_info->run_given = 0 ; args_info->r_option_given = 0 ; args_info->define_given = 0 ; args_info->no_warnings_given = 0 ; args_info->read_xml_given = 0 ; args_info->no_xml_validation_given = 0 ; args_info->include_given = 0 ; args_info->include_harder_given = 0 ; args_info->include_regexp_given = 0 ; args_info->include_name_given = 0 ; args_info->include_searchdir_given = 0 ; args_info->c_option_given = 0 ; args_info->generate_c_given = 0 ; args_info->extension_given = 0 ; args_info->web_app_given = 0 ; args_info->with_php_given = 0 ; args_info->optimize_given = 0 ; args_info->output_given = 0 ; args_info->execute_given = 0 ; args_info->next_line_curlies_given = 0 ; args_info->no_leading_tab_given = 0 ; args_info->tab_given = 0 ; args_info->no_hash_bang_given = 0 ; args_info->dump_given = 0 ; args_info->dump_xml_given = 0 ; args_info->dump_dot_given = 0 ; args_info->dump_parse_tree_given = 0 ; args_info->dump_tokens_given = 0 ; args_info->list_passes_given = 0 ; args_info->convert_uppered_given = 0 ; args_info->no_dot_line_numbers_given = 0 ; args_info->no_dot_nulls_given = 0 ; args_info->no_dot_empty_lists_given = 0 ; args_info->no_xml_line_numbers_given = 0 ; args_info->no_xml_base_64_given = 0 ; args_info->no_xml_attrs_given = 0 ; args_info->flow_insensitive_given = 0 ; args_info->call_string_length_given = 0 ; args_info->ssi_type_given = 0 ; args_info->stats_given = 0 ; args_info->rt_stats_given = 0 ; args_info->cfg_dump_given = 0 ; args_info->debug_given = 0 ; args_info->dont_fail_given = 0 ; args_info->disable_given = 0 ; args_info->pause_given = 0 ; }
static void clear_args (struct gengetopt_args_info *args_info) { FIX_UNUSED (args_info); args_info->verbose_flag = 0; args_info->compile_flag = 0; args_info->pretty_print_flag = 0; args_info->obfuscate_flag = 0; args_info->run_arg = NULL; args_info->run_orig = NULL; args_info->r_option_arg = NULL; args_info->r_option_orig = NULL; args_info->define_arg = NULL; args_info->define_orig = NULL; args_info->no_warnings_flag = 0; args_info->read_xml_arg = NULL; args_info->read_xml_orig = NULL; args_info->no_xml_validation_flag = 1; args_info->include_flag = 0; args_info->include_harder_flag = 0; args_info->include_regexp_flag = 0; args_info->include_name_flag = 0; args_info->include_searchdir_arg = NULL; args_info->include_searchdir_orig = NULL; args_info->c_option_arg = NULL; args_info->c_option_orig = NULL; args_info->generate_c_flag = 0; args_info->extension_arg = NULL; args_info->extension_orig = NULL; args_info->web_app_arg = NULL; args_info->web_app_orig = NULL; args_info->with_php_arg = NULL; args_info->with_php_orig = NULL; args_info->optimize_arg = gengetopt_strdup ("0"); args_info->optimize_orig = NULL; args_info->output_arg = NULL; args_info->output_orig = NULL; args_info->execute_flag = 0; args_info->next_line_curlies_flag = 0; args_info->no_leading_tab_flag = 0; args_info->tab_arg = gengetopt_strdup ("\t"); args_info->tab_orig = NULL; args_info->no_hash_bang_flag = 0; args_info->dump_arg = NULL; args_info->dump_orig = NULL; args_info->dump_xml_arg = NULL; args_info->dump_xml_orig = NULL; args_info->dump_dot_arg = NULL; args_info->dump_dot_orig = NULL; args_info->dump_parse_tree_flag = 0; args_info->dump_tokens_flag = 0; args_info->list_passes_flag = 0; args_info->convert_uppered_flag = 0; args_info->no_dot_line_numbers_flag = 0; args_info->no_dot_nulls_flag = 0; args_info->no_dot_empty_lists_flag = 0; args_info->no_xml_line_numbers_flag = 0; args_info->no_xml_base_64_flag = 0; args_info->no_xml_attrs_flag = 0; args_info->flow_insensitive_flag = 0; args_info->call_string_length_arg = 0; args_info->call_string_length_orig = NULL; args_info->ssi_type_arg = ssi_type_arg_ssi; args_info->ssi_type_orig = NULL; args_info->stats_flag = 0; args_info->rt_stats_flag = 0; args_info->cfg_dump_arg = NULL; args_info->cfg_dump_orig = NULL; args_info->debug_arg = NULL; args_info->debug_orig = NULL; args_info->dont_fail_flag = 0; args_info->disable_arg = NULL; args_info->disable_orig = NULL; args_info->pause_flag = 0; }
static void init_args_info(struct gengetopt_args_info *args_info) {
init_help_array(); args_info->help_help = gengetopt_args_info_full_help[0] ; args_info->full_help_help = gengetopt_args_info_full_help[1] ; args_info->version_help = gengetopt_args_info_full_help[2] ; args_info->verbose_help = gengetopt_args_info_full_help[4] ; args_info->compile_help = gengetopt_args_info_full_help[5] ; args_info->pretty_print_help = gengetopt_args_info_full_help[6] ; args_info->obfuscate_help = gengetopt_args_info_full_help[7] ; args_info->run_help = gengetopt_args_info_full_help[8] ; args_info->run_min = 0; args_info->run_max = 0; args_info->r_option_help = gengetopt_args_info_full_help[9] ; args_info->r_option_min = 0; args_info->r_option_max = 0; args_info->define_help = gengetopt_args_info_full_help[10] ; args_info->define_min = 0; args_info->define_max = 0; args_info->no_warnings_help = gengetopt_args_info_full_help[11] ; args_info->read_xml_help = gengetopt_args_info_full_help[13] ; args_info->no_xml_validation_help = gengetopt_args_info_full_help[14] ; args_info->include_help = gengetopt_args_info_full_help[15] ; args_info->include_harder_help = gengetopt_args_info_full_help[16] ; args_info->include_regexp_help = gengetopt_args_info_full_help[17] ; args_info->include_name_help = gengetopt_args_info_full_help[18] ; args_info->include_searchdir_help = gengetopt_args_info_full_help[19] ; args_info->c_option_help = gengetopt_args_info_full_help[21] ; args_info->c_option_min = 0; args_info->c_option_max = 0; args_info->generate_c_help = gengetopt_args_info_full_help[22] ; args_info->extension_help = gengetopt_args_info_full_help[23] ; args_info->web_app_help = gengetopt_args_info_full_help[24] ; args_info->with_php_help = gengetopt_args_info_full_help[25] ; args_info->optimize_help = gengetopt_args_info_full_help[26] ; args_info->output_help = gengetopt_args_info_full_help[27] ; args_info->execute_help = gengetopt_args_info_full_help[28] ; args_info->next_line_curlies_help = gengetopt_args_info_full_help[30] ; args_info->no_leading_tab_help = gengetopt_args_info_full_help[31] ; args_info->tab_help = gengetopt_args_info_full_help[32] ; args_info->no_hash_bang_help = gengetopt_args_info_full_help[33] ; args_info->dump_help = gengetopt_args_info_full_help[35] ; args_info->dump_min = 0; args_info->dump_max = 0; args_info->dump_xml_help = gengetopt_args_info_full_help[36] ; args_info->dump_xml_min = 0; args_info->dump_xml_max = 0; args_info->dump_dot_help = gengetopt_args_info_full_help[37] ; args_info->dump_dot_min = 0; args_info->dump_dot_max = 0; args_info->dump_parse_tree_help = gengetopt_args_info_full_help[38] ; args_info->dump_tokens_help = gengetopt_args_info_full_help[39] ; args_info->list_passes_help = gengetopt_args_info_full_help[40] ; args_info->convert_uppered_help = gengetopt_args_info_full_help[42] ; args_info->no_dot_line_numbers_help = gengetopt_args_info_full_help[44] ; args_info->no_dot_nulls_help = gengetopt_args_info_full_help[45] ; args_info->no_dot_empty_lists_help = gengetopt_args_info_full_help[46] ; args_info->no_xml_line_numbers_help = gengetopt_args_info_full_help[48] ; args_info->no_xml_base_64_help = gengetopt_args_info_full_help[49] ; args_info->no_xml_attrs_help = gengetopt_args_info_full_help[50] ; args_info->flow_insensitive_help = gengetopt_args_info_full_help[52] ; args_info->call_string_length_help = gengetopt_args_info_full_help[53] ; args_info->ssi_type_help = gengetopt_args_info_full_help[54] ; args_info->stats_help = gengetopt_args_info_full_help[56] ; args_info->rt_stats_help = gengetopt_args_info_full_help[57] ; args_info->cfg_dump_help = gengetopt_args_info_full_help[58] ; args_info->cfg_dump_min = 0; args_info->cfg_dump_max = 0; args_info->debug_help = gengetopt_args_info_full_help[59] ; args_info->debug_min = 0; args_info->debug_max = 0; args_info->dont_fail_help = gengetopt_args_info_full_help[60] ; args_info->disable_help = gengetopt_args_info_full_help[61] ; args_info->disable_min = 0; args_info->disable_max = 0; args_info->pause_help = gengetopt_args_info_full_help[62] ; }
void cmdline_parser_print_version (void) { printf ("%s %s\n", (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), CMDLINE_PARSER_VERSION); }
static void print_help_common(void) { 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");
if (strlen(gengetopt_args_info_description) > 0) printf("%s\n\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++]); }
void cmdline_parser_print_full_help (void) { int i = 0; print_help_common(); while (gengetopt_args_info_full_help[i]) printf("%s\n", gengetopt_args_info_full_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);
args_info->inputs = 0; 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; } }
/** @brief generic value variable */ union generic_value { int int_arg; char *string_arg; const char *default_string_arg; };
/** @brief holds temporary values for multiple options */ struct generic_list { union generic_value arg; char *orig; struct generic_list *next; };
/** * @brief add a node at the head of the list */ static void add_node(struct generic_list **list) { struct generic_list *new_node = (struct generic_list *) malloc (sizeof (struct generic_list)); new_node->next = *list; *list = new_node; new_node->arg.string_arg = 0; new_node->orig = 0; }
static void free_multiple_string_field(unsigned int len, char ***arg, char ***orig) { unsigned int i; if (*arg) { for (i = 0; i < len; ++i) { free_string_field(&((*arg)[i])); free_string_field(&((*orig)[i])); } free_string_field(&((*arg)[0])); /* free default string */
free (*arg); *arg = 0; free (*orig); *orig = 0; } }
static void cmdline_parser_release (struct gengetopt_args_info *args_info) { unsigned int i; free_multiple_string_field (args_info->run_given, &(args_info->run_arg), &(args_info->run_orig)); free_multiple_string_field (args_info->r_option_given, &(args_info->r_option_arg), &(args_info->r_option_orig)); free_multiple_string_field (args_info->define_given, &(args_info->define_arg), &(args_info->define_orig)); free_string_field (&(args_info->read_xml_arg)); free_string_field (&(args_info->read_xml_orig)); free_string_field (&(args_info->include_searchdir_arg)); free_string_field (&(args_info->include_searchdir_orig)); free_multiple_string_field (args_info->c_option_given, &(args_info->c_option_arg), &(args_info->c_option_orig)); free_string_field (&(args_info->extension_arg)); free_string_field (&(args_info->extension_orig)); free_string_field (&(args_info->web_app_arg)); free_string_field (&(args_info->web_app_orig)); free_string_field (&(args_info->with_php_arg)); free_string_field (&(args_info->with_php_orig)); free_string_field (&(args_info->optimize_arg)); free_string_field (&(args_info->optimize_orig)); free_string_field (&(args_info->output_arg)); free_string_field (&(args_info->output_orig)); free_string_field (&(args_info->tab_arg)); free_string_field (&(args_info->tab_orig)); free_multiple_string_field (args_info->dump_given, &(args_info->dump_arg), &(args_info->dump_orig)); free_multiple_string_field (args_info->dump_xml_given, &(args_info->dump_xml_arg), &(args_info->dump_xml_orig)); free_multiple_string_field (args_info->dump_dot_given, &(args_info->dump_dot_arg), &(args_info->dump_dot_orig)); free_string_field (&(args_info->call_string_length_orig)); free_string_field (&(args_info->ssi_type_orig)); free_multiple_string_field (args_info->cfg_dump_given, &(args_info->cfg_dump_arg), &(args_info->cfg_dump_orig)); free_multiple_string_field (args_info->debug_given, &(args_info->debug_arg), &(args_info->debug_orig)); free_multiple_string_field (args_info->disable_given, &(args_info->disable_arg), &(args_info->disable_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); }
/** * @param val the value to check * @param values the possible values * @return the index of the matched value: * -1 if no value matched, * -2 if more than one value has matched */ static int check_possible_values(const char *val, const char *values[]) { int i, found, last; size_t len;
if (!val) /* otherwise strlen() crashes below */ return -1; /* -1 means no argument for the option */
found = last = 0;
for (i = 0, len = strlen(val); values[i]; ++i) { if (strncmp(val, values[i], len) == 0) { ++found; last = i; if (strlen(values[i]) == len) return i; /* exact macth no need to check more */ } }
if (found == 1) /* one match: OK */ return last;
return (found ? -2 : -1); /* return many values or none matched */ }
static void write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) { int found = -1; if (arg) { if (values) { found = check_possible_values(arg, values); } if (found >= 0) fprintf(outfile, "%s=\"%s\" # %s\n", opt, arg, values[found]); else fprintf(outfile, "%s=\"%s\"\n", opt, arg); } else { fprintf(outfile, "%s\n", opt); } }
static void write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[]) { int i; for (i = 0; i < len; ++i) write_into_file(outfile, opt, (arg ? arg[i] : 0), values); }
int cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) { int i = 0;
if (!outfile) { fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); return EXIT_FAILURE; }
if (args_info->help_given) write_into_file(outfile, "help", 0, 0 ); if (args_info->full_help_given) write_into_file(outfile, "full-help", 0, 0 ); if (args_info->version_given) write_into_file(outfile, "version", 0, 0 ); if (args_info->verbose_given) write_into_file(outfile, "verbose", 0, 0 ); if (args_info->compile_given) write_into_file(outfile, "compile", 0, 0 ); if (args_info->pretty_print_given) write_into_file(outfile, "pretty-print", 0, 0 ); if (args_info->obfuscate_given) write_into_file(outfile, "obfuscate", 0, 0 ); write_multiple_into_file(outfile, args_info->run_given, "run", args_info->run_orig, 0); write_multiple_into_file(outfile, args_info->r_option_given, "r-option", args_info->r_option_orig, 0); write_multiple_into_file(outfile, args_info->define_given, "define", args_info->define_orig, 0); if (args_info->no_warnings_given) write_into_file(outfile, "no-warnings", 0, 0 ); if (args_info->read_xml_given) write_into_file(outfile, "read-xml", args_info->read_xml_orig, 0); if (args_info->no_xml_validation_given) write_into_file(outfile, "no-xml-validation", 0, 0 ); if (args_info->include_given) write_into_file(outfile, "include", 0, 0 ); if (args_info->include_harder_given) write_into_file(outfile, "include-harder", 0, 0 ); if (args_info->include_regexp_given) write_into_file(outfile, "include-regexp", 0, 0 ); if (args_info->include_name_given) write_into_file(outfile, "include-name", 0, 0 ); if (args_info->include_searchdir_given) write_into_file(outfile, "include-searchdir", args_info->include_searchdir_orig, 0); write_multiple_into_file(outfile, args_info->c_option_given, "c-option", args_info->c_option_orig, 0); if (args_info->generate_c_given) write_into_file(outfile, "generate-c", 0, 0 ); if (args_info->extension_given) write_into_file(outfile, "extension", args_info->extension_orig, 0); if (args_info->web_app_given) write_into_file(outfile, "web-app", args_info->web_app_orig, 0); if (args_info->with_php_given) write_into_file(outfile, "with-php", args_info->with_php_orig, 0); if (args_info->optimize_given) write_into_file(outfile, "optimize", args_info->optimize_orig, 0); if (args_info->output_given) write_into_file(outfile, "output", args_info->output_orig, 0); if (args_info->execute_given) write_into_file(outfile, "execute", 0, 0 ); if (args_info->next_line_curlies_given) write_into_file(outfile, "next-line-curlies", 0, 0 ); if (args_info->no_leading_tab_given) write_into_file(outfile, "no-leading-tab", 0, 0 ); if (args_info->tab_given) write_into_file(outfile, "tab", args_info->tab_orig, 0); if (args_info->no_hash_bang_given) write_into_file(outfile, "no-hash-bang", 0, 0 ); write_multiple_into_file(outfile, args_info->dump_given, "dump", args_info->dump_orig, 0); write_multiple_into_file(outfile, args_info->dump_xml_given, "dump-xml", args_info->dump_xml_orig, 0); write_multiple_into_file(outfile, args_info->dump_dot_given, "dump-dot", args_info->dump_dot_orig, 0); if (args_info->dump_parse_tree_given) write_into_file(outfile, "dump-parse-tree", 0, 0 ); if (args_info->dump_tokens_given) write_into_file(outfile, "dump-tokens", 0, 0 ); if (args_info->list_passes_given) write_into_file(outfile, "list-passes", 0, 0 ); if (args_info->convert_uppered_given) write_into_file(outfile, "convert-uppered", 0, 0 ); if (args_info->no_dot_line_numbers_given) write_into_file(outfile, "no-dot-line-numbers", 0, 0 ); if (args_info->no_dot_nulls_given) write_into_file(outfile, "no-dot-nulls", 0, 0 ); if (args_info->no_dot_empty_lists_given) write_into_file(outfile, "no-dot-empty-lists", 0, 0 ); if (args_info->no_xml_line_numbers_given) write_into_file(outfile, "no-xml-line-numbers", 0, 0 ); if (args_info->no_xml_base_64_given) write_into_file(outfile, "no-xml-base-64", 0, 0 ); if (args_info->no_xml_attrs_given) write_into_file(outfile, "no-xml-attrs", 0, 0 ); if (args_info->flow_insensitive_given) write_into_file(outfile, "flow-insensitive", 0, 0 ); if (args_info->call_string_length_given) write_into_file(outfile, "call-string-length", args_info->call_string_length_orig, 0); if (args_info->ssi_type_given) write_into_file(outfile, "ssi-type", args_info->ssi_type_orig, cmdline_parser_ssi_type_values); if (args_info->stats_given) write_into_file(outfile, "stats", 0, 0 ); if (args_info->rt_stats_given) write_into_file(outfile, "rt-stats", 0, 0 ); write_multiple_into_file(outfile, args_info->cfg_dump_given, "cfg-dump", args_info->cfg_dump_orig, 0); write_multiple_into_file(outfile, args_info->debug_given, "debug", args_info->debug_orig, 0); if (args_info->dont_fail_given) write_into_file(outfile, "dont-fail", 0, 0 ); write_multiple_into_file(outfile, args_info->disable_given, "disable", args_info->disable_orig, 0); if (args_info->pause_given) write_into_file(outfile, "pause", 0, 0 );
i = EXIT_SUCCESS; return i; }
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; }
i = cmdline_parser_dump(outfile, args_info); fclose (outfile);
return i; }
void cmdline_parser_free (struct gengetopt_args_info *args_info) { cmdline_parser_release (args_info); }
/** @brief replacement of strdup, which is not standard */ char * gengetopt_strdup (const char *s) { char *result = 0; if (!s) return result;
result = (char*)malloc(strlen(s) + 1); if (result == (char*)0) return (char*)0; strcpy(result, s); return result; }
static char * get_multiple_arg_token(const char *arg) { char *tok, *ret; size_t len, num_of_escape, i, j;
if (!arg) return 0;
tok = strchr (arg, ','); num_of_escape = 0;
/* make sure it is not escaped */ while (tok) { if (*(tok-1) == '\\') { /* find the next one */ tok = strchr (tok+1, ','); ++num_of_escape; } else break; }
if (tok) len = (size_t)(tok - arg + 1); else len = strlen (arg) + 1;
len -= num_of_escape;
ret = (char *) malloc (len);
i = 0; j = 0; while (arg[i] && (j < len-1)) { if (arg[i] == '\\' && arg[ i + 1 ] && arg[ i + 1 ] == ',') ++i;
ret[j++] = arg[i++]; }
ret[len-1] = '\0';
return ret; }
static char * get_multiple_arg_token_next(const char *arg) { char *tok;
if (!arg) return 0;
tok = strchr (arg, ',');
/* make sure it is not escaped */ while (tok) { if (*(tok-1) == '\\') { /* find the next one */ tok = strchr (tok+1, ','); } else break; }
if (! tok || strlen(tok) == 1) return 0;
return tok+1; }
static int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc);
int check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc) { int error = 0;
if (option_given && (min > 0 || max > 0)) { if (min > 0 && max > 0) { if (min == max) { /* specific occurrences */ if (option_given != (unsigned int) min) { fprintf (stderr, "%s: %s option occurrences must be %d\n", prog_name, option_desc, min); error = 1; } } else if (option_given < (unsigned int) min || option_given > (unsigned int) max) { /* range occurrences */ fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n", prog_name, option_desc, min, max); error = 1; } } else if (min > 0) { /* at least check */ if (option_given < min) { fprintf (stderr, "%s: %s option occurrences must be at least %d\n", prog_name, option_desc, min); error = 1; } } else if (max > 0) { /* at most check */ if (option_given > max) { fprintf (stderr, "%s: %s option occurrences must be at most %d\n", prog_name, option_desc, max); error = 1; } } } return error; } 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_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, 0);
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, 0);
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, 0) > 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) { FIX_UNUSED (additional_error); int error = 0;
/* checks for required options */ if (check_multiple_option_occurrences(prog_name, args_info->run_given, args_info->run_min, args_info->run_max, "'--run'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->r_option_given, args_info->r_option_min, args_info->r_option_max, "'--r-option'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->define_given, args_info->define_min, args_info->define_max, "'--define' ('-d')")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->c_option_given, args_info->c_option_min, args_info->c_option_max, "'--c-option' ('-C')")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->dump_given, args_info->dump_min, args_info->dump_max, "'--dump'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->dump_xml_given, args_info->dump_xml_min, args_info->dump_xml_max, "'--dump-xml'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->dump_dot_given, args_info->dump_dot_min, args_info->dump_dot_max, "'--dump-dot'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->cfg_dump_given, args_info->cfg_dump_min, args_info->cfg_dump_max, "'--cfg-dump'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->debug_given, args_info->debug_min, args_info->debug_max, "'--debug'")) error = 1; if (check_multiple_option_occurrences(prog_name, args_info->disable_given, args_info->disable_min, args_info->disable_max, "'--disable'")) error = 1; /* checks for dependences among options */ if (args_info->include_regexp_given && ! args_info->include_given) { fprintf (stderr, "%s: '--include-regexp' option depends on option 'include'%s\n", prog_name, (additional_error ? additional_error : "")); error = 1; } if (args_info->include_name_given && ! args_info->include_given) { fprintf (stderr, "%s: '--include-name' option depends on option 'include'%s\n", prog_name, (additional_error ? additional_error : "")); error = 1; }
return error; }
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 */ static int update_arg(void *field, char **orig_field, unsigned int *field_given, unsigned int *prev_given, char *value, const 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) { FIX_UNUSED (field); char *stop_char = 0; const char *val = value; int found; char **string_field;
stop_char = 0; found = 0;
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 */ }
if (possible_values && (found = check_possible_values((value ? value : default_value), possible_values)) < 0) { if (short_opt != '-') fprintf (stderr, "%s: %s argument, \"%s\", for option `--%s' (`-%c')%s\n", package_name, (found == -2) ? "ambiguous" : "invalid", value, long_opt, short_opt, (additional_error ? additional_error : "")); else fprintf (stderr, "%s: %s argument, \"%s\", for option `--%s'%s\n", package_name, (found == -2) ? "ambiguous" : "invalid", value, long_opt, (additional_error ? additional_error : "")); return 1; /* failure */ } 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_ENUM: if (val) *((int *)field) = found; 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); } } };
return 0; /* OK */ }
/** * @brief store information about a multiple option in a temporary list * @param list where to (temporarily) store multiple options */ static int update_multiple_arg_temp(struct generic_list **list, unsigned int *prev_given, const char *val, const char *possible_values[], const char *default_value, cmdline_parser_arg_type arg_type, const char *long_opt, char short_opt, const char *additional_error) { char *multi_token, *multi_next; /* store single arguments */
if (arg_type == ARG_NO) { (*prev_given)++; return 0; /* OK */ }
multi_token = get_multiple_arg_token(val); multi_next = get_multiple_arg_token_next (val);
while (1) { add_node (list); if (update_arg((void *)&((*list)->arg), &((*list)->orig), 0, prev_given, multi_token, possible_values, default_value, arg_type, 0, 1, 1, 1, long_opt, short_opt, additional_error)) { if (multi_token) free(multi_token); return 1; /* failure */ }
if (multi_next) { multi_token = get_multiple_arg_token(multi_next); multi_next = get_multiple_arg_token_next (multi_next); } else break; }
return 0; /* OK */ }
/** * @brief free the passed list (including possible string argument) */ static void free_list(struct generic_list *list, short string_arg) { if (list) { struct generic_list *tmp; while (list) { tmp = list; if (string_arg && list->arg.string_arg) free (list->arg.string_arg); if (list->orig) free (list->orig); list = list->next; free (tmp); } } }
/** * @brief updates a multiple option starting from the passed list */ static void update_multiple_arg(void *field, char ***orig_field, unsigned int field_given, unsigned int prev_given, union generic_value *default_value, cmdline_parser_arg_type arg_type, struct generic_list *list) { int i; struct generic_list *tmp;
if (prev_given && list) { *orig_field = (char **) realloc (*orig_field, (field_given + prev_given) * sizeof (char *));
switch(arg_type) { case ARG_INT: case ARG_ENUM: *((int **)field) = (int *)realloc (*((int **)field), (field_given + prev_given) * sizeof (int)); break; case ARG_STRING: *((char ***)field) = (char **)realloc (*((char ***)field), (field_given + prev_given) * sizeof (char *)); break; default: break; }; for (i = (prev_given - 1); i >= 0; --i) { tmp = list; switch(arg_type) { case ARG_INT: (*((int **)field))[i + field_given] = tmp->arg.int_arg; break; case ARG_ENUM: (*((int **)field))[i + field_given] = tmp->arg.int_arg; break; case ARG_STRING: (*((char ***)field))[i + field_given] = tmp->arg.string_arg; break; default: break; } (*orig_field) [i + field_given] = list->orig; list = list->next; free (tmp); } } else { /* set the default value */ if (default_value && ! field_given) { switch(arg_type) { case ARG_INT: case ARG_ENUM: if (! *((int **)field)) { *((int **)field) = (int *)malloc (sizeof (int)); (*((int **)field))[0] = default_value->int_arg; } break; case ARG_STRING: if (! *((char ***)field)) { *((char ***)field) = (char **)malloc (sizeof (char *)); (*((char ***)field))[0] = gengetopt_strdup(default_value->string_arg); } break; default: break; } if (!(*orig_field)) { *orig_field = (char **) malloc (sizeof (char *)); (*orig_field)[0] = 0; } } } }
int cmdline_parser_internal ( int argc, char * const *argv, struct gengetopt_args_info *args_info, struct cmdline_parser_params *params, const char *additional_error) { int c; /* Character of the parsed option. */
struct generic_list * run_list = NULL; struct generic_list * r_option_list = NULL; struct generic_list * define_list = NULL; struct generic_list * c_option_list = NULL; struct generic_list * dump_list = NULL; struct generic_list * dump_xml_list = NULL; struct generic_list * dump_dot_list = NULL; struct generic_list * cfg_dump_list = NULL; struct generic_list * debug_list = NULL; struct generic_list * disable_list = NULL; 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);
cmdline_parser_init (&local_args_info);
optarg = 0; optind = 0; opterr = params->print_errors; optopt = '?';
while (1) { int option_index = 0;
static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "full-help", 0, NULL, 0 }, { "version", 0, NULL, 'V' }, { "verbose", 0, NULL, 'v' }, { "compile", 0, NULL, 'c' }, { "pretty-print", 0, NULL, 0 }, { "obfuscate", 0, NULL, 0 }, { "run", 1, NULL, 0 }, { "r-option", 1, NULL, 0 }, { "define", 1, NULL, 'd' }, { "no-warnings", 0, NULL, 0 }, { "read-xml", 1, NULL, 0 }, { "no-xml-validation", 0, NULL, 0 }, { "include", 0, NULL, 0 }, { "include-harder", 0, NULL, 0 }, { "include-regexp", 0, NULL, 0 }, { "include-name", 0, NULL, 0 }, { "include-searchdir", 1, NULL, 0 }, { "c-option", 1, NULL, 'C' }, { "generate-c", 0, NULL, 0 }, { "extension", 1, NULL, 0 }, { "web-app", 1, NULL, 0 }, { "with-php", 1, NULL, 0 }, { "optimize", 1, NULL, 'O' }, { "output", 1, NULL, 'o' }, { "execute", 0, NULL, 'e' }, { "next-line-curlies", 0, NULL, 0 }, { "no-leading-tab", 0, NULL, 0 }, { "tab", 1, NULL, 0 }, { "no-hash-bang", 0, NULL, 0 }, { "dump", 1, NULL, 0 }, { "dump-xml", 1, NULL, 0 }, { "dump-dot", 1, NULL, 0 }, { "dump-parse-tree", 0, NULL, 0 }, { "dump-tokens", 0, NULL, 0 }, { "list-passes", 0, NULL, 0 }, { "convert-uppered", 0, NULL, 0 }, { "no-dot-line-numbers", 0, NULL, 0 }, { "no-dot-nulls", 0, NULL, 0 }, { "no-dot-empty-lists", 0, NULL, 0 }, { "no-xml-line-numbers", 0, NULL, 0 }, { "no-xml-base-64", 0, NULL, 0 }, { "no-xml-attrs", 0, NULL, 0 }, { "flow-insensitive", 0, NULL, 0 }, { "call-string-length", 1, NULL, 0 }, { "ssi-type", 1, NULL, 0 }, { "stats", 0, NULL, 0 }, { "rt-stats", 0, NULL, 0 }, { "cfg-dump", 1, NULL, 0 }, { "debug", 1, NULL, 0 }, { "dont-fail", 0, NULL, 0 }, { "disable", 1, NULL, 0 }, { "pause", 0, NULL, 0 }, { 0, 0, 0, 0 } };
c = getopt_long (argc, argv, "hVvcd:C:O:o:e", long_options, &option_index);
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 'v': /* Verbose output. */ if (update_arg((void *)&(args_info->verbose_flag), 0, &(args_info->verbose_given), &(local_args_info.verbose_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "verbose", 'v', additional_error)) goto failure; break; case 'c': /* Compile. */ if (update_arg((void *)&(args_info->compile_flag), 0, &(args_info->compile_given), &(local_args_info.compile_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "compile", 'c', additional_error)) goto failure; break; case 'd': /* Define ini entry (only affects -c and --include). */ if (update_multiple_arg_temp(&define_list, &(local_args_info.define_given), optarg, 0, 0, ARG_STRING, "define", 'd', additional_error)) goto failure; break; case 'C': /* Pass option to the C compile (e.g., -C-g; can be specified multiple times). */ if (update_multiple_arg_temp(&c_option_list, &(local_args_info.c_option_given), optarg, 0, 0, ARG_STRING, "c-option", 'C', additional_error)) goto failure; break; case 'O': /* Optimize. */ if (update_arg( (void *)&(args_info->optimize_arg), &(args_info->optimize_orig), &(args_info->optimize_given), &(local_args_info.optimize_given), optarg, 0, "0", ARG_STRING, check_ambiguity, override, 0, 0, "optimize", 'O', additional_error)) goto failure; break; case 'o': /* Place executable into file FILE. */ if (update_arg( (void *)&(args_info->output_arg), &(args_info->output_orig), &(args_info->output_given), &(local_args_info.output_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "output", 'o', additional_error)) goto failure; break; case 'e': /* Run executable after compiling (implies -c). */ if (update_arg((void *)&(args_info->execute_flag), 0, &(args_info->execute_given), &(local_args_info.execute_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "execute", 'e', additional_error)) goto failure; break;
case 0: /* Long option with no short option */ if (strcmp (long_options[option_index].name, "full-help") == 0) { cmdline_parser_print_full_help (); cmdline_parser_free (&local_args_info); exit (EXIT_SUCCESS); }
/* Pretty print input according to the Zend style guidelines. */ if (strcmp (long_options[option_index].name, "pretty-print") == 0) { if (update_arg((void *)&(args_info->pretty_print_flag), 0, &(args_info->pretty_print_given), &(local_args_info.pretty_print_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "pretty-print", '-', additional_error)) goto failure; } /* Obfuscate input. */ else if (strcmp (long_options[option_index].name, "obfuscate") == 0) { if (update_arg((void *)&(args_info->obfuscate_flag), 0, &(args_info->obfuscate_given), &(local_args_info.obfuscate_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "obfuscate", '-', additional_error)) goto failure; } /* Run the specified plugin (may be specified multiple times). */ else if (strcmp (long_options[option_index].name, "run") == 0) { if (update_multiple_arg_temp(&run_list, &(local_args_info.run_given), optarg, 0, 0, ARG_STRING, "run", '-', additional_error)) goto failure; } /* Pass option to a plugin (specify multiple flags in the same order as multiple plugins - 1 option only per plugin). */ else if (strcmp (long_options[option_index].name, "r-option") == 0) { if (update_multiple_arg_temp(&r_option_list, &(local_args_info.r_option_given), optarg, 0, 0, ARG_STRING, "r-option", '-', additional_error)) goto failure; } /* Allow warnings to be printed. */ else if (strcmp (long_options[option_index].name, "no-warnings") == 0) { if (update_arg((void *)&(args_info->no_warnings_flag), 0, &(args_info->no_warnings_given), &(local_args_info.no_warnings_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-warnings", '-', additional_error)) goto failure; } /* Assume the input is in XML format. Start processing after the named pass (passes are ast|hir|mir). */ else if (strcmp (long_options[option_index].name, "read-xml") == 0) { if (update_arg( (void *)&(args_info->read_xml_arg), &(args_info->read_xml_orig), &(args_info->read_xml_given), &(local_args_info.read_xml_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "read-xml", '-', additional_error)) goto failure; } /* Toggle XML validation. */ else if (strcmp (long_options[option_index].name, "no-xml-validation") == 0) { if (update_arg((void *)&(args_info->no_xml_validation_flag), 0, &(args_info->no_xml_validation_given), &(local_args_info.no_xml_validation_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-xml-validation", '-', additional_error)) goto failure; } /* Parse included or required files at compile-time. */ else if (strcmp (long_options[option_index].name, "include") == 0) { if (update_arg((void *)&(args_info->include_flag), 0, &(args_info->include_given), &(local_args_info.include_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "include", '-', additional_error)) goto failure; } /* Try harder to find included files, possibly slightly breaking some of PHP's rules. */ else if (strcmp (long_options[option_index].name, "include-harder") == 0) { if (update_arg((void *)&(args_info->include_harder_flag), 0, &(args_info->include_harder_given), &(local_args_info.include_harder_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "include-harder", '-', additional_error)) goto failure; } /* Use regular expressions to find include files. */ else if (strcmp (long_options[option_index].name, "include-regexp") == 0) { if (update_arg((void *)&(args_info->include_regexp_flag), 0, &(args_info->include_regexp_given), &(local_args_info.include_regexp_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "include-regexp", '-', additional_error)) goto failure; } /* Try even harder to find include files, searching the basename of the include argument.. */ else if (strcmp (long_options[option_index].name, "include-name") == 0) { if (update_arg((void *)&(args_info->include_name_flag), 0, &(args_info->include_name_given), &(local_args_info.include_name_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "include-name", '-', additional_error)) goto failure; } /* Search regular expressions starting from the search directory. */ else if (strcmp (long_options[option_index].name, "include-searchdir") == 0) { if (update_arg( (void *)&(args_info->include_searchdir_arg), &(args_info->include_searchdir_orig), &(args_info->include_searchdir_given), &(local_args_info.include_searchdir_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "include-searchdir", '-', additional_error)) goto failure; } /* Generate C code. */ else if (strcmp (long_options[option_index].name, "generate-c") == 0) { if (update_arg((void *)&(args_info->generate_c_flag), 0, &(args_info->generate_c_given), &(local_args_info.generate_c_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "generate-c", '-', additional_error)) goto failure; } /* Generate a PHP extension called EXTENSION instead of a standalone application. */ else if (strcmp (long_options[option_index].name, "extension") == 0) { if (update_arg( (void *)&(args_info->extension_arg), &(args_info->extension_orig), &(args_info->extension_given), &(local_args_info.extension_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "extension", '-', additional_error)) goto failure; } /* Generate a web-application (experimental). */ else if (strcmp (long_options[option_index].name, "web-app") == 0) { if (update_arg( (void *)&(args_info->web_app_arg), &(args_info->web_app_orig), &(args_info->web_app_given), &(local_args_info.web_app_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "web-app", '-', additional_error)) goto failure; } /* PHP installation path. */ else if (strcmp (long_options[option_index].name, "with-php") == 0) { if (update_arg( (void *)&(args_info->with_php_arg), &(args_info->with_php_orig), &(args_info->with_php_given), &(local_args_info.with_php_given), optarg, 0, 0, ARG_STRING, check_ambiguity, override, 0, 0, "with-php", '-', additional_error)) goto failure; } /* Output the opening curly on the next line instead of on the same line. */ else if (strcmp (long_options[option_index].name, "next-line-curlies") == 0) { if (update_arg((void *)&(args_info->next_line_curlies_flag), 0, &(args_info->next_line_curlies_given), &(local_args_info.next_line_curlies_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "next-line-curlies", '-', additional_error)) goto failure; } /* Don't start every line in between <?php .. ?> with a tab. */ else if (strcmp (long_options[option_index].name, "no-leading-tab") == 0) { if (update_arg((void *)&(args_info->no_leading_tab_flag), 0, &(args_info->no_leading_tab_given), &(local_args_info.no_leading_tab_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-leading-tab", '-', additional_error)) goto failure; } /* String to use for tabs while unparsing. */ else if (strcmp (long_options[option_index].name, "tab") == 0) { if (update_arg( (void *)&(args_info->tab_arg), &(args_info->tab_orig), &(args_info->tab_given), &(local_args_info.tab_given), optarg, 0, "\t", ARG_STRING, check_ambiguity, override, 0, 0, "tab", '-', additional_error)) goto failure; } /* Do not output any #! lines. */ else if (strcmp (long_options[option_index].name, "no-hash-bang") == 0) { if (update_arg((void *)&(args_info->no_hash_bang_flag), 0, &(args_info->no_hash_bang_given), &(local_args_info.no_hash_bang_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-hash-bang", '-', additional_error)) goto failure; } /* Dump input as PHP (although potentially with gotos and labels) after PASSNAME. */ else if (strcmp (long_options[option_index].name, "dump") == 0) { if (update_multiple_arg_temp(&dump_list, &(local_args_info.dump_given), optarg, 0, 0, ARG_STRING, "dump", '-', additional_error)) goto failure; } /* Dump input as XML after PASSNAME. */ else if (strcmp (long_options[option_index].name, "dump-xml") == 0) { if (update_multiple_arg_temp(&dump_xml_list, &(local_args_info.dump_xml_given), optarg, 0, 0, ARG_STRING, "dump-xml", '-', additional_error)) goto failure; } /* Dump input as DOT after PASSNAME. */ else if (strcmp (long_options[option_index].name, "dump-dot") == 0) { if (update_multiple_arg_temp(&dump_dot_list, &(local_args_info.dump_dot_given), optarg, 0, 0, ARG_STRING, "dump-dot", '-', additional_error)) goto failure; } /* Dump parse tree as DOT. */ else if (strcmp (long_options[option_index].name, "dump-parse-tree") == 0) { if (update_arg((void *)&(args_info->dump_parse_tree_flag), 0, &(args_info->dump_parse_tree_given), &(local_args_info.dump_parse_tree_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "dump-parse-tree", '-', additional_error)) goto failure; } /* Dump list of tokens from the lexer. */ else if (strcmp (long_options[option_index].name, "dump-tokens") == 0) { if (update_arg((void *)&(args_info->dump_tokens_flag), 0, &(args_info->dump_tokens_given), &(local_args_info.dump_tokens_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "dump-tokens", '-', additional_error)) goto failure; } /* List of available passes (for PASSNAME). */ else if (strcmp (long_options[option_index].name, "list-passes") == 0) { if (update_arg((void *)&(args_info->list_passes_flag), 0, &(args_info->list_passes_given), &(local_args_info.list_passes_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "list-passes", '-', additional_error)) goto failure; } /* Use legal PHP when dumping MIR as PHP. */ else if (strcmp (long_options[option_index].name, "convert-uppered") == 0) { if (update_arg((void *)&(args_info->convert_uppered_flag), 0, &(args_info->convert_uppered_given), &(local_args_info.convert_uppered_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "convert-uppered", '-', additional_error)) goto failure; } /* Don't show line numbers when dumping DOT/XML. */ else if (strcmp (long_options[option_index].name, "no-dot-line-numbers") == 0) { if (update_arg((void *)&(args_info->no_dot_line_numbers_flag), 0, &(args_info->no_dot_line_numbers_given), &(local_args_info.no_dot_line_numbers_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-dot-line-numbers", '-', additional_error)) goto failure; } /* Don't show NULLs when dumping DOT. */ else if (strcmp (long_options[option_index].name, "no-dot-nulls") == 0) { if (update_arg((void *)&(args_info->no_dot_nulls_flag), 0, &(args_info->no_dot_nulls_given), &(local_args_info.no_dot_nulls_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-dot-nulls", '-', additional_error)) goto failure; } /* Don't show empty lists when dumping DOT. */ else if (strcmp (long_options[option_index].name, "no-dot-empty-lists") == 0) { if (update_arg((void *)&(args_info->no_dot_empty_lists_flag), 0, &(args_info->no_dot_empty_lists_given), &(local_args_info.no_dot_empty_lists_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-dot-empty-lists", '-', additional_error)) goto failure; } /* Don't show line numbers when dumping DOT. */ else if (strcmp (long_options[option_index].name, "no-xml-line-numbers") == 0) { if (update_arg((void *)&(args_info->no_xml_line_numbers_flag), 0, &(args_info->no_xml_line_numbers_given), &(local_args_info.no_xml_line_numbers_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-xml-line-numbers", '-', additional_error)) goto failure; } /* Don't encode any strings into base64 when dumping XML. */ else if (strcmp (long_options[option_index].name, "no-xml-base-64") == 0) { if (update_arg((void *)&(args_info->no_xml_base_64_flag), 0, &(args_info->no_xml_base_64_given), &(local_args_info.no_xml_base_64_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-xml-base-64", '-', additional_error)) goto failure; } /* When dumping XML, omit node attributes. */ else if (strcmp (long_options[option_index].name, "no-xml-attrs") == 0) { if (update_arg((void *)&(args_info->no_xml_attrs_flag), 0, &(args_info->no_xml_attrs_given), &(local_args_info.no_xml_attrs_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "no-xml-attrs", '-', additional_error)) goto failure; } /* Turn off flow-sensitivity. */ else if (strcmp (long_options[option_index].name, "flow-insensitive") == 0) { if (update_arg((void *)&(args_info->flow_insensitive_flag), 0, &(args_info->flow_insensitive_given), &(local_args_info.flow_insensitive_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "flow-insensitive", '-', additional_error)) goto failure; } /* Choose the call-string length ('0' indicates infinite call-string). */ else if (strcmp (long_options[option_index].name, "call-string-length") == 0) { if (update_arg( (void *)&(args_info->call_string_length_arg), &(args_info->call_string_length_orig), &(args_info->call_string_length_given), &(local_args_info.call_string_length_given), optarg, 0, "0", ARG_INT, check_ambiguity, override, 0, 0, "call-string-length", '-', additional_error)) goto failure; } /* Select SSI flavor.. */ else if (strcmp (long_options[option_index].name, "ssi-type") == 0) { if (update_arg( (void *)&(args_info->ssi_type_arg), &(args_info->ssi_type_orig), &(args_info->ssi_type_given), &(local_args_info.ssi_type_given), optarg, cmdline_parser_ssi_type_values, "ssi", ARG_ENUM, check_ambiguity, override, 0, 0, "ssi-type", '-', additional_error)) goto failure; } /* Print compile-time statistics. */ else if (strcmp (long_options[option_index].name, "stats") == 0) { if (update_arg((void *)&(args_info->stats_flag), 0, &(args_info->stats_given), &(local_args_info.stats_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "stats", '-', additional_error)) goto failure; } /* Print statistics about a program at run-time. */ else if (strcmp (long_options[option_index].name, "rt-stats") == 0) { if (update_arg((void *)&(args_info->rt_stats_flag), 0, &(args_info->rt_stats_given), &(local_args_info.rt_stats_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "rt-stats", '-', additional_error)) goto failure; } /* Dump CFG after the pass named 'PASSNAME'. */ else if (strcmp (long_options[option_index].name, "cfg-dump") == 0) { if (update_multiple_arg_temp(&cfg_dump_list, &(local_args_info.cfg_dump_given), optarg, 0, 0, ARG_STRING, "cfg-dump", '-', additional_error)) goto failure; } /* Print debugging information for the pass named 'PASSNAME. */ else if (strcmp (long_options[option_index].name, "debug") == 0) { if (update_multiple_arg_temp(&debug_list, &(local_args_info.debug_given), optarg, 0, 0, ARG_STRING, "debug", '-', additional_error)) goto failure; } /* Dont fail on error (after parsing). */ else if (strcmp (long_options[option_index].name, "dont-fail") == 0) { if (update_arg((void *)&(args_info->dont_fail_flag), 0, &(args_info->dont_fail_given), &(local_args_info.dont_fail_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "dont-fail", '-', additional_error)) goto failure; } /* Disable the pass named 'PASSNAME'. */ else if (strcmp (long_options[option_index].name, "disable") == 0) { if (update_multiple_arg_temp(&disable_list, &(local_args_info.disable_given), optarg, 0, 0, ARG_STRING, "disable", '-', additional_error)) goto failure; } /* Pause compilation at pause() statements (in phc source, not user code). */ else if (strcmp (long_options[option_index].name, "pause") == 0) { if (update_arg((void *)&(args_info->pause_flag), 0, &(args_info->pause_given), &(local_args_info.pause_given), optarg, 0, 0, ARG_FLAG, check_ambiguity, override, 1, 0, "pause", '-', additional_error)) goto failure; } break; 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 */
update_multiple_arg((void *)&(args_info->run_arg), &(args_info->run_orig), args_info->run_given, local_args_info.run_given, 0, ARG_STRING, run_list); update_multiple_arg((void *)&(args_info->r_option_arg), &(args_info->r_option_orig), args_info->r_option_given, local_args_info.r_option_given, 0, ARG_STRING, r_option_list); update_multiple_arg((void *)&(args_info->define_arg), &(args_info->define_orig), args_info->define_given, local_args_info.define_given, 0, ARG_STRING, define_list); update_multiple_arg((void *)&(args_info->c_option_arg), &(args_info->c_option_orig), args_info->c_option_given, local_args_info.c_option_given, 0, ARG_STRING, c_option_list); update_multiple_arg((void *)&(args_info->dump_arg), &(args_info->dump_orig), args_info->dump_given, local_args_info.dump_given, 0, ARG_STRING, dump_list); update_multiple_arg((void *)&(args_info->dump_xml_arg), &(args_info->dump_xml_orig), args_info->dump_xml_given, local_args_info.dump_xml_given, 0, ARG_STRING, dump_xml_list); update_multiple_arg((void *)&(args_info->dump_dot_arg), &(args_info->dump_dot_orig), args_info->dump_dot_given, local_args_info.dump_dot_given, 0, ARG_STRING, dump_dot_list); update_multiple_arg((void *)&(args_info->cfg_dump_arg), &(args_info->cfg_dump_orig), args_info->cfg_dump_given, local_args_info.cfg_dump_given, 0, ARG_STRING, cfg_dump_list); update_multiple_arg((void *)&(args_info->debug_arg), &(args_info->debug_orig), args_info->debug_given, local_args_info.debug_given, 0, ARG_STRING, debug_list); update_multiple_arg((void *)&(args_info->disable_arg), &(args_info->disable_orig), args_info->disable_given, local_args_info.disable_given, 0, ARG_STRING, disable_list);
args_info->run_given += local_args_info.run_given; local_args_info.run_given = 0; args_info->r_option_given += local_args_info.r_option_given; local_args_info.r_option_given = 0; args_info->define_given += local_args_info.define_given; local_args_info.define_given = 0; args_info->c_option_given += local_args_info.c_option_given; local_args_info.c_option_given = 0; args_info->dump_given += local_args_info.dump_given; local_args_info.dump_given = 0; args_info->dump_xml_given += local_args_info.dump_xml_given; local_args_info.dump_xml_given = 0; args_info->dump_dot_given += local_args_info.dump_dot_given; local_args_info.dump_dot_given = 0; args_info->cfg_dump_given += local_args_info.cfg_dump_given; local_args_info.cfg_dump_given = 0; args_info->debug_given += local_args_info.debug_given; local_args_info.debug_given = 0; args_info->disable_given += local_args_info.disable_given; local_args_info.disable_given = 0; if (check_required) { error += cmdline_parser_required2 (args_info, argv[0], additional_error); }
cmdline_parser_release (&local_args_info);
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: free_list (run_list, 1 ); free_list (r_option_list, 1 ); free_list (define_list, 1 ); free_list (c_option_list, 1 ); free_list (dump_list, 1 ); free_list (dump_xml_list, 1 ); free_list (dump_dot_list, 1 ); free_list (cfg_dump_list, 1 ); free_list (debug_list, 1 ); free_list (disable_list, 1 ); cmdline_parser_release (&local_args_info); return (EXIT_FAILURE); }
|