/* * cueconvert.c -- convert between cue/toc formats * * Copyright (C) 2004, 2005, 2006, 2007 Svend Sorensen * For license terms, see the file COPYING in this distribution. */ #include /* getopt_long() */ #include /* fprintf(), printf(), snprintf(), stderr */ #include /* exit() */ #include /* strcasecmp() */ #include "cuefile.h" #if HAVE_CONFIG_H #include "config.h" #else /* not HAVE_CONFIG_H */ #define PACKAGE_STRING "cueconvert" #endif /* HAVE_CONFIG_H */ char *progname; /* Print usage information and exit */ void usage(int status) { if (0 == status) { printf("Usage: %s [option...] [infile [outfile]]\n", progname); printf("Convert file between the CUE and TOC formats.\n" "\n" "OPTIONS\n" "-h, --help print usage\n" "-i, --input-format cue|toc set format of input file\n" "-o, --output-format cue|toc set format of output file\n" "-V, --version print version information\n"); } else { fprintf(stderr, "Try `%s --help' for more information.\n", progname); } exit (status); } /* Print version information and exit */ void version() { printf("%s\n", PACKAGE_STRING); exit(0); } int convert(char *iname, int iformat, char *oname, int oformat) { Cd *cd = NULL; if (NULL == (cd = cf_parse(iname, &iformat))) { fprintf(stderr, "%s: error: unable to parse input file" " `%s'\n", progname, iname); return -1; } if (UNKNOWN == oformat) { /* first use file suffix */ if (UNKNOWN == (oformat = cf_format_from_suffix(oname))) { /* then use opposite of input format */ switch(iformat) { case CUE: oformat = TOC; break; case TOC: oformat = CUE; break; } } } return cf_print(oname, &oformat, cd); } int main(int argc, char *argv[]) { int iformat = UNKNOWN; int oformat = UNKNOWN; int ret = 0; /* return value of convert() */ /* option variables */ int c; /* getopt_long() variables */ extern char *optarg; extern int optind; static struct option longopts[] = { {"help", no_argument, NULL, 'h'}, {"input-format", required_argument, NULL, 'i'}, {"output-format", required_argument, NULL, 'o'}, {"version", no_argument, NULL, 'V'}, {NULL, 0, NULL, 0} }; progname = argv[0]; while (-1 != (c = getopt_long(argc, argv, "hi:o:V", longopts, NULL))) { switch (c) { case 'h': usage(0); break; case 'i': if (0 == strcmp("cue", optarg)) { iformat = CUE; } else if (0 == strcmp("toc", optarg)) { iformat = TOC; } else { fprintf(stderr, "%s: error: unknown input file" " format `%s'\n", progname, optarg); usage(1); } break; case 'o': if (0 == strcmp("cue", optarg)) { oformat = CUE; } else if (0 == strcmp("toc", optarg)) { oformat = TOC; } else { fprintf(stderr, "%s: error: unknown output file" " format `%s'\n", progname, optarg); usage(1); } break; case 'V': version(); break; default: usage(1); break; } } /* What we do depends on the number of operands. */ if (optind == argc) { /* No operands: report breakpoints of stdin. */ ret = convert("-", iformat, "-", oformat); } else if (optind == argc - 1) { /* One operand: convert operand file to stdout. */ ret = convert(argv[optind], iformat, "-", oformat); } else if (optind == argc - 2) { /* Two operands: convert input file to output file. */ ret = convert(argv[optind], iformat, argv[optind + 1], oformat); } else { usage(1); } return ret; }