song_save: explicitly parse the colon

Clear the colon.  This simplifies all attribute parsers, because they
can now use strcmp() instead of strncmp().
This commit is contained in:
Max Kellermann 2009-11-04 18:43:16 +01:00
parent a027bdf118
commit 7af8c88e37

View File

@ -31,7 +31,7 @@
#undef G_LOG_DOMAIN #undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "song" #define G_LOG_DOMAIN "song"
#define SONG_MTIME "mtime: " #define SONG_MTIME "mtime"
#define SONG_END "song_end" #define SONG_END "song_end"
static GQuark static GQuark
@ -50,7 +50,7 @@ song_save(struct song *song, void *data)
if (song->tag != NULL) if (song->tag != NULL)
tag_save(fp, song->tag); tag_save(fp, song->tag);
fprintf(fp, SONG_MTIME "%li\n", (long)song->mtime); fprintf(fp, SONG_MTIME ": %li\n", (long)song->mtime);
fprintf(fp, SONG_END "\n"); fprintf(fp, SONG_END "\n");
return 0; return 0;
@ -61,22 +61,17 @@ void songvec_save(FILE *fp, struct songvec *sv)
songvec_for_each(sv, song_save, fp); songvec_for_each(sv, song_save, fp);
} }
static char * static enum tag_type
parse_tag_value(char *buffer, enum tag_type *type_r) parse_tag_name(const char *name)
{ {
int i; int i;
for (i = 0; i < TAG_NUM_OF_ITEM_TYPES; i++) { for (i = 0; i < TAG_NUM_OF_ITEM_TYPES; i++) {
size_t len = strlen(tag_item_names[i]); if (strcmp(name, tag_item_names[i]) == 0)
return i;
if (0 == strncmp(tag_item_names[i], buffer, len) &&
buffer[len] == ':') {
*type_r = i;
return g_strchug(buffer + len + 1);
}
} }
return NULL; return TAG_NUM_OF_ITEM_TYPES;
} }
struct song * struct song *
@ -84,28 +79,42 @@ song_load(FILE *fp, struct directory *parent, const char *uri,
GString *buffer, GError **error_r) GString *buffer, GError **error_r)
{ {
struct song *song = song_file_new(uri, parent); struct song *song = song_file_new(uri, parent);
char *line; char *line, *colon;
enum tag_type type; enum tag_type type;
const char *value; const char *value;
while ((line = read_text_line(fp, buffer)) != NULL && while ((line = read_text_line(fp, buffer)) != NULL &&
strcmp(line, SONG_END) != 0) { strcmp(line, SONG_END) != 0) {
if ((value = parse_tag_value(line, &type)) != NULL) { colon = strchr(line, ':');
if (colon == NULL || colon == line) {
if (song->tag != NULL)
tag_end_add(song->tag);
song_free(song);
g_set_error(error_r, song_save_quark(), 0,
"unknown line in db: %s", line);
return false;
}
*colon++ = 0;
value = g_strchug(colon);
if ((type = parse_tag_name(line)) != TAG_NUM_OF_ITEM_TYPES) {
if (!song->tag) { if (!song->tag) {
song->tag = tag_new(); song->tag = tag_new();
tag_begin_add(song->tag); tag_begin_add(song->tag);
} }
tag_add_item(song->tag, type, value); tag_add_item(song->tag, type, value);
} else if (0 == strncmp(SONG_TIME, line, strlen(SONG_TIME))) { } else if (strcmp(line, "Time") == 0) {
if (!song->tag) { if (!song->tag) {
song->tag = tag_new(); song->tag = tag_new();
tag_begin_add(song->tag); tag_begin_add(song->tag);
} }
song->tag->time = atoi(&(line[strlen(SONG_TIME)])); song->tag->time = atoi(value);
} else if (0 == strncmp(SONG_MTIME, line, strlen(SONG_MTIME))) { } else if (strcmp(line, SONG_MTIME) == 0) {
song->mtime = atoi(&(line[strlen(SONG_MTIME)])); song->mtime = atoi(value);
} else { } else {
if (song->tag != NULL) if (song->tag != NULL)
tag_end_add(song->tag); tag_end_add(song->tag);