#define PARTIAL_ERROR_SLEEP 3 /* 3 seconds */
#define DEFAULT_FILE_ARRAY_SIZE 1
+
+/*
+ * casting these to const char * to please libpopt. It allocates memory
+ * behind our back (this is of course not documented).
+ */
static char *opt_input_format, *opt_output_format;
-/* Pointer into const argv */
-static const char *opt_input_format_arg, *opt_output_format_arg;
static GPtrArray *opt_input_paths;
-static const char *opt_output_path;
+static char *opt_output_path;
static struct format *fmt_read;
enum {
OPT_NONE = 0,
+ OPT_OUTPUT_PATH,
+ OPT_INPUT_FORMAT,
+ OPT_OUTPUT_FORMAT,
OPT_HELP,
OPT_LIST,
OPT_VERBOSE,
OPT_CLOCK_FORCE_CORRELATE,
};
+/*
+ * We are _not_ using POPT_ARG_STRING ability to store directly into
+ * variables, because we want to cast the return to non-const, which is
+ * not possible without using poptGetOptArg explicitly.
+ */
static struct poptOption long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
- { "output", 'w', POPT_ARG_STRING, &opt_output_path, OPT_NONE, NULL, NULL },
- { "input-format", 'i', POPT_ARG_STRING, &opt_input_format_arg, OPT_NONE, NULL, NULL },
- { "output-format", 'o', POPT_ARG_STRING, &opt_output_format_arg, OPT_NONE, NULL, NULL },
+ { "output", 'w', POPT_ARG_STRING, NULL, OPT_NONE, NULL, NULL },
+ { "input-format", 'i', POPT_ARG_STRING, NULL, OPT_INPUT_FORMAT, NULL, NULL },
+ { "output-format", 'o', POPT_ARG_STRING, NULL, OPT_OUTPUT_FORMAT, NULL, NULL },
{ "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
{ "list", 'l', POPT_ARG_NONE, NULL, OPT_LIST, NULL, NULL },
{ "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL },
{
poptContext pc;
int opt, ret = 0;
- const char *ipath;
+ char *ipath;
if (argc == 1) {
usage(stdout);
while ((opt = poptGetNextOpt(pc)) != -1) {
switch (opt) {
+ case OPT_OUTPUT_PATH:
+ opt_output_path = (char *) poptGetOptArg(pc);
+ if (!opt_output_path) {
+ ret = -EINVAL;
+ goto end;
+ }
+ break;
+ case OPT_INPUT_FORMAT:
+ opt_input_format = (char *) poptGetOptArg(pc);
+ if (!opt_input_format) {
+ ret = -EINVAL;
+ goto end;
+ }
+ break;
+ case OPT_OUTPUT_FORMAT:
+ opt_output_format = (char *) poptGetOptArg(pc);
+ if (!opt_output_format) {
+ ret = -EINVAL;
+ goto end;
+ }
+ break;
case OPT_HELP:
usage(stdout);
ret = 1; /* exit cleanly */
}
do {
- ipath = poptGetArg(pc);
+ ipath = (char *) poptGetArg(pc);
if (ipath)
g_ptr_array_add(opt_input_paths, (gpointer) ipath);
} while (ipath);
printf_verbose("Verbose mode active.\n");
printf_debug("Debug mode active.\n");
- if (opt_input_format_arg) {
- opt_input_format = strdup(opt_input_format_arg);
- if (!opt_input_format) {
- partial_error = 1;
- goto end;
- }
+ if (opt_input_format)
strlower(opt_input_format);
- }
- if (opt_output_format_arg) {
- opt_output_format = strdup(opt_output_format_arg);
- if (!opt_output_format) {
- partial_error = 1;
- goto end;
- }
+ if (opt_output_format)
strlower(opt_output_format);
- }
printf_verbose("Converting from directory(ies):\n");
for (i = 0; i < opt_input_paths->len; i++) {
end:
free(opt_input_format);
free(opt_output_format);
+ free(opt_output_path);
+ for (i = 0; i < opt_input_paths->len; i++) {
+ char *ipath = g_ptr_array_index(opt_input_paths, i);
+ free(ipath);
+ }
g_ptr_array_free(opt_input_paths, TRUE);
if (partial_error)
exit(EXIT_FAILURE);