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.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/replace-table.c b/src/replace-table.c
index 95d5e30..9cd02ea 100644
--- a/src/replace-table.c
+++ b/src/replace-table.c
@@ -37,6 +37,26 @@ replace_table_new ()
return (ReplaceTable *) g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
}
+/*
+ * 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));
+
+ return table;
+}
+
void
replace_table_free (ReplaceTable *table)
{
@@ -182,8 +202,9 @@ gchar *
get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parameter)
{
gchar *dollar;
- gchar *end_brace;
+ gchar *end_paren;
gchar *b;
+ int num_paren;
*start = NULL;
*end = NULL;
@@ -193,10 +214,23 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame
dollar = strstr (s, "$(");
if (dollar == NULL)
return NULL;
- end_brace = strchr (dollar + 2, ')');
- if (end_brace == NULL)
+ end_paren = strchr (dollar + 2, ')');
+ if (end_paren == NULL)
return NULL;
+ /* Count opening parentheses and include nested parentheses in the token */
+ num_paren = 0;
+ for (b = dollar; b < end_paren; b++)
+ if (*b == '(')
+ num_paren++;
+ while (num_paren > 1) {
+ end_paren = strchr (end_paren + 1, ')');
+ if (end_paren == NULL)
+ return NULL;
+ num_paren--;
+ }
+ g_assert (num_paren <= 1); /* something really bad happened */
+
/* Go back and try to find placeholder beginning */
for (b = dollar - 1; b >= s + 3; b--) {
if (*b == '-' && *(b-1) == '-' && *(b-2) == '!' && *(b-3) == '<') {
@@ -212,7 +246,7 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame
*start = dollar;
/* Go forth and try to find placeholder end */
- for (b = end_brace + 1; b <= end_brace + strlen (end_brace) - 3; b++) {
+ for (b = end_paren + 1; b <= end_paren + strlen (end_paren) - 3; b++) {
if (*b == '-' && *(b+1) == '-' && *(b+2) == '>') {
*end = b + 2;
break;
@@ -221,8 +255,8 @@ get_next_token (const gchar *s, gchar **start, gchar **end, gboolean *tag_parame
break;
}
if (*end == NULL)
- *end = end_brace;
+ *end = end_paren;
- return g_strndup (dollar + 2, end_brace - dollar - 2);
+ return g_strndup (dollar + 2, end_paren - dollar - 2);
}