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:
parent
a027bdf118
commit
7af8c88e37
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user