summaryrefslogtreecommitdiff
path: root/src/replace-table.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/replace-table.c')
-rw-r--r--src/replace-table.c89
1 files changed, 65 insertions, 24 deletions
diff --git a/src/replace-table.c b/src/replace-table.c
index 9cd02ea..344a782 100644
--- a/src/replace-table.c
+++ b/src/replace-table.c
@@ -23,36 +23,25 @@
#include <unistd.h>
#include <glib.h>
-#include <glib/gprintf.h>
#include "replace-table.h"
#include "gallery-utils.h"
+struct ReplaceTable {
+ GHashTable *table;
+ GHashTable *defines;
+};
+
ReplaceTable *
replace_table_new ()
{
- return (ReplaceTable *) g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-}
+ ReplaceTable *table;
-/*
- * replace_table_new_from_defines: creates new replace table object and fills it with defines from the hash table
- *
- */
-ReplaceTable *
-replace_table_new_from_defines (GHashTable *defines)
-{
- GHashTable *table;
- GHashTableIter iter;
- gchar *key, *value;
-
- table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- g_hash_table_iter_init (&iter, defines);
- while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value))
- g_hash_table_insert (table, g_strdup_printf ("value(%s)", key), g_strdup (value));
+ table = g_new0 (ReplaceTable, 1);
+ table->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
return table;
}
@@ -62,7 +51,8 @@ replace_table_free (ReplaceTable *table)
{
g_return_if_fail (table != NULL);
- g_hash_table_destroy (table);
+ g_hash_table_destroy (table->table);
+ g_free (table);
}
@@ -78,7 +68,7 @@ replace_table_add_key (ReplaceTable *table, const gchar *tag, const gchar *value
g_return_if_fail (table != NULL);
if (tag != NULL && value != NULL)
- g_hash_table_replace (table, g_strdup (tag), g_strdup (value));
+ g_hash_table_replace (table->table, g_strdup (tag), g_strdup (value));
}
void
@@ -87,7 +77,7 @@ replace_table_add_key_int (ReplaceTable *table, const gchar *tag, gint value)
g_return_if_fail (table != NULL);
if (tag != NULL)
- g_hash_table_replace (table, g_strdup (tag), g_strdup_printf ("%d", value));
+ g_hash_table_replace (table->table, g_strdup (tag), g_strdup_printf ("%d", value));
}
void
@@ -101,11 +91,22 @@ replace_table_add_key_printf (ReplaceTable *table, const gchar *tag, const gchar
if (tag != NULL && format != NULL) {
va_start (args, format);
g_vasprintf (&s, format, args);
- g_hash_table_replace (table, g_strdup (tag), s);
+ g_hash_table_replace (table->table, g_strdup (tag), s);
va_end (args);
}
}
+/*
+ * replace_table_set_defines: set a hash table to be used for defines lookup
+ *
+ */
+void
+replace_table_set_defines (ReplaceTable *table, GHashTable *defines)
+{
+ g_return_if_fail (table != NULL);
+
+ table->defines = defines;
+}
/*
* replace_table_process: process buffer and replace all tags filled in the replace table
@@ -120,6 +121,7 @@ replace_table_process (gchar **buffer, ReplaceTable *table)
gchar *start, *end;
gchar *b;
gchar *replace_value;
+ gchar *s;
GString *dst;
gboolean tag_parameter;
gboolean handled;
@@ -138,7 +140,22 @@ replace_table_process (gchar **buffer, ReplaceTable *table)
/* push the string before the token */
g_string_append_len (dst, b, start - b);
- replace_value = g_strdup (g_hash_table_lookup (table, token));
+ replace_value = NULL;
+ /* match defines */
+ if (table->defines && g_str_has_prefix (token, "value(")) {
+ s = extract_token_arg (token);
+ replace_value = g_strdup (g_hash_table_lookup (table->defines, s));
+ /* fall back to empty string if not defined */
+ if (replace_value == NULL)
+ replace_value = g_strdup ("");
+ g_free (s);
+ }
+
+ /* lookup in the replace table */
+ if (! replace_value)
+ replace_value = g_strdup (g_hash_table_lookup (table->table, token));
+
+ /* process the data */
if (replace_value) {
if (! tag_parameter)
adjust_tags_normal (&replace_value);
@@ -260,3 +277,27 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame
return g_strndup (dollar + 2, end_paren - dollar - 2);
}
+/*
+ * extract_token_arg: retrieves token argument "xxx(value)"
+ * - returns newly allocated string, caller is responsible for freeing
+ *
+ */
+gchar *
+extract_token_arg (const gchar *str)
+{
+ const gchar *start;
+ const gchar *end;
+
+ start = strstr (str, "(");
+ if (start == NULL)
+ return NULL;
+ start++;
+
+ end = strstr (str, ")");
+ if (end == NULL)
+ return NULL;
+ end++;
+
+ return g_strndup (start, end - start - 1);
+}
+