void parse_options(int argc, char **argv, const OptionDef *options,

                   void (* parse_arg_function)(const char*))

{

    const char *opt, *arg;

    int optindex, handleoptions=1;

    const OptionDef *po;



    /* parse options */

    optindex = 1;

    while (optindex < argc) {

        opt = argv[optindex++];



        if (handleoptions && opt[0] == '-' && opt[1] != '\0') {

            int bool_val = 1;

            if (opt[1] == '-' && opt[2] == '\0') {

                handleoptions = 0;

                continue;

            }

            opt++;

            po= find_option(options, opt);

            if (!po->name && opt[0] == 'n' && opt[1] == 'o') {

                /* handle 'no' bool option */

                po = find_option(options, opt + 2);

                if (!(po->name && (po->flags & OPT_BOOL)))

                    goto unknown_opt;

                bool_val = 0;

            }

            if (!po->name)

                po= find_option(options, "default");

            if (!po->name) {

unknown_opt:

                fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);

                exit(1);

            }

            arg = NULL;

            if (po->flags & HAS_ARG) {

                arg = argv[optindex++];

                if (!arg) {

                    fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);

                    exit(1);

                }

            }

            if (po->flags & OPT_STRING) {

                char *str;

                str = av_strdup(arg);

                *po->u.str_arg = str;

            } else if (po->flags & OPT_BOOL) {

                *po->u.int_arg = bool_val;

            } else if (po->flags & OPT_INT) {

                *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);

            } else if (po->flags & OPT_INT64) {

                *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);

            } else if (po->flags & OPT_FLOAT) {

                *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);

            } else if (po->flags & OPT_FUNC2) {

                if (po->u.func2_arg(opt, arg) < 0) {

                    fprintf(stderr, "%s: invalid value '%s' for option '%s'\n", argv[0], arg, opt);

                    exit(1);

                }

            } else {

                po->u.func_arg(arg);

            }

            if(po->flags & OPT_EXIT)

                exit(0);

        } else {

            if (parse_arg_function)

                parse_arg_function(opt);

        }

    }

}

void parse_options(int argc, char **argv, const OptionDef *options,

                   void (* parse_arg_function)(const char*))

{

    const char *opt, *arg;

    int optindex, handleoptions=1;

    const OptionDef *po;



    

    optindex = 1;

    while (optindex < argc) {

        opt = argv[optindex++];



        if (handleoptions && opt[0] == '-' && opt[1] != '\0') {

            int bool_val = 1;

            if (opt[1] == '-' && opt[2] == '\0') {

                handleoptions = 0;

                continue;

            }

            opt++;

            po= find_option(options, opt);

            if (!po->name && opt[0] == 'n' && opt[1] == 'o') {

                

                po = find_option(options, opt + 2);

                if (!(po->name && (po->flags & OPT_BOOL)))

                    goto unknown_opt;

                bool_val = 0;

            }

            if (!po->name)

                po= find_option(options, "default");

            if (!po->name) {

unknown_opt:

                fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);

                exit(1);

            }

            arg = NULL;

            if (po->flags & HAS_ARG) {

                arg = argv[optindex++];

                if (!arg) {

                    fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);

                    exit(1);

                }

            }

            if (po->flags & OPT_STRING) {

                char *str;

                str = av_strdup(arg);

                *po->u.str_arg = str;

            } else if (po->flags & OPT_BOOL) {

                *po->u.int_arg = bool_val;

            } else if (po->flags & OPT_INT) {

                *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);

            } else if (po->flags & OPT_INT64) {

                *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);

            } else if (po->flags & OPT_FLOAT) {

                *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);

            } else if (po->flags & OPT_FUNC2) {

                if (po->u.func2_arg(opt, arg) < 0) {

                    fprintf(stderr, "%s: invalid value '%s' for option '%s'\n", argv[0], arg, opt);

                    exit(1);

                }

            } else {

                po->u.func_arg(arg);

            }

            if(po->flags & OPT_EXIT)

                exit(0);

        } else {

            if (parse_arg_function)

                parse_arg_function(opt);

        }

    }

}

                    fprintf(stderr, "%s: invalid value '%s' for option '%s'\n", argv[0], arg, opt);
VAR_4voidVAR_4 VAR_4parse_optionsVAR_4(VAR_4intVAR_4 VAR_4VAR_0VAR_4, VAR_4charVAR_4 **VAR_4VAR_1VAR_4, VAR_4constVAR_4 VAR_4OptionDefVAR_4 *VAR_4VAR_2VAR_4,

                   VAR_4voidVAR_4 (* VAR_4VAR_3VAR_4)(VAR_4constVAR_4 VAR_4charVAR_4*))

