Added a union variable to hold result of conversion.
Unset (NULL) values print a sensible default now (zero-length string).
This commit is contained in:
100
tools/cueprint.c
100
tools/cueprint.c
@@ -41,6 +41,18 @@ title: %t\n\
|
|||||||
ISRC (CD-TEXT): %u\n\
|
ISRC (CD-TEXT): %u\n\
|
||||||
"
|
"
|
||||||
|
|
||||||
|
/* default string to print for unset (NULL) values */
|
||||||
|
#define VALUE_UNSET ""
|
||||||
|
|
||||||
|
/*
|
||||||
|
* *_get_* functions can return an int or char *
|
||||||
|
*/
|
||||||
|
typedef union {
|
||||||
|
int ival;
|
||||||
|
char *sval;
|
||||||
|
char cval;
|
||||||
|
} Value;
|
||||||
|
|
||||||
char *progname;
|
char *progname;
|
||||||
|
|
||||||
void usage (int status)
|
void usage (int status)
|
||||||
@@ -91,7 +103,7 @@ Any other %<character> is expanded to that character. For example, to get a\n\
|
|||||||
exit (status);
|
exit (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void disc_field (char *conv, int length, Cd *cd)
|
void disc_field (char *conv, int length, Cd *cd, Value *value)
|
||||||
{
|
{
|
||||||
char *c; /* pointer to conversion character */
|
char *c; /* pointer to conversion character */
|
||||||
|
|
||||||
@@ -100,54 +112,61 @@ void disc_field (char *conv, int length, Cd *cd)
|
|||||||
|
|
||||||
c = conv + length - 1;
|
c = conv + length - 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* after setting value, set *c to specify value type
|
||||||
|
* 'd' integer
|
||||||
|
* 's' string
|
||||||
|
* 'c' character
|
||||||
|
*/
|
||||||
switch (*c) {
|
switch (*c) {
|
||||||
case 'A':
|
case 'A':
|
||||||
|
value->sval = cdtext_get(PTI_ARRANGER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_ARRANGER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
|
value->sval = cdtext_get(PTI_COMPOSER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_COMPOSER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'G':
|
case 'G':
|
||||||
|
value->sval = cdtext_get(PTI_GENRE, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_GENRE, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
|
value->sval = cdtext_get(PTI_MESSAGE, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_MESSAGE, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'N':
|
case 'N':
|
||||||
*c = 'd'; /* tracks is an integer */
|
value->ival = cd_get_ntrack(cd);
|
||||||
printf(conv, cd_get_ntrack(cd));
|
*c = 'd';
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
|
value->sval = cdtext_get(PTI_PERFORMER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_PERFORMER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
|
value->sval = cdtext_get(PTI_ARRANGER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_ARRANGER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
|
value->sval = cdtext_get(PTI_SONGWRITER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_SONGWRITER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
|
value->sval = cdtext_get(PTI_TITLE, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_TITLE, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'U':
|
case 'U':
|
||||||
|
value->sval = cdtext_get(PTI_UPC_ISRC, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_UPC_ISRC, cdtext));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
putchar(*c);
|
value->cval = *c;
|
||||||
|
*c = 'c';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void track_field (char *conv, int length, Cd *cd, int trackno)
|
void track_field (char *conv, int length, Cd *cd, int trackno, Value *value)
|
||||||
{
|
{
|
||||||
char *c; /* pointer to conversion character */
|
char *c; /* pointer to conversion character */
|
||||||
|
|
||||||
@@ -161,53 +180,54 @@ void track_field (char *conv, int length, Cd *cd, int trackno)
|
|||||||
|
|
||||||
switch (*c) {
|
switch (*c) {
|
||||||
case 'a':
|
case 'a':
|
||||||
|
value->sval = cdtext_get(PTI_ARRANGER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_ARRANGER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
|
value->sval = cdtext_get(PTI_COMPOSER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_COMPOSER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
|
value->sval = track_get_filename(track);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, track_get_filename(track));
|
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
|
value->sval = cdtext_get(PTI_GENRE, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_GENRE, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
|
value->sval = track_get_isrc(track);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, track_get_isrc(track));
|
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
|
value->sval = cdtext_get(PTI_MESSAGE, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_MESSAGE, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
*c = 'd'; /* track number is an integer */
|
value->ival = trackno;
|
||||||
printf(conv, trackno);
|
*c = 'd';
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
|
value->sval = cdtext_get(PTI_PERFORMER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_PERFORMER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
|
value->sval = cdtext_get(PTI_SONGWRITER, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_SONGWRITER, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
|
value->sval = cdtext_get(PTI_TITLE, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_TITLE, cdtext));
|
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
|
value->sval = cdtext_get(PTI_UPC_ISRC, cdtext);
|
||||||
*c = 's';
|
*c = 's';
|
||||||
printf(conv, cdtext_get(PTI_UPC_ISRC, cdtext));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
disc_field(conv, length, cd);
|
disc_field(conv, length, cd, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print a % conversion specification
|
/* print a % conversion specification
|
||||||
@@ -216,6 +236,8 @@ void track_field (char *conv, int length, Cd *cd, int trackno)
|
|||||||
void print_conv (char *start, int length, Cd *cd, int trackno)
|
void print_conv (char *start, int length, Cd *cd, int trackno)
|
||||||
{
|
{
|
||||||
char *conv; /* copy of conversion specification */
|
char *conv; /* copy of conversion specification */
|
||||||
|
Value value;
|
||||||
|
char *c; /* pointer to conversion-char */
|
||||||
|
|
||||||
/* TODO: use strndup? */
|
/* TODO: use strndup? */
|
||||||
conv = malloc ((unsigned) (length + 1));
|
conv = malloc ((unsigned) (length + 1));
|
||||||
@@ -224,9 +246,29 @@ void print_conv (char *start, int length, Cd *cd, int trackno)
|
|||||||
|
|
||||||
/* conversion character */
|
/* conversion character */
|
||||||
if (0 == trackno)
|
if (0 == trackno)
|
||||||
disc_field(conv, length, cd);
|
disc_field(conv, length, cd, &value);
|
||||||
else
|
else
|
||||||
track_field(conv, length, cd, trackno);
|
track_field(conv, length, cd, trackno, &value);
|
||||||
|
|
||||||
|
c = conv + length - 1;
|
||||||
|
|
||||||
|
switch (*c) {
|
||||||
|
case 'c':
|
||||||
|
printf(conv, value.cval);
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
printf(conv, value.ival);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
if (NULL == value.sval)
|
||||||
|
printf(conv, VALUE_UNSET);
|
||||||
|
else
|
||||||
|
printf(conv, value.sval);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("%d: ", strlen(conv));
|
||||||
|
printf("%s", conv);
|
||||||
|
}
|
||||||
|
|
||||||
free(conv);
|
free(conv);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user