cmdline.c

    00001 /*
    00002   File autogenerated by gengetopt version 2.22.4
    00003   generated with the following command:
    00004   gengetopt --unamed-opts
    00005
    00006   The developers of gengetopt consider the fixed text that goes in all
    00007   gengetopt output files to be in the public domain:
    00008   we make no copyright claims on it.
    00009 */
    00010
    00011 /* If we use autoconf.  */
    00012 #ifdef HAVE_CONFIG_H
    00013 #include "config.h"
    00014 #endif
    00015
    00016 #include <stdio.h>
    00017 #include <stdlib.h>
    00018 #include <string.h>
    00019
    00020 #ifndef FIX_UNUSED
    00021 #define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */
    00022 #endif
    00023
    00024 #include <getopt.h>
    00025
    00026 #include "cmdline.h"
    00027
    00028 const char *gengetopt_args_info_purpose = "ofxdump prints to stdout, in human readable form, everything the library \nunderstands about a particular file or response, and sends errors to\nstderr.  To know exactly what the library understands about of a particular\nofx response file, just call ofxdump on that file.";
    00029
    00030 const char *gengetopt_args_info_usage = "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]... [FILES]...";
    00031
    00032 const char *gengetopt_args_info_description = "";
    00033
    00034 const char *gengetopt_args_info_help[] = {
    00035   "  -h, --help                  Print help and exit",
    00036   "  -V, --version               Print version and exit",
    00037   "  -f, --import-format=STRING  Force the file format of the file(s) specified  \n                                (default=`AUTODETECT')",
    00038   "      --list-import-formats   List available import file formats \n                                'import-format' command",
    00039   "      --msg_parser            Output file parsing messages  (default=off)",
    00040   "      --msg_debug             Output messages meant for debuging  (default=off)",
    00041   "      --msg_warning           Output warning messages about abnormal conditions \n                                and unknown constructs  (default=on)",
    00042   "      --msg_error             Output error messages  (default=on)",
    00043   "      --msg_info              Output informational messages about the progress \n                                of the library  (default=on)",
    00044   "      --msg_status            Output status messages  (default=on)",
    00045     0
    00046 };
    00047
    00048 typedef enum {ARG_NO
    00049   , ARG_FLAG
    00050   , ARG_STRING
    00051 } cmdline_parser_arg_type;
    00052
    00053 static
    00054 void clear_given (struct gengetopt_args_info *args_info);
    00055 static
    00056 void clear_args (struct gengetopt_args_info *args_info);
    00057
    00058 static int
    00059 cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info,
    00060                         struct cmdline_parser_params *params, const char *additional_error);
    00061
    00062
    00063 static char *
    00064 gengetopt_strdup (const char *s);
    00065
    00066 static
    00067 void clear_given (struct gengetopt_args_info *args_info)
    00068 {
    00069   args_info->help_given = 0 ;
    00070   args_info->version_given = 0 ;
    00071   args_info->import_format_given = 0 ;
    00072   args_info->list_import_formats_given = 0 ;
    00073   args_info->msg_parser_given = 0 ;
    00074   args_info->msg_debug_given = 0 ;
    00075   args_info->msg_warning_given = 0 ;
    00076   args_info->msg_error_given = 0 ;
    00077   args_info->msg_info_given = 0 ;
    00078   args_info->msg_status_given = 0 ;
    00079 }
    00080
    00081 static
    00082 void clear_args (struct gengetopt_args_info *args_info)
    00083 {
    00084   FIX_UNUSED (args_info);
    00085   args_info->import_format_arg = gengetopt_strdup ("AUTODETECT");
    00086   args_info->import_format_orig = NULL;
    00087   args_info->msg_parser_flag = 0;
    00088   args_info->msg_debug_flag = 0;
    00089   args_info->msg_warning_flag = 1;
    00090   args_info->msg_error_flag = 1;
    00091   args_info->msg_info_flag = 1;
    00092   args_info->msg_status_flag = 1;
    00093
    00094 }
    00095
    00096 static
    00097 void init_args_info(struct gengetopt_args_info *args_info)
    00098 {
    00099
    00100
    00101   args_info->help_help = gengetopt_args_info_help[0] ;
    00102   args_info->version_help = gengetopt_args_info_help[1] ;
    00103   args_info->import_format_help = gengetopt_args_info_help[2] ;
    00104   args_info->list_import_formats_help = gengetopt_args_info_help[3] ;
    00105   args_info->msg_parser_help = gengetopt_args_info_help[4] ;
    00106   args_info->msg_debug_help = gengetopt_args_info_help[5] ;
    00107   args_info->msg_warning_help = gengetopt_args_info_help[6] ;
    00108   args_info->msg_error_help = gengetopt_args_info_help[7] ;
    00109   args_info->msg_info_help = gengetopt_args_info_help[8] ;
    00110   args_info->msg_status_help = gengetopt_args_info_help[9] ;
    00111
    00112 }
    00113
    00114 void
    00115 cmdline_parser_print_version (void)
    00116 {
    00117   printf ("%s %s\n",
    00118      (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE),
    00119      CMDLINE_PARSER_VERSION);
    00120 }
    00121
    00122 static void print_help_common(void) {
    00123   cmdline_parser_print_version ();
    00124
    00125   if (strlen(gengetopt_args_info_purpose) > 0)
    00126     printf("\n%s\n", gengetopt_args_info_purpose);
    00127
    00128   if (strlen(gengetopt_args_info_usage) > 0)
    00129     printf("\n%s\n", gengetopt_args_info_usage);
    00130
    00131   printf("\n");
    00132
    00133   if (strlen(gengetopt_args_info_description) > 0)
    00134     printf("%s\n\n", gengetopt_args_info_description);
    00135 }
    00136
    00137 void
    00138 cmdline_parser_print_help (void)
    00139 {
    00140   int i = 0;
    00141   print_help_common();
    00142   while (gengetopt_args_info_help[i])
    00143     printf("%s\n", gengetopt_args_info_help[i++]);
    00144 }
    00145
    00146 void
    00147 cmdline_parser_init (struct gengetopt_args_info *args_info)
    00148 {
    00149   clear_given (args_info);
    00150   clear_args (args_info);
    00151   init_args_info (args_info);
    00152
    00153   args_info->inputs = 0;
    00154   args_info->inputs_num = 0;
    00155 }
    00156
    00157 void
    00158 cmdline_parser_params_init(struct cmdline_parser_params *params)
    00159 {
    00160   if (params)
    00161     {
    00162       params->override = 0;
    00163       params->initialize = 1;
    00164       params->check_required = 1;
    00165       params->check_ambiguity = 0;
    00166       params->print_errors = 1;
    00167     }
    00168 }
    00169
    00170 struct cmdline_parser_params *
    00171 cmdline_parser_params_create(void)
    00172 {
    00173   struct cmdline_parser_params *params =
    00174     (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params));
    00175   cmdline_parser_params_init(params);
    00176   return params;
    00177 }
    00178
    00179 static void
    00180 free_string_field (char **s)
    00181 {
    00182   if (*s)
    00183     {
    00184       free (*s);
    00185       *s = 0;
    00186     }
    00187 }
    00188
    00189
    00190 static void
    00191 cmdline_parser_release (struct gengetopt_args_info *args_info)
    00192 {
    00193   unsigned int i;
    00194   free_string_field (&(args_info->import_format_arg));
    00195   free_string_field (&(args_info->import_format_orig));
    00196
    00197
    00198   for (i = 0; i < args_info->inputs_num; ++i)
    00199     free (args_info->inputs [i]);
    00200
    00201   if (args_info->inputs_num)
    00202     free (args_info->inputs);
    00203
    00204   clear_given (args_info);
    00205 }
    00206
    00207
    00208 static void
    00209 write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[])
    00210 {
    00211   FIX_UNUSED (values);
    00212   if (arg) {
    00213     fprintf(outfile, "%s=\"%s\"\n", opt, arg);
    00214   } else {
    00215     fprintf(outfile, "%s\n", opt);
    00216   }
    00217 }
    00218
    00219
    00220 int
    00221 cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
    00222 {
    00223   int i = 0;
    00224
    00225   if (!outfile)
    00226     {
    00227       fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE);
    00228       return EXIT_FAILURE;
    00229     }
    00230
    00231   if (args_info->help_given)
    00232     write_into_file(outfile, "help", 0, 0 );
    00233   if (args_info->version_given)
    00234     write_into_file(outfile, "version", 0, 0 );
    00235   if (args_info->import_format_given)
    00236     write_into_file(outfile, "import-format", args_info->import_format_orig, 0);
    00237   if (args_info->list_import_formats_given)
    00238     write_into_file(outfile, "list-import-formats", 0, 0 );
    00239   if (args_info->msg_parser_given)
    00240     write_into_file(outfile, "msg_parser", 0, 0 );
    00241   if (args_info->msg_debug_given)
    00242     write_into_file(outfile, "msg_debug", 0, 0 );
    00243   if (args_info->msg_warning_given)
    00244     write_into_file(outfile, "msg_warning", 0, 0 );
    00245   if (args_info->msg_error_given)
    00246     write_into_file(outfile, "msg_error", 0, 0 );
    00247   if (args_info->msg_info_given)
    00248     write_into_file(outfile, "msg_info", 0, 0 );
    00249   if (args_info->msg_status_given)
    00250     write_into_file(outfile, "msg_status", 0, 0 );
    00251
    00252
    00253   i = EXIT_SUCCESS;
    00254   return i;
    00255 }
    00256
    00257 int
    00258 cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
    00259 {
    00260   FILE *outfile;
    00261   int i = 0;
    00262
    00263   outfile = fopen(filename, "w");
    00264
    00265   if (!outfile)
    00266     {
    00267       fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename);
    00268       return EXIT_FAILURE;
    00269     }
    00270
    00271   i = cmdline_parser_dump(outfile, args_info);
    00272   fclose (outfile);
    00273
    00274   return i;
    00275 }
    00276
    00277 void
    00278 cmdline_parser_free (struct gengetopt_args_info *args_info)
    00279 {
    00280   cmdline_parser_release (args_info);
    00281 }
    00282
    00284 char *
    00285 gengetopt_strdup (const char *s)
    00286 {
    00287   char *result = 0;
    00288   if (!s)
    00289     return result;
    00290
    00291   result = (char*)malloc(strlen(s) + 1);
    00292   if (result == (char*)0)
    00293     return (char*)0;
    00294   strcpy(result, s);
    00295   return result;
    00296 }
    00297
    00298 int
    00299 cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info)
    00300 {
    00301   return cmdline_parser2 (argc, argv, args_info, 0, 1, 1);
    00302 }
    00303
    00304 int
    00305 cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info,
    00306                    struct cmdline_parser_params *params)
    00307 {
    00308   int result;
    00309   result = cmdline_parser_internal (argc, argv, args_info, params, 0);
    00310
    00311   if (result == EXIT_FAILURE)
    00312     {
    00313       cmdline_parser_free (args_info);
    00314       exit (EXIT_FAILURE);
    00315     }
    00316
    00317   return result;
    00318 }
    00319
    00320 int
    00321 cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required)
    00322 {
    00323   int result;
    00324   struct cmdline_parser_params params;
    00325
    00326   params.override = override;
    00327   params.initialize = initialize;
    00328   params.check_required = check_required;
    00329   params.check_ambiguity = 0;
    00330   params.print_errors = 1;
    00331
    00332   result = cmdline_parser_internal (argc, argv, args_info, &params, 0);
    00333
    00334   if (result == EXIT_FAILURE)
    00335     {
    00336       cmdline_parser_free (args_info);
    00337       exit (EXIT_FAILURE);
    00338     }
    00339
    00340   return result;
    00341 }
    00342
    00343 int
    00344 cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name)
    00345 {
    00346   FIX_UNUSED (args_info);
    00347   FIX_UNUSED (prog_name);
    00348   return EXIT_SUCCESS;
    00349 }
    00350
    00351
    00352 static char *package_name = 0;
    00353
    00372 static
    00373 int update_arg(void *field, char **orig_field,
    00374                unsigned int *field_given, unsigned int *prev_given,
    00375                char *value, const char *possible_values[],
    00376                const char *default_value,
    00377                cmdline_parser_arg_type arg_type,
    00378                int check_ambiguity, int override,
    00379                int no_free, int multiple_option,
    00380                const char *long_opt, char short_opt,
    00381                const char *additional_error)
    00382 {
    00383   char *stop_char = 0;
    00384   const char *val = value;
    00385   int found;
    00386   char **string_field;
    00387   FIX_UNUSED (field);
    00388
    00389   stop_char = 0;
    00390   found = 0;
    00391
    00392   if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))
    00393     {
    00394       if (short_opt != '-')
    00395         fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n",
    00396                package_name, long_opt, short_opt,
    00397                (additional_error ? additional_error : ""));
    00398       else
    00399         fprintf (stderr, "%s: `--%s' option given more than once%s\n",
    00400                package_name, long_opt,
    00401                (additional_error ? additional_error : ""));
    00402       return 1; /* failure */
    00403     }
    00404
    00405   FIX_UNUSED (default_value);
    00406
    00407   if (field_given && *field_given && ! override)
    00408     return 0;
    00409   if (prev_given)
    00410     (*prev_given)++;
    00411   if (field_given)
    00412     (*field_given)++;
    00413   if (possible_values)
    00414     val = possible_values[found];
    00415
    00416   switch(arg_type) {
    00417   case ARG_FLAG:
    00418     *((int *)field) = !*((int *)field);
    00419     break;
    00420   case ARG_STRING:
    00421     if (val) {
    00422       string_field = (char **)field;
    00423       if (!no_free && *string_field)
    00424         free (*string_field); /* free previous string */
    00425       *string_field = gengetopt_strdup (val);
    00426     }
    00427     break;
    00428   default:
    00429     break;
    00430   };
    00431
    00432
    00433   /* store the original value */
    00434   switch(arg_type) {
    00435   case ARG_NO:
    00436   case ARG_FLAG:
    00437     break;
    00438   default:
    00439     if (value && orig_field) {
    00440       if (no_free) {
    00441         *orig_field = value;
    00442       } else {
    00443         if (*orig_field)
    00444           free (*orig_field); /* free previous string */
    00445         *orig_field = gengetopt_strdup (value);
    00446       }
    00447     }
    00448   };
    00449
    00450   return 0; /* OK */
    00451 }
    00452
    00453
    00454 int
    00455 cmdline_parser_internal (
    00456   int argc, char **argv, struct gengetopt_args_info *args_info,
    00457                         struct cmdline_parser_params *params, const char *additional_error)
    00458 {
    00459   int c;        /* Character of the parsed option.  */
    00460
    00461   int error = 0;
    00462   struct gengetopt_args_info local_args_info;
    00463
    00464   int override;
    00465   int initialize;
    00466   int check_required;
    00467   int check_ambiguity;
    00468
    00469   package_name = argv[0];
    00470
    00471   override = params->override;
    00472   initialize = params->initialize;
    00473   check_required = params->check_required;
    00474   check_ambiguity = params->check_ambiguity;
    00475
    00476   if (initialize)
    00477     cmdline_parser_init (args_info);
    00478
    00479   cmdline_parser_init (&local_args_info);
    00480
    00481   optarg = 0;
    00482   optind = 0;
    00483   opterr = params->print_errors;
    00484   optopt = '?';
    00485
    00486   while (1)
    00487     {
    00488       int option_index = 0;
    00489
    00490       static struct option long_options[] = {
    00491         { "help",       0, NULL, 'h' },
    00492         { "version",    0, NULL, 'V' },
    00493         { "import-format",      1, NULL, 'f' },
    00494         { "list-import-formats",        0, NULL, 0 },
    00495         { "msg_parser", 0, NULL, 0 },
    00496         { "msg_debug",  0, NULL, 0 },
    00497         { "msg_warning",        0, NULL, 0 },
    00498         { "msg_error",  0, NULL, 0 },
    00499         { "msg_info",   0, NULL, 0 },
    00500         { "msg_status", 0, NULL, 0 },
    00501         { 0,  0, 0, 0 }
    00502       };
    00503
    00504       c = getopt_long (argc, argv, "hVf:", long_options, &option_index);
    00505
    00506       if (c == -1) break;       /* Exit from `while (1)' loop.  */
    00507
    00508       switch (c)
    00509         {
    00510         case 'h':       /* Print help and exit.  */
    00511           cmdline_parser_print_help ();
    00512           cmdline_parser_free (&local_args_info);
    00513           exit (EXIT_SUCCESS);
    00514
    00515         case 'V':       /* Print version and exit.  */
    00516           cmdline_parser_print_version ();
    00517           cmdline_parser_free (&local_args_info);
    00518           exit (EXIT_SUCCESS);
    00519
    00520         case 'f':       /* Force the file format of the file(s) specified.  */
    00521
    00522
    00523           if (update_arg( (void *)&(args_info->import_format_arg),
    00524                &(args_info->import_format_orig), &(args_info->import_format_given),
    00525               &(local_args_info.import_format_given), optarg, 0, "AUTODETECT", ARG_STRING,
    00526               check_ambiguity, override, 0, 0,
    00527               "import-format", 'f',
    00528               additional_error))
    00529             goto failure;
    00530
    00531           break;
    00532
    00533         case 0: /* Long option with no short option */
    00534           /* List available import file formats 'import-format' command.  */
    00535           if (strcmp (long_options[option_index].name, "list-import-formats") == 0)
    00536           {
    00537
    00538
    00539             if (update_arg( 0 ,
    00540                  0 , &(args_info->list_import_formats_given),
    00541                 &(local_args_info.list_import_formats_given), optarg, 0, 0, ARG_NO,
    00542                 check_ambiguity, override, 0, 0,
    00543                 "list-import-formats", '-',
    00544                 additional_error))
    00545               goto failure;
    00546
    00547           }
    00548           /* Output file parsing messages.  */
    00549           else if (strcmp (long_options[option_index].name, "msg_parser") == 0)
    00550           {
    00551
    00552
    00553             if (update_arg((void *)&(args_info->msg_parser_flag), 0, &(args_info->msg_parser_given),
    00554                 &(local_args_info.msg_parser_given), optarg, 0, 0, ARG_FLAG,
    00555                 check_ambiguity, override, 1, 0, "msg_parser", '-',
    00556                 additional_error))
    00557               goto failure;
    00558
    00559           }
    00560           /* Output messages meant for debuging.  */
    00561           else if (strcmp (long_options[option_index].name, "msg_debug") == 0)
    00562           {
    00563
    00564
    00565             if (update_arg((void *)&(args_info->msg_debug_flag), 0, &(args_info->msg_debug_given),
    00566                 &(local_args_info.msg_debug_given), optarg, 0, 0, ARG_FLAG,
    00567                 check_ambiguity, override, 1, 0, "msg_debug", '-',
    00568                 additional_error))
    00569               goto failure;
    00570
    00571           }
    00572           /* Output warning messages about abnormal conditions and unknown constructs.  */
    00573           else if (strcmp (long_options[option_index].name, "msg_warning") == 0)
    00574           {
    00575
    00576
    00577             if (update_arg((void *)&(args_info->msg_warning_flag), 0, &(args_info->msg_warning_given),
    00578                 &(local_args_info.msg_warning_given), optarg, 0, 0, ARG_FLAG,
    00579                 check_ambiguity, override, 1, 0, "msg_warning", '-',
    00580                 additional_error))
    00581               goto failure;
    00582
    00583           }
    00584           /* Output error messages.  */
    00585           else if (strcmp (long_options[option_index].name, "msg_error") == 0)
    00586           {
    00587
    00588
    00589             if (update_arg((void *)&(args_info->msg_error_flag), 0, &(args_info->msg_error_given),
    00590                 &(local_args_info.msg_error_given), optarg, 0, 0, ARG_FLAG,
    00591                 check_ambiguity, override, 1, 0, "msg_error", '-',
    00592                 additional_error))
    00593               goto failure;
    00594
    00595           }
    00596           /* Output informational messages about the progress of the library.  */
    00597           else if (strcmp (long_options[option_index].name, "msg_info") == 0)
    00598           {
    00599
    00600
    00601             if (update_arg((void *)&(args_info->msg_info_flag), 0, &(args_info->msg_info_given),
    00602                 &(local_args_info.msg_info_given), optarg, 0, 0, ARG_FLAG,
    00603                 check_ambiguity, override, 1, 0, "msg_info", '-',
    00604                 additional_error))
    00605               goto failure;
    00606
    00607           }
    00608           /* Output status messages.  */
    00609           else if (strcmp (long_options[option_index].name, "msg_status") == 0)
    00610           {
    00611
    00612
    00613             if (update_arg((void *)&(args_info->msg_status_flag), 0, &(args_info->msg_status_given),
    00614                 &(local_args_info.msg_status_given), optarg, 0, 0, ARG_FLAG,
    00615                 check_ambiguity, override, 1, 0, "msg_status", '-',
    00616                 additional_error))
    00617               goto failure;
    00618
    00619           }
    00620
    00621           break;
    00622         case '?':       /* Invalid option.  */
    00623           /* `getopt_long' already printed an error message.  */
    00624           goto failure;
    00625
    00626         default:        /* bug: option not considered.  */
    00627           fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : ""));
    00628           abort ();
    00629         } /* switch */
    00630     } /* while */
    00631
    00632
    00633
    00634
    00635   cmdline_parser_release (&local_args_info);
    00636
    00637   if ( error )
    00638     return (EXIT_FAILURE);
    00639
    00640   if (optind < argc)
    00641     {
    00642       int i = 0 ;
    00643       int found_prog_name = 0;
    00644       /* whether program name, i.e., argv[0], is in the remaining args
    00645          (this may happen with some implementations of getopt,
    00646           but surely not with the one included by gengetopt) */
    00647
    00648       i = optind;
    00649       while (i < argc)
    00650         if (argv[i++] == argv[0]) {
    00651           found_prog_name = 1;
    00652           break;
    00653         }
    00654       i = 0;
    00655
    00656       args_info->inputs_num = argc - optind - found_prog_name;
    00657       args_info->inputs =
    00658         (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
    00659       while (optind < argc)
    00660         if (argv[optind++] != argv[0])
    00661           args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ;
    00662     }
    00663
    00664   return 0;
    00665
    00666 failure:
    00667
    00668   cmdline_parser_release (&local_args_info);
    00669   return (EXIT_FAILURE);
    00670 }