playlist/xspf: add State::TAG

This commit is contained in:
Max Kellermann 2020-03-12 08:00:54 +01:00
parent 3e97058151
commit e0a8fd398c
1 changed files with 12 additions and 10 deletions

View File

@ -45,7 +45,7 @@ struct XspfParser {
*/ */
enum { enum {
ROOT, PLAYLIST, TRACKLIST, TRACK, ROOT, PLAYLIST, TRACKLIST, TRACK,
LOCATION, TAG, LOCATION,
} state = ROOT; } state = ROOT;
/** /**
@ -99,7 +99,6 @@ xspf_start_element(void *user_data, const XML_Char *element_name,
if (strcmp(element_name, "track") == 0) { if (strcmp(element_name, "track") == 0) {
parser->state = XspfParser::TRACK; parser->state = XspfParser::TRACK;
parser->location.clear(); parser->location.clear();
parser->tag_type = TAG_NUM_OF_ITEM_TYPES;
} }
break; break;
@ -107,12 +106,16 @@ xspf_start_element(void *user_data, const XML_Char *element_name,
case XspfParser::TRACK: case XspfParser::TRACK:
if (strcmp(element_name, "location") == 0) if (strcmp(element_name, "location") == 0)
parser->state = XspfParser::LOCATION; parser->state = XspfParser::LOCATION;
else if (!parser->location.empty()) else if (!parser->location.empty()) {
parser->tag_type = tag_table_lookup(xspf_tag_elements, parser->tag_type = tag_table_lookup(xspf_tag_elements,
element_name); element_name);
if (parser->tag_type != TAG_NUM_OF_ITEM_TYPES)
parser->state = XspfParser::TAG;
}
break; break;
case XspfParser::TAG:
case XspfParser::LOCATION: case XspfParser::LOCATION:
break; break;
} }
@ -146,11 +149,11 @@ xspf_end_element(void *user_data, const XML_Char *element_name)
parser->tag_builder.Commit()); parser->tag_builder.Commit());
parser->state = XspfParser::TRACKLIST; parser->state = XspfParser::TRACKLIST;
} else }
parser->tag_type = TAG_NUM_OF_ITEM_TYPES;
break; break;
case XspfParser::TAG:
case XspfParser::LOCATION: case XspfParser::LOCATION:
parser->state = XspfParser::TRACK; parser->state = XspfParser::TRACK;
break; break;
@ -166,13 +169,12 @@ xspf_char_data(void *user_data, const XML_Char *s, int len)
case XspfParser::ROOT: case XspfParser::ROOT:
case XspfParser::PLAYLIST: case XspfParser::PLAYLIST:
case XspfParser::TRACKLIST: case XspfParser::TRACKLIST:
case XspfParser::TRACK:
break; break;
case XspfParser::TRACK: case XspfParser::TAG:
if (parser->tag_type != TAG_NUM_OF_ITEM_TYPES) parser->tag_builder.AddItem(parser->tag_type,
parser->tag_builder.AddItem(parser->tag_type, StringView(s, len));
StringView(s, len));
break; break;
case XspfParser::LOCATION: case XspfParser::LOCATION: