#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "getopt.h"
#include "cmdline.h"
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 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->input_given = 0 ;
args_info->output_given = 0 ;
args_info->src_lang_given = 0 ;
args_info->out_format_given = 0 ;
args_info->verbose_given = 0 ;
args_info->doc_given = 0 ;
args_info->no_doc_given = 0 ;
args_info->css_given = 0 ;
args_info->title_given = 0 ;
args_info->tab_given = 0 ;
args_info->header_given = 0 ;
args_info->footer_given = 0 ;
args_info->tags_file_given = 0 ;
args_info->line_number_given = 0 ;
args_info->line_number_ref_given = 0 ;
args_info->output_dir_given = 0 ;
args_info->gen_version_given = 0 ;
}
static
void clear_args (struct gengetopt_args_info *args_info)
{
args_info->input_arg = NULL;
args_info->output_arg = NULL;
args_info->src_lang_arg = NULL;
args_info->out_format_arg = NULL;
args_info->css_arg = NULL;
args_info->title_arg = NULL;
args_info->header_arg = NULL;
args_info->footer_arg = NULL;
args_info->tags_file_arg = NULL;
args_info->output_dir_arg = NULL;
args_info->gen_version_flag = 1;
}
void
cmdline_parser_print_version (void)
{
printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
}
void
cmdline_parser_print_help (void)
{
cmdline_parser_print_version ();
printf("\n"
"Purpose:\n"
" Highlight the syntax of a source file (e.g. Java) into a specific format \n (e.g. HTML)\n"
"\n"
"Usage: %s [OPTIONS]... [FILES]...\n", CMDLINE_PARSER_PACKAGE);
printf("\n");
printf("%s\n"," -h, --help Print help and exit");
printf("%s\n"," -V, --version Print version and exit");
printf("%s\n"," -i, --input=STRING input file. default std input");
printf("%s\n"," -o, --output=STRING output file. default std output");
printf("%s\n"," -s, --src-lang=STRING source language (e.g. java, javascript, cpp, \n prolog, perl, php3, python, ruby, flex, \n changelog, lua, caml, sml, log). If not \n specified, the source language will be guessed \n from the file extension.");
printf("%s\n"," -f, --out-format=STRING output format (e.g. html, xhtml, esc)");
printf("%s\n"," -v, --verbose verbose mode on");
printf("%s\n"," -d, --doc create html with title and header");
printf("%s\n"," --no-doc cancel the --doc option even if it is implied \n (e.g., when css is given)");
printf("%s\n"," -c, --css=STRING use a css for formatting. Implies --doc");
printf("%s\n"," -T, --title=STRING give a title to the html. Implies --doc");
printf("%s\n"," -t, --tab=INT specify tab length. default 8");
printf("%s\n"," -H, --header=STRING file to insert as header");
printf("%s\n"," -F, --footer=STRING file to insert as footer");
printf("%s\n"," --tags-file=STRING specify format options (def. tags.j2h)");
printf("%s\n"," -n, --line-number number all output lines");
printf("%s\n"," --line-number-ref number all output lines and generate an anchor that \n can be referred to from another document");
printf("%s\n"," --output-dir=STRING output directory");
printf("%s\n"," --gen-version put gengetopt version in the generated file \n (default=on)");
}
void
cmdline_parser_init (struct gengetopt_args_info *args_info)
{
clear_given (args_info);
clear_args (args_info);
args_info->inputs = NULL;
args_info->inputs_num = 0;
}
void
cmdline_parser_free (struct gengetopt_args_info *args_info)
{
unsigned int i;
if (args_info->input_arg)
{
free (args_info->input_arg);
args_info->input_arg = 0;
}
if (args_info->output_arg)
{
free (args_info->output_arg);
args_info->output_arg = 0;
}
if (args_info->src_lang_arg)
{
free (args_info->src_lang_arg);
args_info->src_lang_arg = 0;
}
if (args_info->out_format_arg)
{
free (args_info->out_format_arg);
args_info->out_format_arg = 0;
}
if (args_info->css_arg)
{
free (args_info->css_arg);
args_info->css_arg = 0;
}
if (args_info->title_arg)
{
free (args_info->title_arg);
args_info->title_arg = 0;
}
if (args_info->header_arg)
{
free (args_info->header_arg);
args_info->header_arg = 0;
}
if (args_info->footer_arg)
{
free (args_info->footer_arg);
args_info->footer_arg = 0;
}
if (args_info->tags_file_arg)
{
free (args_info->tags_file_arg);
args_info->tags_file_arg = 0;
}
if (args_info->output_dir_arg)
{
free (args_info->output_dir_arg);
args_info->output_dir_arg = 0;
}
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);
}
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_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;
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 = 1;
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' },
{ "input", 1, NULL, 'i' },
{ "output", 1, NULL, 'o' },
{ "src-lang", 1, NULL, 's' },
{ "out-format", 1, NULL, 'f' },
{ "verbose", 0, NULL, 'v' },
{ "doc", 0, NULL, 'd' },
{ "no-doc", 0, NULL, 0 },
{ "css", 1, NULL, 'c' },
{ "title", 1, NULL, 'T' },
{ "tab", 1, NULL, 't' },
{ "header", 1, NULL, 'H' },
{ "footer", 1, NULL, 'F' },
{ "tags-file", 1, NULL, 0 },
{ "line-number", 0, NULL, 'n' },
{ "line-number-ref", 0, NULL, 0 },
{ "output-dir", 1, NULL, 0 },
{ "gen-version", 0, NULL, 0 },
{ NULL, 0, NULL, 0 }
};
stop_char = 0;
c = getopt_long (argc, argv, "hVi:o:s:f:vdc:T:t:H:F:n", long_options, &option_index);
if (c == -1) break;
switch (c)
{
case 'h':
if (local_args_info.help_given)
{
fprintf (stderr, "%s: `--help' (`-h') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->help_given && ! override)
continue;
local_args_info.help_given = 1;
args_info->help_given = 1;
return 0;
case 'V':
if (local_args_info.version_given)
{
fprintf (stderr, "%s: `--version' (`-V') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->version_given && ! override)
continue;
local_args_info.version_given = 1;
args_info->version_given = 1;
return 0;
case 'i':
if (local_args_info.input_given)
{
fprintf (stderr, "%s: `--input' (`-i') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->input_given && ! override)
continue;
local_args_info.input_given = 1;
args_info->input_given = 1;
if (args_info->input_arg)
free (args_info->input_arg);
args_info->input_arg = gengetopt_strdup (optarg);
break;
case 'o':
if (local_args_info.output_given)
{
fprintf (stderr, "%s: `--output' (`-o') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->output_given && ! override)
continue;
local_args_info.output_given = 1;
args_info->output_given = 1;
if (args_info->output_arg)
free (args_info->output_arg);
args_info->output_arg = gengetopt_strdup (optarg);
break;
case 's':
if (local_args_info.src_lang_given)
{
fprintf (stderr, "%s: `--src-lang' (`-s') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->src_lang_given && ! override)
continue;
local_args_info.src_lang_given = 1;
args_info->src_lang_given = 1;
if (args_info->src_lang_arg)
free (args_info->src_lang_arg);
args_info->src_lang_arg = gengetopt_strdup (optarg);
break;
case 'f':
if (local_args_info.out_format_given)
{
fprintf (stderr, "%s: `--out-format' (`-f') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->out_format_given && ! override)
continue;
local_args_info.out_format_given = 1;
args_info->out_format_given = 1;
if (args_info->out_format_arg)
free (args_info->out_format_arg);
args_info->out_format_arg = gengetopt_strdup (optarg);
break;
case 'v':
if (local_args_info.verbose_given)
{
fprintf (stderr, "%s: `--verbose' (`-v') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->verbose_given && ! override)
continue;
local_args_info.verbose_given = 1;
args_info->verbose_given = 1;
break;
case 'd':
if (local_args_info.doc_given)
{
fprintf (stderr, "%s: `--doc' (`-d') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->doc_given && ! override)
continue;
local_args_info.doc_given = 1;
args_info->doc_given = 1;
break;
case 'c':
if (local_args_info.css_given)
{
fprintf (stderr, "%s: `--css' (`-c') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->css_given && ! override)
continue;
local_args_info.css_given = 1;
args_info->css_given = 1;
if (args_info->css_arg)
free (args_info->css_arg);
args_info->css_arg = gengetopt_strdup (optarg);
break;
case 'T':
if (local_args_info.title_given)
{
fprintf (stderr, "%s: `--title' (`-T') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->title_given && ! override)
continue;
local_args_info.title_given = 1;
args_info->title_given = 1;
if (args_info->title_arg)
free (args_info->title_arg);
args_info->title_arg = gengetopt_strdup (optarg);
break;
case 't':
if (local_args_info.tab_given)
{
fprintf (stderr, "%s: `--tab' (`-t') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->tab_given && ! override)
continue;
local_args_info.tab_given = 1;
args_info->tab_given = 1;
args_info->tab_arg = strtol (optarg,&stop_char,0);
break;
case 'H':
if (local_args_info.header_given)
{
fprintf (stderr, "%s: `--header' (`-H') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->header_given && ! override)
continue;
local_args_info.header_given = 1;
args_info->header_given = 1;
if (args_info->header_arg)
free (args_info->header_arg);
args_info->header_arg = gengetopt_strdup (optarg);
break;
case 'F':
if (local_args_info.footer_given)
{
fprintf (stderr, "%s: `--footer' (`-F') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->footer_given && ! override)
continue;
local_args_info.footer_given = 1;
args_info->footer_given = 1;
if (args_info->footer_arg)
free (args_info->footer_arg);
args_info->footer_arg = gengetopt_strdup (optarg);
break;
case 'n':
if (local_args_info.line_number_given)
{
fprintf (stderr, "%s: `--line-number' (`-n') option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->line_number_given && ! override)
continue;
local_args_info.line_number_given = 1;
args_info->line_number_given = 1;
break;
case 0:
if (strcmp (long_options[option_index].name, "no-doc") == 0)
{
if (local_args_info.no_doc_given)
{
fprintf (stderr, "%s: `--no-doc' option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->no_doc_given && ! override)
continue;
local_args_info.no_doc_given = 1;
args_info->no_doc_given = 1;
break;
}
else if (strcmp (long_options[option_index].name, "tags-file") == 0)
{
if (local_args_info.tags_file_given)
{
fprintf (stderr, "%s: `--tags-file' option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->tags_file_given && ! override)
continue;
local_args_info.tags_file_given = 1;
args_info->tags_file_given = 1;
if (args_info->tags_file_arg)
free (args_info->tags_file_arg);
args_info->tags_file_arg = gengetopt_strdup (optarg);
}
else if (strcmp (long_options[option_index].name, "line-number-ref") == 0)
{
if (local_args_info.line_number_ref_given)
{
fprintf (stderr, "%s: `--line-number-ref' option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->line_number_ref_given && ! override)
continue;
local_args_info.line_number_ref_given = 1;
args_info->line_number_ref_given = 1;
break;
}
else if (strcmp (long_options[option_index].name, "output-dir") == 0)
{
if (local_args_info.output_dir_given)
{
fprintf (stderr, "%s: `--output-dir' option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->output_dir_given && ! override)
continue;
local_args_info.output_dir_given = 1;
args_info->output_dir_given = 1;
if (args_info->output_dir_arg)
free (args_info->output_dir_arg);
args_info->output_dir_arg = gengetopt_strdup (optarg);
}
else if (strcmp (long_options[option_index].name, "gen-version") == 0)
{
if (local_args_info.gen_version_given)
{
fprintf (stderr, "%s: `--gen-version' option given more than once%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
goto failure;
}
if (args_info->gen_version_given && ! override)
continue;
local_args_info.gen_version_given = 1;
args_info->gen_version_given = 1;
args_info->gen_version_flag = !(args_info->gen_version_flag);
}
break;
case '?':
goto failure;
default:
fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : ""));
abort ();
}
}
if (check_required)
{
if (! args_info->out_format_given)
{
fprintf (stderr, "%s: '--out-format' ('-f') option required%s\n", CMDLINE_PARSER_PACKAGE, (additional_error ? additional_error : ""));
error = 1;
}
}
if ( error )
return (EXIT_FAILURE);
if (optind < argc)
{
int i = 0 ;
args_info->inputs_num = argc - optind ;
args_info->inputs =
(char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
while (optind < argc)
args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind++]) ;
}
return 0;
failure:
return (EXIT_FAILURE);
}
|