diff options
Diffstat (limited to 'src/libaudcore/tuple_formatter.c')
-rw-r--r-- | src/libaudcore/tuple_formatter.c | 74 |
1 files changed, 38 insertions, 36 deletions
diff --git a/src/libaudcore/tuple_formatter.c b/src/libaudcore/tuple_formatter.c index 04ea555..44c6e44 100644 --- a/src/libaudcore/tuple_formatter.c +++ b/src/libaudcore/tuple_formatter.c @@ -1,6 +1,6 @@ /* * tuple_formatter.c - * Copyright (c) 2007 William Pitcock + * Copyright (c) 2007-2013 William Pitcock and John Lindgren * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -18,11 +18,9 @@ */ #include <glib.h> -#include <pthread.h> -#include <string.h> +#include "tuple.h" #include "tuple_compiler.h" -#include "tuple_formatter.h" /* * the tuple formatter: @@ -47,48 +45,52 @@ * - %{function:args,arg2,...}: runs function and inserts the result. * * everything else is treated as raw text. - * additionally, plugins can add additional instructions and functions! */ -/* - * Compile a tuplez string and cache the result. - * This caches the result for the last string, so that - * successive calls are sped up. - */ +struct _TupleFormatter +{ + TupleEvalContext * context; + TupleEvalNode * node; + GString * buf; +}; -char * tuple_formatter_process_string (const Tuple * tuple, const char * string) +EXPORT TupleFormatter * tuple_formatter_new (const char * format) { - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock (& mutex); + TupleFormatter * formatter = g_slice_new (TupleFormatter); - static char *last_string = NULL; - static TupleEvalContext *last_ctx = NULL; - static TupleEvalNode *last_ev = NULL; + formatter->context = tuple_evalctx_new (); + formatter->node = tuple_formatter_compile (formatter->context, format); + formatter->buf = g_string_sized_new (255); - if (! last_string || strcmp (string, last_string)) - { - g_free(last_string); + return formatter; +} + +EXPORT void tuple_formatter_free (TupleFormatter * formatter) +{ + tuple_evalctx_free (formatter->context); + tuple_evalnode_free (formatter->node); + g_string_free (formatter->buf, TRUE); - if (last_ctx != NULL) - { - tuple_evalctx_free(last_ctx); - tuple_evalnode_free(last_ev); - } + g_slice_free (TupleFormatter, formatter); +} - last_ctx = tuple_evalctx_new(); - last_string = g_strdup(string); - last_ev = tuple_formatter_compile(last_ctx, last_string); - } +EXPORT char * tuple_format_title (TupleFormatter * formatter, const Tuple * tuple) +{ + tuple_formatter_eval (formatter->context, formatter->node, tuple, formatter->buf); + tuple_evalctx_reset (formatter->context); - static GString * buf; - if (! buf) - buf = g_string_sized_new (255); + if (formatter->buf->len) + return str_get (formatter->buf->str); - tuple_formatter_eval (last_ctx, last_ev, tuple, buf); - tuple_evalctx_reset (last_ctx); + /* formatting failed, try fallbacks */ + static const int fallbacks[] = {FIELD_TITLE, FIELD_FILE_NAME}; - char * result = str_get (buf->str); + for (int i = 0; i < ARRAY_LEN (fallbacks); i ++) + { + char * title = tuple_get_str (tuple, fallbacks[i]); + if (title) + return title; + } - pthread_mutex_unlock (& mutex); - return result; + return str_get (""); } |