{

    VAR_4constVAR_4 VAR_4charVAR_4 *VAR_4optVAR_4, *VAR_4argVAR_4;

    VAR_4intVAR_4 VAR_4optindexVAR_4, VAR_4handleoptionsVAR_4=VAR_41VAR_4;

    VAR_4constVAR_4 VAR_4OptionDefVAR_4 *VAR_4poVAR_4;



    

    VAR_4optindexVAR_4 = VAR_41VAR_4;

    VAR_4whileVAR_4 (VAR_4optindexVAR_4 < VAR_4VAR_0VAR_4) {

        VAR_4optVAR_4 = VAR_4VAR_1VAR_4[VAR_4optindexVAR_4++];



        VAR_4ifVAR_4 (VAR_4handleoptionsVAR_4 && VAR_4optVAR_4[VAR_40VAR_4] == '-' && VAR_4optVAR_4[VAR_41VAR_4] != '\VAR_40VAR_4') {

            VAR_4intVAR_4 VAR_4bool_valVAR_4 = VAR_41VAR_4;

            VAR_4ifVAR_4 (VAR_4optVAR_4[VAR_41VAR_4] == '-' && VAR_4optVAR_4[VAR_42VAR_4] == '\VAR_40VAR_4') {

                VAR_4handleoptionsVAR_4 = VAR_40VAR_4;

                VAR_4continueVAR_4;

            }

            VAR_4optVAR_4++;

            VAR_4poVAR_4= VAR_4find_optionVAR_4(VAR_4VAR_2VAR_4, VAR_4optVAR_4);

            VAR_4ifVAR_4 (!VAR_4poVAR_4->VAR_4nameVAR_4 && VAR_4optVAR_4[VAR_40VAR_4] == 'VAR_4nVAR_4' && VAR_4optVAR_4[VAR_41VAR_4] == 'VAR_4oVAR_4') {

                

                VAR_4poVAR_4 = VAR_4find_optionVAR_4(VAR_4VAR_2VAR_4, VAR_4optVAR_4 + VAR_42VAR_4);

                VAR_4ifVAR_4 (!(VAR_4poVAR_4->VAR_4nameVAR_4 && (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_BOOLVAR_4)))

                    VAR_4gotoVAR_4 VAR_4unknown_optVAR_4;

                VAR_4bool_valVAR_4 = VAR_40VAR_4;

            }

            VAR_4ifVAR_4 (!VAR_4poVAR_4->VAR_4nameVAR_4)

                VAR_4poVAR_4= VAR_4find_optionVAR_4(VAR_4VAR_2VAR_4, "VAR_4defaultVAR_4");

            VAR_4ifVAR_4 (!VAR_4poVAR_4->VAR_4nameVAR_4) {

VAR_4unknown_optVAR_4:

                VAR_4fprintfVAR_4(VAR_4stderrVAR_4, "%VAR_4sVAR_4: VAR_4unrecognizedVAR_4 VAR_4optionVAR_4 '%VAR_4sVAR_4'\VAR_4nVAR_4", VAR_4VAR_1VAR_4[VAR_40VAR_4], VAR_4optVAR_4);

                VAR_4exitVAR_4(VAR_41VAR_4);

            }

            VAR_4argVAR_4 = VAR_4NULLVAR_4;

            VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4HAS_ARGVAR_4) {

                VAR_4argVAR_4 = VAR_4VAR_1VAR_4[VAR_4optindexVAR_4++];

                VAR_4ifVAR_4 (!VAR_4argVAR_4) {

                    VAR_4fprintfVAR_4(VAR_4stderrVAR_4, "%VAR_4sVAR_4: VAR_4missingVAR_4 VAR_4argumentVAR_4 VAR_4forVAR_4 VAR_4optionVAR_4 '%VAR_4sVAR_4'\VAR_4nVAR_4", VAR_4VAR_1VAR_4[VAR_40VAR_4], VAR_4optVAR_4);

                    VAR_4exitVAR_4(VAR_41VAR_4);

                }

            }

            VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_STRINGVAR_4) {

                VAR_4charVAR_4 *VAR_4strVAR_4;

                VAR_4strVAR_4 = VAR_4av_strdupVAR_4(VAR_4argVAR_4);

                *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4str_argVAR_4 = VAR_4strVAR_4;

            } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_BOOLVAR_4) {

                *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4int_argVAR_4 = VAR_4bool_valVAR_4;

            } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_INTVAR_4) {

                *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4int_argVAR_4 = VAR_4parse_number_or_dieVAR_4(VAR_4optVAR_4, VAR_4argVAR_4, VAR_4OPT_INT64VAR_4, VAR_4INT_MINVAR_4, VAR_4INT_MAXVAR_4);

            } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_INT64VAR_4) {

                *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4int64_argVAR_4 = VAR_4parse_number_or_dieVAR_4(VAR_4optVAR_4, VAR_4argVAR_4, VAR_4OPT_INT64VAR_4, VAR_4INT64_MINVAR_4, VAR_4INT64_MAXVAR_4);

            } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_FLOATVAR_4) {

                *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4float_argVAR_4 = VAR_4parse_number_or_dieVAR_4(VAR_4optVAR_4, VAR_4argVAR_4, VAR_4OPT_FLOATVAR_4, -VAR_41VAR_4.VAR_40VAR_4/VAR_40VAR_4.VAR_40VAR_4, VAR_41VAR_4.VAR_40VAR_4/VAR_40VAR_4.VAR_40VAR_4);

            } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_FUNC2VAR_4) {

                VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4uVAR_4.VAR_4func2_argVAR_4(VAR_4optVAR_4, VAR_4argVAR_4) < VAR_40VAR_4) {

                    VAR_4fprintfVAR_4(VAR_4stderrVAR_4, "%VAR_4sVAR_4: VAR_4invalidVAR_4 VAR_4valueVAR_4 '%VAR_4sVAR_4' VAR_4forVAR_4 VAR_4optionVAR_4 '%VAR_4sVAR_4'\VAR_4nVAR_4", VAR_4VAR_1VAR_4[VAR_40VAR_4], VAR_4argVAR_4, VAR_4optVAR_4);

                    VAR_4exitVAR_4(VAR_41VAR_4);

                }

            } VAR_4elseVAR_4 {

                VAR_4poVAR_4->VAR_4uVAR_4.VAR_4func_argVAR_4(VAR_4argVAR_4);

            }

            VAR_4ifVAR_4(VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_EXITVAR_4)

                VAR_4exitVAR_4(VAR_40VAR_4);

        } VAR_4elseVAR_4 {

            VAR_4ifVAR_4 (VAR_4VAR_3VAR_4)

                VAR_4VAR_3VAR_4(VAR_4optVAR_4);

        }

    }

}

