summaryrefslogtreecommitdiff
path: root/saedit/xml.c
diff options
context:
space:
mode:
Diffstat (limited to 'saedit/xml.c')
-rw-r--r--saedit/xml.c189
1 files changed, 129 insertions, 60 deletions
diff --git a/saedit/xml.c b/saedit/xml.c
index eefc536..90c4d76 100644
--- a/saedit/xml.c
+++ b/saedit/xml.c
@@ -1,49 +1,100 @@
-/*=======================================*\
-| ____ ____ |
-| / \ /\ | |
-| \____ / \ |____ |
-| \ /____\ | |
-| \____/prite / \nimation |____ditor |
-| |
-| Copyleft Vasily_Makarov 2011 |
-| |
-\*=======================================*/
-
#include "xml.h"
+#include <string.h>
-gchar** xml_attr_new(const gchar *name, const gchar *value) {
+gchar **
+xml_attr_new (
+ const gchar *name,
+ const gchar *value
+) {
gchar **attr = g_new0(gchar*, 2);
attr[0] = g_strdup(name);
attr[1] = g_strdup(value);
return attr;
}
-gchar* xml_node_get_attr_value(const XMLNode *node, const gchar *attr_name) {
+gchar *
+xml_node_get_attr_value (
+ const XMLNode *node,
+ const gchar *attr_name
+) {
gchar **attr = node->attributes;
guint i;
for (i = 0; i < g_strv_length(attr); i += 2)
if (g_str_equal(attr[i], attr_name))
- return attr[i + 1];
+ return g_strdup (attr[i + 1]);
return NULL;
}
+gint
+xml_node_get_int_attr_value (
+ const XMLNode *node,
+ const gchar *attr_name,
+ gint retval
+) {
+ gchar *val = xml_node_get_attr_value (node, attr_name);
+
+ if (val != NULL) {
+ try_strtoint (val, &retval);
+ g_free (val);
+ }
+
+ return retval;
+}
-gint xml_node_compare_with_name_func(gconstpointer a, gconstpointer b) {
- return g_strcmp0((gchar *)b, ((XMLNode *)a)->name);
+gint
+xml_node_get_int_attr_value_limited (
+ const XMLNode *node,
+ const gchar *attr_name,
+ gint retval,
+ gint lower,
+ gint upper
+) {
+ g_assert (lower <= upper);
+
+ retval = xml_node_get_int_attr_value (
+ node, attr_name, retval
+ );
+
+ if (retval < lower)
+ retval = lower;
+
+ if (retval > upper)
+ retval = upper;
+ return retval;
}
-gint xml_node_compare_with_action_node_by_imageset_name_func(gconstpointer a, gconstpointer b) {
- return g_strcmp0("action", ((XMLNode *)a)->name) ||
- g_strcmp0((gchar *)b, xml_node_get_attr_value((XMLNode *)a, "imageset"));
+gint
+xml_node_compare_with_name_func (
+ gconstpointer a,
+ gconstpointer b
+) {
+ return g_strcmp0((gchar *) b, ((XMLNode *) a)->name);
}
-gint xml_node_compare_with_attr_func(const XMLNode *node, const gchar **attr) {
+gint
+xml_node_compare_with_action_node_by_imageset_name_func (
+ gconstpointer a,
+ gconstpointer b
+) {
+ return g_strcmp0("action", ((XMLNode *) a)->name) ||
+ g_strcmp0((gchar *) b, xml_node_get_attr_value((XMLNode *) a, "imageset"));
+}
+
+gint
+xml_node_compare_with_attr_func (
+ const XMLNode *node,
+ const gchar **attr
+) {
return g_strcmp0(attr[1],
xml_node_get_attr_value(node, attr[0]));
}
static GMarkupParser parser;
+void _xml_free_g_func (XMLNode *node, gpointer user_data) {
+ xml_free (node);
+}
+
void xml_free (XMLNode *node) {
g_free (node->name);
@@ -51,7 +102,7 @@ void xml_free (XMLNode *node) {
g_strfreev (node->attributes);
- g_list_foreach (node->sub_nodes, (GFunc) xml_free, NULL);
+ g_list_foreach (node->sub_nodes, (GFunc) _xml_free_g_func, NULL);
g_list_free (node->sub_nodes);
g_slice_free (XMLNode, node);
@@ -62,16 +113,18 @@ static void _start_root_element_cb ( GMarkupParseContext *context,
const gchar **attribute_names,
const gchar **attribute_values,
gpointer user_data,
- GError **error) {
+ GError **error
+) {
XMLNode **node = (XMLNode **) user_data;
- g_assert (node != NULL);
-
- XMLNode *p = g_slice_new0 (XMLNode);
+ XMLNode *p;
+ GArray *attributes;
+ g_assert (node != NULL);
+ p = g_slice_new0 (XMLNode);
p->name = g_strdup (element_name);
- GArray *attributes = g_array_new (TRUE, TRUE, sizeof (gchar *));
+ attributes = g_array_new (TRUE, TRUE, sizeof (gchar *));
while (*attribute_names != NULL && *attribute_values != NULL) {
gchar *p2;
p2 = g_strdup (*attribute_names++);
@@ -87,28 +140,31 @@ static void _start_root_element_cb ( GMarkupParseContext *context,
}
-static void _start_element_cb ( GMarkupParseContext *context,
- const gchar *element_name,
- const gchar **attribute_names,
- const gchar **attribute_values,
- gpointer user_data,
- GError **error) {
-
- XMLNode *node = (XMLNode *) user_data;
+static void _start_element_cb (
+ GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error
+) {
+ XMLNode *p, *node = (XMLNode *) user_data;
+ GArray *attributes;
+ gint char_n, line_n;
if (node->text) {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, " ");
return;
}
- XMLNode *p = g_slice_new0 (XMLNode);
+ p = g_slice_new0 (XMLNode);
node->sub_nodes = g_list_append (node->sub_nodes, p);
g_markup_parse_context_push (context, &parser, p);
p->name = g_strdup (element_name);
- GArray *attributes = g_array_new (TRUE, TRUE, sizeof (gchar *));
+ attributes = g_array_new (TRUE, TRUE, sizeof (gchar *));
while (*attribute_names != NULL && *attribute_values != NULL) {
gchar *p2;
p2 = g_strdup (*attribute_names++);
@@ -119,15 +175,17 @@ static void _start_element_cb ( GMarkupParseContext *context,
p->attributes = (gchar **)g_array_free (attributes, FALSE);
- gint char_n, line_n;
g_markup_parse_context_get_position(context, &line_n, &char_n);
- p->line_number = line_n - (char_n <= 1 ? 1 : 0);
+ p->line_no = line_n - (char_n <= 1 ? 1 : 0);
}
-static void _end_element_cb ( GMarkupParseContext *context,
- const gchar *element_name,
- gpointer user_data,
- GError **error) {
+static void
+_end_element_cb (
+ GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error
+) {
XMLNode *p = (XMLNode *) g_markup_parse_context_pop (context);
if (p->text && p->sub_nodes) {
@@ -139,8 +197,11 @@ static void _end_element_cb ( GMarkupParseContext *context,
}
}
-static gboolean _is_space ( const gchar *text,
- gsize text_len) {
+static gboolean
+_is_space (
+ const gchar *text,
+ gsize text_len
+) {
gsize i = 0;
for (i = 0; text[i] != '\0' && i < text_len; i++) {
@@ -158,11 +219,14 @@ static gboolean _is_space ( const gchar *text,
return TRUE;
}
-static void _text_cb ( GMarkupParseContext *context,
- const gchar *text,
- gsize text_len,
- gpointer user_data,
- GError **error) {
+static void
+_text_cb (
+ GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error
+) {
XMLNode *p = (XMLNode *)user_data;
if (_is_space (text, text_len)) {
@@ -185,15 +249,10 @@ static GMarkupParser parser = {
0,
};
-XMLNode *xml_parse_file (const gchar *filename) {
+XMLNode *
+xml_parse_file (const gchar *filename) {
gboolean retval = FALSE;
GError *error = NULL;
- FILE *pf = fopen (filename, "r");
-
- if (pf == NULL) {
- return NULL;
- }
-
GMarkupParseContext *context;
XMLNode *node;
@@ -205,6 +264,12 @@ XMLNode *xml_parse_file (const gchar *filename) {
0,
};
+ FILE *pf = fopen (filename, "r");
+
+ if (pf == NULL) {
+ return NULL;
+ }
+
do {
context = g_markup_parse_context_new (&root_parser, 0, &node, 0);
@@ -238,7 +303,8 @@ XMLNode *xml_parse_file (const gchar *filename) {
return NULL;
}
-XMLNode *xml_parse_buffer (const gchar *buffer, GError **error) {
+XMLNode *
+xml_parse_buffer (const gchar *buffer, GError **error) {
gboolean retval;
GMarkupParseContext *context;
@@ -266,7 +332,6 @@ XMLNode *xml_parse_buffer (const gchar *buffer, GError **error) {
return node;
} while (0);
- //g_warning ("Parse buffer failed: %s", (*error)->message);
g_markup_parse_context_free (context);
return NULL;
}
@@ -279,7 +344,11 @@ static void output_indent (int level, GString *output) {
}
}
-static void xml_output_indent (const XMLNode *node, int level, GString *output) {
+static void xml_output_indent (
+ const XMLNode *node,
+ int level,
+ GString *output
+) {
gchar **attrs;
output_indent (level, output);
@@ -293,8 +362,8 @@ static void xml_output_indent (const XMLNode *node, int level, GString *output)
}
if (node->sub_nodes != NULL) {
- g_string_append (output, ">\n");
GList *sub_node;
+ g_string_append (output, ">\n");
for (sub_node = node->sub_nodes; sub_node != NULL; sub_node = sub_node->next) {
xml_output_indent (sub_node->data, level + 1, output);