diff options
Diffstat (limited to 'saedit/xml.c')
-rw-r--r-- | saedit/xml.c | 189 |
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); |