VAR_4voidVAR_4 VAR_4parse_optionsVAR_4(VAR_4intVAR_4 VAR_4VAR_0VAR_4, VAR_4charVAR_4 **VAR_4VAR_1VAR_4, VAR_4constVAR_4 VAR_4OptionDefVAR_4 *VAR_4VAR_2VAR_4,
VAR_4voidVAR_4 (* VAR_4VAR_3VAR_4)(VAR_4constVAR_4 VAR_4charVAR_4*))
{ VAR_4constVAR_4 VAR_4charVAR_4 *VAR_4optVAR_4, *VAR_4argVAR_4; VAR_4intVAR_4 VAR_4optindexVAR_4, VAR_4handleoptionsVAR_4=VAR_41VAR_4; VAR_4constVAR_4 VAR_4OptionDefVAR_4 *VAR_4poVAR_4; VAR_4optindexVAR_4 = VAR_41VAR_4; VAR_4whileVAR_4 (VAR_4optindexVAR_4 < VAR_4VAR_0VAR_4) { VAR_4optVAR_4 = VAR_4VAR_1VAR_4[VAR_4optindexVAR_4++]; VAR_4ifVAR_4 (VAR_4handleoptionsVAR_4 && VAR_4optVAR_4[VAR_40VAR_4] == '-' && VAR_4optVAR_4[VAR_41VAR_4] != '\VAR_40VAR_4') { VAR_4intVAR_4 VAR_4bool_valVAR_4 = VAR_41VAR_4; VAR_4ifVAR_4 (VAR_4optVAR_4[VAR_41VAR_4] == '-' && VAR_4optVAR_4[VAR_42VAR_4] == '\VAR_40VAR_4') { VAR_4handleoptionsVAR_4 = VAR_40VAR_4; VAR_4continueVAR_4; } VAR_4optVAR_4++; VAR_4poVAR_4= VAR_4find_optionVAR_4(VAR_4VAR_2VAR_4, VAR_4optVAR_4); VAR_4ifVAR_4 (!VAR_4poVAR_4->VAR_4nameVAR_4 && VAR_4optVAR_4[VAR_40VAR_4] == 'VAR_4nVAR_4' && VAR_4optVAR_4[VAR_41VAR_4] == 'VAR_4oVAR_4') { VAR_4poVAR_4 = VAR_4find_optionVAR_4(VAR_4VAR_2VAR_4, VAR_4optVAR_4 + VAR_42VAR_4); VAR_4ifVAR_4 (!(VAR_4poVAR_4->VAR_4nameVAR_4 && (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_BOOLVAR_4)))
VAR_4gotoVAR_4 VAR_4unknown_optVAR_4; VAR_4bool_valVAR_4 = VAR_40VAR_4; } VAR_4ifVAR_4 (!VAR_4poVAR_4->VAR_4nameVAR_4)
VAR_4poVAR_4= VAR_4find_optionVAR_4(VAR_4VAR_2VAR_4, "VAR_4defaultVAR_4"); VAR_4ifVAR_4 (!VAR_4poVAR_4->VAR_4nameVAR_4) { VAR_4unknown_optVAR_4:
VAR_4fprintfVAR_4(VAR_4stderrVAR_4, "%VAR_4sVAR_4: VAR_4unrecognizedVAR_4 VAR_4optionVAR_4 '%VAR_4sVAR_4'\VAR_4nVAR_4", VAR_4VAR_1VAR_4[VAR_40VAR_4], VAR_4optVAR_4); VAR_4exitVAR_4(VAR_41VAR_4); } VAR_4argVAR_4 = VAR_4NULLVAR_4; VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4HAS_ARGVAR_4) { VAR_4argVAR_4 = VAR_4VAR_1VAR_4[VAR_4optindexVAR_4++]; VAR_4ifVAR_4 (!VAR_4argVAR_4) { VAR_4fprintfVAR_4(VAR_4stderrVAR_4, "%VAR_4sVAR_4: VAR_4missingVAR_4 VAR_4argumentVAR_4 VAR_4forVAR_4 VAR_4optionVAR_4 '%VAR_4sVAR_4'\VAR_4nVAR_4", VAR_4VAR_1VAR_4[VAR_40VAR_4], VAR_4optVAR_4); VAR_4exitVAR_4(VAR_41VAR_4); } } VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_STRINGVAR_4) { VAR_4charVAR_4 *VAR_4strVAR_4; VAR_4strVAR_4 = VAR_4av_strdupVAR_4(VAR_4argVAR_4); *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4str_argVAR_4 = VAR_4strVAR_4; } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_BOOLVAR_4) { *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4int_argVAR_4 = VAR_4bool_valVAR_4; } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_INTVAR_4) { *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4int_argVAR_4 = VAR_4parse_number_or_dieVAR_4(VAR_4optVAR_4, VAR_4argVAR_4, VAR_4OPT_INT64VAR_4, VAR_4INT_MINVAR_4, VAR_4INT_MAXVAR_4); } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_INT64VAR_4) { *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4int64_argVAR_4 = VAR_4parse_number_or_dieVAR_4(VAR_4optVAR_4, VAR_4argVAR_4, VAR_4OPT_INT64VAR_4, VAR_4INT64_MINVAR_4, VAR_4INT64_MAXVAR_4); } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_FLOATVAR_4) { *VAR_4poVAR_4->VAR_4uVAR_4.VAR_4float_argVAR_4 = VAR_4parse_number_or_dieVAR_4(VAR_4optVAR_4, VAR_4argVAR_4, VAR_4OPT_FLOATVAR_4, -VAR_41VAR_4.VAR_40VAR_4/VAR_40VAR_4.VAR_40VAR_4, VAR_41VAR_4.VAR_40VAR_4/VAR_40VAR_4.VAR_40VAR_4); } VAR_4elseVAR_4 VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_FUNC2VAR_4) { VAR_4ifVAR_4 (VAR_4poVAR_4->VAR_4uVAR_4.VAR_4func2_argVAR_4(VAR_4optVAR_4, VAR_4argVAR_4) < VAR_40VAR_4) { VAR_4fprintfVAR_4(VAR_4stderrVAR_4, "%VAR_4sVAR_4: VAR_4invalidVAR_4 VAR_4valueVAR_4 '%VAR_4sVAR_4' VAR_4forVAR_4 VAR_4optionVAR_4 '%VAR_4sVAR_4'\VAR_4nVAR_4", VAR_4VAR_1VAR_4[VAR_40VAR_4], VAR_4argVAR_4, VAR_4optVAR_4); VAR_4exitVAR_4(VAR_41VAR_4); } } VAR_4elseVAR_4 { VAR_4poVAR_4->VAR_4uVAR_4.VAR_4func_argVAR_4(VAR_4argVAR_4); } VAR_4ifVAR_4(VAR_4poVAR_4->VAR_4flagsVAR_4 & VAR_4OPT_EXITVAR_4)
VAR_4exitVAR_4(VAR_40VAR_4); } VAR_4elseVAR_4 { VAR_4ifVAR_4 (VAR_4VAR_3VAR_4)
VAR_4VAR_3VAR_4(VAR_4optVAR_4); } } }