/* * Various utilities for command line tools * Copyright (c) 2000-2003 Fabrice Bellard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "common.h" #include "avformat.h" #include "cmdutils.h" void show_help_options(const OptionDef *options) { const OptionDef *po; int i, expert, first; printf("Main options are:\n"); for(i=0;i<2;i++) { first = 1; for(po = options; po->name != NULL; po++) { char buf[64]; expert = (po->flags & OPT_EXPERT) != 0; if (expert == i) { if (expert && first) { printf("\nAdvanced options are:\n"); first = 0; } strcpy(buf, po->name); if (po->flags & HAS_ARG) { strcat(buf, " "); strcat(buf, po->argname); } printf("-%-17s %s\n", buf, po->help); } } } } void parse_options(int argc, char **argv, const OptionDef *options) { const char *opt, *arg; int optindex; const OptionDef *po; /* parse options */ optindex = 1; while (optindex < argc) { opt = argv[optindex++]; if (opt[0] == '-' && opt[1] != '\0') { po = options; while (po->name != NULL) { if (!strcmp(opt + 1, po->name)) break; po++; } if (!po->name) { 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 = strdup(arg); *po->u.str_arg = str; } else if (po->flags & OPT_BOOL) { *po->u.int_arg = 1; } else { po->u.func_arg(arg); } } else { parse_arg_file(opt); } } } void print_error(const char *filename, int err) { switch(err) { case AVERROR_NUMEXPECTED: fprintf(stderr, "%s: Incorrect image filename syntax.\n" "Use '%%d' to specify the image number:\n" " for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n" " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'.\n", filename); break; case AVERROR_INVALIDDATA: fprintf(stderr, "%s: Error while parsing header\n", filename); break; case AVERROR_NOFMT: fprintf(stderr, "%s: Unknown format\n", filename); break; default: fprintf(stderr, "%s: Error while opening file\n", filename); break; } }