ocarina/core/tags/genre.c
Anna Schumaker e1f13a7ef4 core/file: Create new functions for reading data from files
The readd(), readu(), and readhu() functions are all used to read
various forms of integers.  The readl() and readw() are for reading
either lines or individual whitespace-delimited words

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2018-02-21 16:01:15 -05:00

93 lines
1.9 KiB
C

/*
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/string.h>
#include <core/tags/genre.h>
static struct database genre_db;
static struct genre *__genre_alloc(gchar *name)
{
struct genre *genre = g_malloc(sizeof(struct genre));
dbe_init(&genre->ge_dbe, genre);
genre->ge_name = name;
genre->ge_tokens = g_str_tokenize_and_fold(name, NULL, &genre->ge_alts);
return genre;
}
static struct db_entry *genre_alloc(const gchar *name, unsigned int index)
{
return &__genre_alloc(g_strdup(name))->ge_dbe;
}
static void genre_free(struct db_entry *dbe)
{
g_strfreev(GENRE(dbe)->ge_tokens);
g_strfreev(GENRE(dbe)->ge_alts);
g_free(GENRE(dbe));
}
static gchar *genre_key(struct db_entry *dbe)
{
return GENRE(dbe)->ge_name;
}
static struct db_entry *genre_read(struct file *file, unsigned int index)
{
return &__genre_alloc(file_readl(file))->ge_dbe;
}
static void genre_write(struct file *file, struct db_entry *dbe)
{
file_writef(file, "%s", GENRE(dbe)->ge_name);
}
static const struct db_ops genre_ops = {
.dbe_alloc = genre_alloc,
.dbe_free = genre_free,
.dbe_key = genre_key,
.dbe_read = genre_read,
.dbe_write = genre_write,
};
void genre_db_init()
{
db_init(&genre_db, "genre.db", true, &genre_ops, 0);
db_load(&genre_db);
}
void genre_db_deinit()
{
db_deinit(&genre_db);
}
struct genre *genre_find(const gchar *name)
{
return GENRE(db_find(&genre_db, name));
}
struct genre *genre_get(const unsigned int index)
{
return GENRE(db_at(&genre_db, index));
}
int genre_compare(struct genre *lhs, struct genre *rhs)
{
return string_compare_tokens(lhs->ge_tokens, rhs->ge_tokens);
}
bool genre_match_token(struct genre *genre, const gchar *string)
{
return string_match_token(string, genre->ge_tokens) ||
string_match_token(string, genre->ge_alts);
}
#ifdef CONFIG_TESTING
const struct db_ops *test_genre_ops() { return &genre_ops; }
#endif /* CONFIG_TESTING */