From 4a86595fe1afe2d0e9000b0a0fa02221afa10cd4 Mon Sep 17 00:00:00 2001 From: Svend Sorensen Date: Mon, 13 Sep 2004 20:31:47 +0000 Subject: [PATCH] Added a union variable to hold result of conversion. Unset (NULL) values print a sensible default now (zero-length string). --- tools/cueprint.c | 100 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 29 deletions(-) diff --git a/tools/cueprint.c b/tools/cueprint.c index 92a3db0..59fff57 100644 --- a/tools/cueprint.c +++ b/tools/cueprint.c @@ -41,6 +41,18 @@ title: %t\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; void usage (int status) @@ -91,7 +103,7 @@ Any other % is expanded to that character. For example, to get a\n\ 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 */ @@ -100,54 +112,61 @@ void disc_field (char *conv, int length, Cd *cd) c = conv + length - 1; + /* + * after setting value, set *c to specify value type + * 'd' integer + * 's' string + * 'c' character + */ switch (*c) { case 'A': + value->sval = cdtext_get(PTI_ARRANGER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_ARRANGER, cdtext)); break; case 'C': + value->sval = cdtext_get(PTI_COMPOSER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_COMPOSER, cdtext)); break; case 'G': + value->sval = cdtext_get(PTI_GENRE, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_GENRE, cdtext)); break; case 'M': + value->sval = cdtext_get(PTI_MESSAGE, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_MESSAGE, cdtext)); break; case 'N': - *c = 'd'; /* tracks is an integer */ - printf(conv, cd_get_ntrack(cd)); + value->ival = cd_get_ntrack(cd); + *c = 'd'; break; case 'P': + value->sval = cdtext_get(PTI_PERFORMER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_PERFORMER, cdtext)); break; case 'R': + value->sval = cdtext_get(PTI_ARRANGER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_ARRANGER, cdtext)); break; case 'S': + value->sval = cdtext_get(PTI_SONGWRITER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_SONGWRITER, cdtext)); break; case 'T': + value->sval = cdtext_get(PTI_TITLE, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_TITLE, cdtext)); break; case 'U': + value->sval = cdtext_get(PTI_UPC_ISRC, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_UPC_ISRC, cdtext)); break; default: - putchar(*c); + value->cval = *c; + *c = 'c'; 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 */ @@ -161,53 +180,54 @@ void track_field (char *conv, int length, Cd *cd, int trackno) switch (*c) { case 'a': + value->sval = cdtext_get(PTI_ARRANGER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_ARRANGER, cdtext)); break; case 'c': + value->sval = cdtext_get(PTI_COMPOSER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_COMPOSER, cdtext)); break; case 'f': + value->sval = track_get_filename(track); *c = 's'; - printf(conv, track_get_filename(track)); break; case 'g': + value->sval = cdtext_get(PTI_GENRE, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_GENRE, cdtext)); break; case 'i': + value->sval = track_get_isrc(track); *c = 's'; - printf(conv, track_get_isrc(track)); break; case 'm': + value->sval = cdtext_get(PTI_MESSAGE, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_MESSAGE, cdtext)); break; case 'n': - *c = 'd'; /* track number is an integer */ - printf(conv, trackno); + value->ival = trackno; + *c = 'd'; break; case 'p': + value->sval = cdtext_get(PTI_PERFORMER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_PERFORMER, cdtext)); break; case 's': + value->sval = cdtext_get(PTI_SONGWRITER, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_SONGWRITER, cdtext)); break; case 't': + value->sval = cdtext_get(PTI_TITLE, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_TITLE, cdtext)); break; case 'u': + value->sval = cdtext_get(PTI_UPC_ISRC, cdtext); *c = 's'; - printf(conv, cdtext_get(PTI_UPC_ISRC, cdtext)); break; default: - disc_field(conv, length, cd); + disc_field(conv, length, cd, value); break; } + } /* 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) { char *conv; /* copy of conversion specification */ + Value value; + char *c; /* pointer to conversion-char */ /* TODO: use strndup? */ conv = malloc ((unsigned) (length + 1)); @@ -224,9 +246,29 @@ void print_conv (char *start, int length, Cd *cd, int trackno) /* conversion character */ if (0 == trackno) - disc_field(conv, length, cd); + disc_field(conv, length, cd, &value); 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); }