Browse Source

Added a union variable to hold result of conversion.

Unset (NULL) values print a sensible default now (zero-length string).
master
Svend Sorensen 20 years ago
parent
commit
4a86595fe1
1 changed files with 71 additions and 29 deletions
  1. +71
    -29
      tools/cueprint.c

+ 71
- 29
tools/cueprint.c View File

@@ -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 */
printf(conv, cd_get_ntrack(cd));
value->ival = 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 */
printf(conv, trackno);
value->ival = 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);
} }


Loading…
Cancel
Save