From 6d122e3932b8793aca21636780acf19f63d5aca9 Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Sun, 13 Mar 2022 17:11:50 -0400 Subject: cuesheet, cleanup tag code with strncmp Change-Id: I97076266103d20e59537e4e0959a70cc12b207f6 --- apps/cuesheet.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 11 deletions(-) (limited to 'apps/cuesheet.c') diff --git a/apps/cuesheet.c b/apps/cuesheet.c index be89ef96cf..ec917ce6a9 100644 --- a/apps/cuesheet.c +++ b/apps/cuesheet.c @@ -165,6 +165,38 @@ static unsigned long parse_cue_index(const char *line) return offset; } +enum eCS_SUPPORTED_TAGS { + eCS_TRACK = 0, eCS_INDEX_01, eCS_TITLE, + eCS_PERFORMER, eCS_SONGWRITER, eCS_FILE, + eCS_COUNT_TAGS_COUNT, eCS_NOTFOUND = -1 +}; + +static enum eCS_SUPPORTED_TAGS cuesheet_tag_get_option(const char *option) +{ + #define CS_OPTN(str) {str, sizeof(str)-1} + static const struct cs_option_t { + const char *str; + const int len; + } cs_options[eCS_COUNT_TAGS_COUNT + 1] = { + [eCS_TRACK] = CS_OPTN("TRACK"), + [eCS_INDEX_01] = CS_OPTN("INDEX_01"), + [eCS_TITLE] =CS_OPTN("TITLE"), + [eCS_PERFORMER] =CS_OPTN("PERFORMER"), + [eCS_SONGWRITER] =CS_OPTN("SONGWRITER"), + [eCS_FILE] =CS_OPTN("FILE"), + [eCS_COUNT_TAGS_COUNT] = {NULL, 0} /*SENTINEL*/ + }; + + const struct cs_option_t *op; + for (int i=0; ((op=&cs_options[i]))->str != NULL; i++) + { + if (strncmp(option, op->str, op->len) == 0) + return i; + } + return eCS_NOTFOUND; +#undef CS_OPTN +} + /* parse cuesheet "cue_file" and store the information in "cue" */ bool parse_cuesheet(struct cuesheet_file *cue_file, struct cuesheet *cue) { @@ -245,11 +277,16 @@ bool parse_cuesheet(struct cuesheet_file *cue_file, struct cuesheet *cue) } s = skip_whitespace(line); - if (!strncmp(s, "TRACK", 5)) +/* RECOGNIZED TAGS *********************** +* eCS_TRACK = 0, eCS_INDEX_01, eCS_TITLE, +* eCS_PERFORMER, eCS_SONGWRITER, eCS_FILE, +*/ + enum eCS_SUPPORTED_TAGS option = cuesheet_tag_get_option(s); + if (option == eCS_TRACK) { cue->track_count++; } - else if (!strncmp(s, "INDEX 01", 8)) + else if (option == eCS_INDEX_01) { #if 0 s = strchr(s,' '); @@ -265,10 +302,7 @@ bool parse_cuesheet(struct cuesheet_file *cue_file, struct cuesheet *cue) cue->tracks[cue->track_count-1].offset = parse_cue_index(s); #endif } - else if (!strncmp(s, "TITLE", 5) - || !strncmp(s, "PERFORMER", 9) - || !strncmp(s, "SONGWRITER", 10) - || !strncmp(s, "FILE", 4)) + else if (option != eCS_NOTFOUND) { char *dest = NULL; char *string = get_string(s); @@ -278,24 +312,24 @@ bool parse_cuesheet(struct cuesheet_file *cue_file, struct cuesheet *cue) size_t count = MAX_NAME*3 + 1; size_t count8859 = MAX_NAME; - switch (*s) + switch (option) { - case 'T': /* TITLE */ + case eCS_TITLE: /* TITLE */ dest = (cue->track_count <= 0) ? cue->title : cue->tracks[cue->track_count-1].title; break; - case 'P': /* PERFORMER */ + case eCS_PERFORMER: /* PERFORMER */ dest = (cue->track_count <= 0) ? cue->performer : cue->tracks[cue->track_count-1].performer; break; - case 'S': /* SONGWRITER */ + case eCS_SONGWRITER: /* SONGWRITER */ dest = (cue->track_count <= 0) ? cue->songwriter : cue->tracks[cue->track_count-1].songwriter; break; - case 'F': /* FILE */ + case eCS_FILE: /* FILE */ if (is_embedded || cue->track_count > 0) break; @@ -303,6 +337,16 @@ bool parse_cuesheet(struct cuesheet_file *cue_file, struct cuesheet *cue) count = MAX_PATH; count8859 = MAX_PATH/3; break; + case eCS_TRACK: + /*Fall-Through*/ + case eCS_INDEX_01: + /*Fall-Through*/ + case eCS_COUNT_TAGS_COUNT: + /*Fall-Through*/ + case eCS_NOTFOUND: /*Shouldn't happen*/ + logf(HZ * 2, "Bad Tag %d @ %s", (int) option, __func__); + dest = NULL; + break; } if (dest) @@ -319,6 +363,7 @@ bool parse_cuesheet(struct cuesheet_file *cue_file, struct cuesheet *cue) } } } + if (is_embedded) { bytes_left -= line_len; -- cgit v1.2.3