summaryrefslogtreecommitdiff
path: root/src/libaudcore/tuple_formatter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libaudcore/tuple_formatter.c')
-rw-r--r--src/libaudcore/tuple_formatter.c74
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 ("");
}