imported sources
This commit is contained in:
39
tools/Makefile
Normal file
39
tools/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
CPPFLAGS+= -I../lib
|
||||
LDFLAGS+= -L../lib
|
||||
LDLIBS+= -lcuefile
|
||||
|
||||
TARGETS= cuebreakpoints cueconvert cueprint
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
rm -f $(TARGETS)
|
||||
rm -f *.o
|
||||
|
||||
INSTALL= install
|
||||
INSTALL_PROGRAM= $(INSTALL)
|
||||
INSTALL_DATA= $(INSTALL) -m 644
|
||||
|
||||
prefix= /usr/local
|
||||
exec_prefix= $(prefix)
|
||||
bindir= $(exec_prefix)/bin
|
||||
DESTDIR=
|
||||
|
||||
install: all
|
||||
$(INSTALL) -d $(DESTDIR)$(bindir)
|
||||
for i in $(TARGETS) ; do \
|
||||
$(INSTALL_PROGRAM) $$i $(DESTDIR)$(bindir)/$$i ; \
|
||||
done
|
||||
|
||||
uninstall:
|
||||
-for i in $(TARGETS) ; do \
|
||||
rm -f $(DESTDIR)$(bindir)/$$i ; \
|
||||
done
|
||||
|
||||
# dependancies
|
||||
# generated by `gcc -MM *.c'
|
||||
|
||||
cuebreakpoints.o: cuebreakpoints.c ../lib/cuefile.h ../lib/cd.h \
|
||||
../lib/cdtext.h
|
||||
cueconvert.o: cueconvert.c ../lib/cuefile.h ../lib/cd.h ../lib/cdtext.h
|
||||
cueprint.o: cueprint.c ../lib/cuefile.h ../lib/cd.h ../lib/cdtext.h
|
||||
109
tools/cuebreakpoints.c
Normal file
109
tools/cuebreakpoints.c
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* cuebreakpoints.c -- print track break points
|
||||
*
|
||||
* Copyright (C) 2004 Svend Sorensen
|
||||
* For license terms, see the file COPYING in this distribution.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "cuefile.h"
|
||||
#include "time.h"
|
||||
|
||||
char *progname;
|
||||
|
||||
void usage (int status)
|
||||
{
|
||||
if (0 == status) {
|
||||
fprintf(stdout, "%s: usage: cuebreakpoints [-h] [-i cue|toc] [file...]\n", progname);
|
||||
fputs("\
|
||||
\n\
|
||||
OPTIONS\n\
|
||||
-h print usage\n\
|
||||
-i cue|toc set format of file(s)\n\
|
||||
", stdout);
|
||||
} else {
|
||||
fprintf(stderr, "%s: syntax error\n", progname);
|
||||
fprintf(stderr, "run `%s -h' for usage\n", progname);
|
||||
}
|
||||
|
||||
exit (status);
|
||||
}
|
||||
|
||||
void print_m_ss_ff (long frame)
|
||||
{
|
||||
int m, s, f;
|
||||
|
||||
time_frame_to_msf(frame, &m, &s, &f);
|
||||
printf ("%d:%02d.%02d\n", m, s, f);
|
||||
}
|
||||
|
||||
void print_breaks (Cd *cd)
|
||||
{
|
||||
int i;
|
||||
long b;
|
||||
Track *track;
|
||||
|
||||
for (i = 1; i < cd_get_ntrack(cd); i++) {
|
||||
track = cd_get_track(cd, i);
|
||||
/* don't print zero indexes */
|
||||
b = track_get_start(track) + track_get_index(track, 1) - track_get_zero_pre(track);
|
||||
if (0 != b)
|
||||
print_m_ss_ff(b);
|
||||
}
|
||||
}
|
||||
|
||||
int breaks (char *name, int format)
|
||||
{
|
||||
Cd *cd = NULL;
|
||||
|
||||
if (NULL == (cd = cf_parse(name, &format))) {
|
||||
fprintf(stderr, "%s: input file error\n", name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
print_breaks(cd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int format = UNKNOWN;
|
||||
|
||||
/* option variables */
|
||||
char c;
|
||||
/* getopt() variables */
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
progname = *argv;
|
||||
|
||||
while (-1 != (c = getopt(argc, argv, "hi:"))) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
usage(0);
|
||||
break;
|
||||
case 'i':
|
||||
if (0 == strcmp("cue", optarg))
|
||||
format = CUE;
|
||||
else if (0 == strcmp("toc", optarg))
|
||||
format = TOC;
|
||||
break;
|
||||
default:
|
||||
usage(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (optind == argc) {
|
||||
breaks("-", format);
|
||||
} else {
|
||||
for (; optind < argc; optind++)
|
||||
breaks(argv[optind], format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
108
tools/cueconvert.c
Normal file
108
tools/cueconvert.c
Normal file
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* cueconvert.c -- convert between cue/toc formats
|
||||
*
|
||||
* Copyright (C) 2004 Svend Sorensen
|
||||
* For license terms, see the file COPYING in this distribution.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "cuefile.h"
|
||||
|
||||
char *progname;
|
||||
|
||||
void usage (int status)
|
||||
{
|
||||
if (0 == status) {
|
||||
fprintf(stdout, "%s: usage: cueconvert [-h] [-i cue|toc] [-o cue|toc] [infile [outfile]]\n", progname);
|
||||
fputs("\
|
||||
\n\
|
||||
OPTIONS\n\
|
||||
-h print usage\n\
|
||||
-i cue|toc set format of input file\n\
|
||||
-o cue|toc set format of output file\n\
|
||||
", stdout);
|
||||
} else {
|
||||
fprintf(stderr, "%s: syntax error\n", progname);
|
||||
fprintf(stderr, "run `%s -h' for usage\n", progname);
|
||||
}
|
||||
|
||||
exit (status);
|
||||
}
|
||||
|
||||
int convert (char *iname, int iformat, char *oname, int oformat)
|
||||
{
|
||||
Cd *cd = NULL;
|
||||
|
||||
if (NULL == (cd = cf_parse(iname, &iformat))) {
|
||||
fprintf(stderr, "input file error\n");
|
||||
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;
|
||||
/* option variables */
|
||||
char c;
|
||||
/* getopt() variables */
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
progname = *argv;
|
||||
|
||||
while (-1 != (c = getopt(argc, argv, "hi:o:"))) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
usage(0);
|
||||
break;
|
||||
case 'i':
|
||||
if (0 == strcmp("cue", optarg))
|
||||
iformat = CUE;
|
||||
else if (0 == strcmp("toc", optarg))
|
||||
iformat = TOC;
|
||||
break;
|
||||
case 'o':
|
||||
if (0 == strcmp("cue", optarg))
|
||||
oformat = CUE;
|
||||
else if (0 == strcmp("toc", optarg))
|
||||
oformat = TOC;
|
||||
break;
|
||||
default:
|
||||
usage(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (optind == argc) {
|
||||
convert("-", iformat, "-", oformat);
|
||||
} else if (optind == argc - 1) {
|
||||
convert(argv[optind], iformat, "-", oformat);
|
||||
} else if (optind == argc - 2) {
|
||||
convert(argv[optind], iformat, argv[optind + 1], oformat);
|
||||
} else {
|
||||
usage(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
240
tools/cueprint.c
Normal file
240
tools/cueprint.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* cueprint.c -- print cd information based on a template
|
||||
*
|
||||
* Copyright (C) 2004 Svend Sorensen
|
||||
* For license terms, see the file COPYING in this distribution.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* exit() */
|
||||
#include <string.h> /* strcmp() */
|
||||
#include <unistd.h> /* getopt() */
|
||||
#include <ctype.h> /* isdigit() */
|
||||
#include "cuefile.h"
|
||||
|
||||
/* default templates */
|
||||
#define D_TEMPLATE "%P \"%T\" (%N tracks)\n"
|
||||
#define T_TEMPLATE "%n: %p \"%t\"\n"
|
||||
|
||||
char *progname;
|
||||
char *d_template = D_TEMPLATE; /* disc template */
|
||||
char *t_template = T_TEMPLATE; /* track template */
|
||||
|
||||
void usage (int status)
|
||||
{
|
||||
if (0 == status) {
|
||||
fprintf(stdout, "%s: usage: cueprint [-h] [-i cue|toc] [-d TEMPLATE] [-t TEMPLATE] [file...]\n", progname);
|
||||
fputs("\
|
||||
\n\
|
||||
OPTIONS\n\
|
||||
-h print usage\n\
|
||||
-i cue|toc set format of file(s)\n\
|
||||
-d TEMPLATE set disc template (see TEMPLATE EXPANSION)\n\
|
||||
-t TEMPLATE set track template (see TEMPLATE EXPANSION)\n\
|
||||
\n\
|
||||
Template Expansion\n\
|
||||
Disc:\n\
|
||||
%A - album arranger\n\
|
||||
%C - album composer\n\
|
||||
%G - album genre\n\
|
||||
%M - album message\n\
|
||||
%N - number of tracks\n\
|
||||
%P - album performer\n\
|
||||
%S - album songwriter\n\
|
||||
%T - album title\n\
|
||||
%U - album UPC/EAN\n\
|
||||
Track:\n\
|
||||
%a - track arranger\n\
|
||||
%c - track composer\n\
|
||||
%g - track genre\n\
|
||||
%i - track ISRC\n\
|
||||
%m - track message\n\
|
||||
%n - track number\n\
|
||||
%p - track perfomer\n\
|
||||
%t - track title\n\
|
||||
%u - track ISRC (CD-TEXT)\n\
|
||||
\n\
|
||||
Any other %<character> is expanded to that character. For example, to get a\n\
|
||||
'%', use %%.\n\
|
||||
", stdout);
|
||||
fprintf(stdout, "default disc template is:\n\"%s\"\n", D_TEMPLATE);
|
||||
fprintf(stdout, "default track template is:\n\"%s\"\n", T_TEMPLATE);
|
||||
} else {
|
||||
fprintf(stderr, "%s: syntax error\n", progname);
|
||||
fprintf(stderr, "run `%s -h' for usage\n", progname);
|
||||
}
|
||||
|
||||
exit (status);
|
||||
}
|
||||
|
||||
void disc_field (char *c, Cd *cd)
|
||||
{
|
||||
Cdtext *cdtext = NULL;
|
||||
cdtext = cd_get_cdtext(cd);
|
||||
|
||||
switch (*c) {
|
||||
case 'A':
|
||||
printf("%s", cdtext_get(PTI_ARRANGER, cdtext));
|
||||
break;
|
||||
case 'C':
|
||||
printf("%s", cdtext_get(PTI_COMPOSER, cdtext));
|
||||
break;
|
||||
case 'G':
|
||||
printf("%s", cdtext_get(PTI_GENRE, cdtext));
|
||||
break;
|
||||
case 'M':
|
||||
printf("%s", cdtext_get(PTI_MESSAGE, cdtext));
|
||||
break;
|
||||
case 'N':
|
||||
printf("%0*d", 2, cd_get_ntrack(cd));
|
||||
break;
|
||||
case 'P':
|
||||
printf("%s", cdtext_get(PTI_PERFORMER, cdtext));
|
||||
break;
|
||||
case 'R':
|
||||
printf("%s", cdtext_get(PTI_ARRANGER, cdtext));
|
||||
break;
|
||||
case 'S':
|
||||
printf("%s", cdtext_get(PTI_SONGWRITER, cdtext));
|
||||
break;
|
||||
case 'T':
|
||||
printf("%s", cdtext_get(PTI_TITLE, cdtext));
|
||||
break;
|
||||
case 'U':
|
||||
printf("%s", cdtext_get(PTI_UPC_ISRC, cdtext));
|
||||
break;
|
||||
default:
|
||||
putchar(*c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void track_field (char *c, Cd *cd, int trackno)
|
||||
{
|
||||
Track *track = NULL;
|
||||
Cdtext *cdtext = NULL;
|
||||
track = cd_get_track(cd, trackno);
|
||||
cdtext = track_get_cdtext(track);
|
||||
|
||||
switch (*c) {
|
||||
case 'a':
|
||||
printf("%s", cdtext_get(PTI_ARRANGER, cdtext));
|
||||
break;
|
||||
case 'c':
|
||||
printf("%s", cdtext_get(PTI_COMPOSER, cdtext));
|
||||
break;
|
||||
case 'f':
|
||||
printf("%s", track_get_filename(track));
|
||||
break;
|
||||
case 'g':
|
||||
printf("%s", cdtext_get(PTI_GENRE, cdtext));
|
||||
break;
|
||||
case 'i':
|
||||
printf("%s", track_get_isrc(track));
|
||||
break;
|
||||
case 'm':
|
||||
printf("%s", cdtext_get(PTI_MESSAGE, cdtext));
|
||||
break;
|
||||
case 'n':
|
||||
printf("%0*d", 2, trackno);
|
||||
break;
|
||||
case 'p':
|
||||
printf("%s", cdtext_get(PTI_PERFORMER, cdtext));
|
||||
break;
|
||||
case 's':
|
||||
printf("%s", cdtext_get(PTI_SONGWRITER, cdtext));
|
||||
break;
|
||||
case 't':
|
||||
printf("%s", cdtext_get(PTI_TITLE, cdtext));
|
||||
break;
|
||||
case 'u':
|
||||
printf("%s", cdtext_get(PTI_UPC_ISRC, cdtext));
|
||||
break;
|
||||
default:
|
||||
disc_field(c, cd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void print_info (Cd *cd)
|
||||
{
|
||||
int i; /* track */
|
||||
char *c;
|
||||
|
||||
for (c = d_template; '\0' != *c; c++) {
|
||||
if ('%' == *c) {
|
||||
c++;
|
||||
disc_field(c, cd);
|
||||
} else {
|
||||
putchar(*c);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 1; i <= cd_get_ntrack(cd); i++) {
|
||||
for (c = t_template; '\0' != *c; c++) {
|
||||
if ('%' == *c) {
|
||||
c++;
|
||||
track_field(c, cd, i);
|
||||
} else {
|
||||
putchar(*c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int info (char *name, int format)
|
||||
{
|
||||
Cd *cd = NULL;
|
||||
|
||||
if (NULL == (cd = cf_parse(name, &format))) {
|
||||
fprintf(stderr, "%s: input file error\n", name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
print_info(cd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int format = UNKNOWN;
|
||||
/* getopt () variables */
|
||||
char c;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
progname = *argv;
|
||||
|
||||
while (-1 != (c = getopt(argc, argv, "hi:d:t:"))) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
usage(0);
|
||||
break;
|
||||
case 'i':
|
||||
if (0 == strcmp("cue", optarg))
|
||||
format = CUE;
|
||||
else if (0 == strcmp("toc", optarg))
|
||||
format = TOC;
|
||||
break;
|
||||
case 'd':
|
||||
d_template = optarg;
|
||||
break;
|
||||
case 't':
|
||||
t_template = optarg;
|
||||
break;
|
||||
default:
|
||||
usage(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (optind == argc) {
|
||||
info("-", format);
|
||||
} else {
|
||||
for (; optind < argc; optind++)
|
||||
info(argv[optind], format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user