diff options
author | Vasily_Makarov <danilka.pro@gmail.com> | 2012-02-09 12:07:10 +0400 |
---|---|---|
committer | Vasily_Makarov <danilka.pro@gmail.com> | 2012-02-09 12:07:10 +0400 |
commit | cc459a0b40bb56f6559c855ecb5b956b9ee6a90b (patch) | |
tree | 8698d1e99eec34b24f14f21c176871b88863fa18 /saedit/xml.c | |
parent | 6545f58904d754db19800a1cd21f472eb13339bd (diff) | |
download | tools-cc459a0b40bb56f6559c855ecb5b956b9ee6a90b.tar.gz tools-cc459a0b40bb56f6559c855ecb5b956b9ee6a90b.tar.bz2 tools-cc459a0b40bb56f6559c855ecb5b956b9ee6a90b.tar.xz tools-cc459a0b40bb56f6559c855ecb5b956b9ee6a90b.zip |
SAE: Changed error structure
Diffstat (limited to 'saedit/xml.c')
-rw-r--r-- | saedit/xml.c | 587 |
1 files changed, 280 insertions, 307 deletions
diff --git a/saedit/xml.c b/saedit/xml.c index 602dfaf..4db8235 100644 --- a/saedit/xml.c +++ b/saedit/xml.c @@ -12,399 +12,372 @@ #include "xml.h" 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 **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 **attr = node->attributes; - int i; - for (i = 0; i < g_strv_length(attr); i += 2) - if (g_str_equal(attr[i], attr_name)) - return attr[i + 1]; - return NULL; + gchar **attr = node->attributes; + int i; + for (i = 0; i < g_strv_length(attr); i += 2) + if (g_str_equal(attr[i], attr_name)) + return attr[i + 1]; + return NULL; } gint xml_node_compare_with_name_func(gconstpointer a, gconstpointer b) { - return g_strcmp0((gchar *)b, ((XMLNode *)a)->name); + return g_strcmp0((gchar *)b, ((XMLNode *)a)->name); } 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")); + 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])); + return g_strcmp0(attr[1], + xml_node_get_attr_value(node, attr[0])); } -typedef enum -{ - STATE_START, - STATE_AFTER_OPEN_ANGLE, - STATE_AFTER_CLOSE_ANGLE, - STATE_AFTER_ELISION_SLASH, /* the slash that obviates need for end element */ - STATE_INSIDE_OPEN_TAG_NAME, - STATE_INSIDE_ATTRIBUTE_NAME, - STATE_AFTER_ATTRIBUTE_NAME, - STATE_BETWEEN_ATTRIBUTES, - STATE_AFTER_ATTRIBUTE_EQUALS_SIGN, - STATE_INSIDE_ATTRIBUTE_VALUE_SQ, - STATE_INSIDE_ATTRIBUTE_VALUE_DQ, - STATE_INSIDE_TEXT, - STATE_AFTER_CLOSE_TAG_SLASH, - STATE_INSIDE_CLOSE_TAG_NAME, - STATE_AFTER_CLOSE_TAG_NAME, - STATE_INSIDE_PASSTHROUGH, - STATE_ERROR +typedef enum { + STATE_START, + STATE_AFTER_OPEN_ANGLE, + STATE_AFTER_CLOSE_ANGLE, + STATE_AFTER_ELISION_SLASH, /* the slash that obviates need for end element */ + STATE_INSIDE_OPEN_TAG_NAME, + STATE_INSIDE_ATTRIBUTE_NAME, + STATE_AFTER_ATTRIBUTE_NAME, + STATE_BETWEEN_ATTRIBUTES, + STATE_AFTER_ATTRIBUTE_EQUALS_SIGN, + STATE_INSIDE_ATTRIBUTE_VALUE_SQ, + STATE_INSIDE_ATTRIBUTE_VALUE_DQ, + STATE_INSIDE_TEXT, + STATE_AFTER_CLOSE_TAG_SLASH, + STATE_INSIDE_CLOSE_TAG_NAME, + STATE_AFTER_CLOSE_TAG_NAME, + STATE_INSIDE_PASSTHROUGH, + STATE_ERROR } GMarkupParseState; -typedef struct -{ - const GMarkupParser *parser; +typedef struct { + const GMarkupParser *parser; - GMarkupParseFlags flags; + GMarkupParseFlags flags; - gint line_number; - gint char_number; + gint line_number; + gint char_number; - GMarkupParseState state; + GMarkupParseState state; - gpointer user_data; - GDestroyNotify dnotify; + gpointer user_data; + GDestroyNotify dnotify; - /* A piece of character data or an element that - * hasn't "ended" yet so we haven't yet called - * the callback for it. - */ - GString *partial_chunk; - GSList *spare_chunks; + /* A piece of character data or an element that + * hasn't "ended" yet so we haven't yet called + * the callback for it. + */ + GString *partial_chunk; + GSList *spare_chunks; - GSList *tag_stack; - GSList *tag_stack_gstr; - GSList *spare_list_nodes; + GSList *tag_stack; + GSList *tag_stack_gstr; + GSList *spare_list_nodes; - GString **attr_names; - GString **attr_values; - gint cur_attr; - gint alloc_attrs; + GString **attr_names; + GString **attr_values; + gint cur_attr; + gint alloc_attrs; - const gchar *current_text; - gssize current_text_len; - const gchar *current_text_end; + const gchar *current_text; + gssize current_text_len; + const gchar *current_text_end; - /* used to save the start of the last interesting thingy */ - const gchar *start; + /* used to save the start of the last interesting thingy */ + const gchar *start; - const gchar *iter; + const gchar *iter; - guint document_empty : 1; - guint parsing : 1; - guint awaiting_pop : 1; - gint balance; + guint document_empty : 1; + guint parsing : 1; + guint awaiting_pop : 1; + gint balance; - /* subparser support */ - GSList *subparser_stack; /* (GMarkupRecursionTracker *) */ - const char *subparser_element; - gpointer held_user_data; + /* subparser support */ + GSList *subparser_stack; /* (GMarkupRecursionTracker *) */ + const char *subparser_element; + gpointer held_user_data; } _GMarkupParseContext; + static GMarkupParser parser; -void -xml_free (XMLNode *node) -{ - g_free (node->name); +void xml_free (XMLNode *node) { + g_free (node->name); - g_free (node->text); + g_free (node->text); - g_strfreev (node->attributes); + g_strfreev (node->attributes); - g_list_foreach (node->sub_nodes, (GFunc) xml_free, NULL); - g_list_free (node->sub_nodes); + g_list_foreach (node->sub_nodes, (GFunc) xml_free, NULL); + g_list_free (node->sub_nodes); - g_slice_free (XMLNode, node); + g_slice_free (XMLNode, node); } -static void -_start_root_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; - g_assert (node != NULL); +static void _start_root_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; + g_assert (node != NULL); - XMLNode *p = g_slice_new0 (XMLNode); + XMLNode *p = g_slice_new0 (XMLNode); - p->name = g_strdup (element_name); + p->name = g_strdup (element_name); - GArray *attributes = g_array_new (TRUE, TRUE, sizeof (gchar *)); - while (*attribute_names != NULL && *attribute_values != NULL) { - gchar *p; - p = g_strdup (*attribute_names++); - g_array_append_val (attributes, p); - p = g_strdup (*attribute_values++); - g_array_append_val (attributes, p); - } + GArray *attributes = g_array_new (TRUE, TRUE, sizeof (gchar *)); + while (*attribute_names != NULL && *attribute_values != NULL) { + gchar *p; + p = g_strdup (*attribute_names++); + g_array_append_val (attributes, p); + p = g_strdup (*attribute_values++); + g_array_append_val (attributes, p); + } - p->attributes = (gchar **) g_array_free (attributes, FALSE); + p->attributes = (gchar **) g_array_free (attributes, FALSE); - g_markup_parse_context_push (context, &parser, p); - *node = p; + g_markup_parse_context_push (context, &parser, p); + *node = p; } -static void -_start_element_cb (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error) -{ +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; + XMLNode *node = (XMLNode *) user_data; - if (node->text) { - g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, " "); - return; - } + if (node->text) { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, " "); + return; + } - XMLNode *p = g_slice_new0 (XMLNode); + XMLNode *p = g_slice_new0 (XMLNode); - node->sub_nodes = g_list_append (node->sub_nodes, p); - g_markup_parse_context_push (context, &parser, p); + node->sub_nodes = g_list_append (node->sub_nodes, p); + g_markup_parse_context_push (context, &parser, p); - p->name = g_strdup (element_name); + p->name = g_strdup (element_name); - GArray *attributes = g_array_new (TRUE, TRUE, sizeof (gchar *)); - while (*attribute_names != NULL && *attribute_values != NULL) { - gchar *p; - p = g_strdup (*attribute_names++); - g_array_append_val (attributes, p); - p = g_strdup (*attribute_values++); - g_array_append_val (attributes, p); - } + GArray *attributes = g_array_new (TRUE, TRUE, sizeof (gchar *)); + while (*attribute_names != NULL && *attribute_values != NULL) { + gchar *p; + p = g_strdup (*attribute_names++); + g_array_append_val (attributes, p); + p = g_strdup (*attribute_values++); + g_array_append_val (attributes, p); + } - p->attributes = (gchar **)g_array_free (attributes, FALSE); + p->attributes = (gchar **)g_array_free (attributes, FALSE); - p->line_number = ((_GMarkupParseContext*)context)->line_number - (((_GMarkupParseContext*)context)->char_number <= 1); + p->line_number = ((_GMarkupParseContext*)context)->line_number - (((_GMarkupParseContext*)context)->char_number <= 1); } -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) { - g_warning ("Error"); - } - - if (p->text == NULL && p->sub_nodes == NULL) { - p->text = g_strdup (""); - } +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) { + g_warning ("Error"); + } + + if (p->text == NULL && p->sub_nodes == NULL) { + p->text = g_strdup (""); + } } -static gboolean -_is_space (const gchar *text, - gsize text_len) -{ - gsize i = 0; - - for (i = 0; text[i] != '\0' && i < text_len; i++) { - switch (text[i]) { - case '\t': - case ' ': - case '\n': - case '\r': - continue; - default: - return FALSE; - } - } - - return TRUE; +static gboolean _is_space ( const gchar *text, + gsize text_len) { + gsize i = 0; + + for (i = 0; text[i] != '\0' && i < text_len; i++) { + switch (text[i]) { + case '\t': + case ' ': + case '\n': + case '\r': + continue; + default: + return FALSE; + } + } + + return TRUE; } -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)) { - return; - } - - if (p->sub_nodes || p->text) { - g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, " "); - return; - } - - p->text = g_strndup (text, text_len); +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)) { + return; + } + + if (p->sub_nodes || p->text) { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, " "); + return; + } + + p->text = g_strndup (text, text_len); } static GMarkupParser parser = { - _start_element_cb, - _end_element_cb, - _text_cb, - 0, - 0, + _start_element_cb, + _end_element_cb, + _text_cb, + 0, + 0, }; -XMLNode * -xml_parse_file (const gchar *filename) -{ - gboolean retval = FALSE; - GError *error = NULL; - FILE *pf = fopen (filename, "r"); +XMLNode *xml_parse_file (const gchar *filename) { + gboolean retval = FALSE; + GError *error = NULL; + FILE *pf = fopen (filename, "r"); - if (pf == NULL) { - return NULL; - } + if (pf == NULL) { + return NULL; + } - GMarkupParseContext *context; - XMLNode *node; + GMarkupParseContext *context; + XMLNode *node; - const static GMarkupParser root_parser = { - _start_root_element_cb, - _end_element_cb, - _text_cb, - 0, - 0, - }; + const static GMarkupParser root_parser = { + _start_root_element_cb, + _end_element_cb, + _text_cb, + 0, + 0, + }; - do { - context = g_markup_parse_context_new (&root_parser, 0, &node, 0); + do { + context = g_markup_parse_context_new (&root_parser, 0, &node, 0); - while (!feof (pf)) { - gchar buf[1024]; - gssize len = 0; + while (!feof (pf)) { + gchar buf[1024]; + gssize len = 0; - len = fread (buf, 1, sizeof (buf), pf); - retval = g_markup_parse_context_parse (context, buf, len, &error); + len = fread (buf, 1, sizeof (buf), pf); + retval = g_markup_parse_context_parse (context, buf, len, &error); - if (!retval) - break; - } - fclose (pf); + if (!retval) + break; + } + fclose (pf); - if (!retval) - break; + if (!retval) + break; - retval = g_markup_parse_context_end_parse (context, &error); - if (!retval) - break; + retval = g_markup_parse_context_end_parse (context, &error); + if (!retval) + break; - g_markup_parse_context_free (context); + g_markup_parse_context_free (context); - return node; - } while (0); + return node; + } while (0); - g_warning ("Parse %s failed: %s", filename, error->message); - g_error_free (error); - g_markup_parse_context_free (context); - return NULL; + g_warning ("Parse %s failed: %s", filename, error->message); + g_error_free (error); + g_markup_parse_context_free (context); + return NULL; } -XMLNode * -xml_parse_buffer (const gchar *buffer) -{ - gboolean retval; - GError *error = NULL; - - GMarkupParseContext *context; - XMLNode *node; - - const static GMarkupParser root_parser = { - _start_root_element_cb, - _end_element_cb, - _text_cb, - 0, - 0, - }; - - context = g_markup_parse_context_new (&root_parser, 0, &node, 0); - - do { - retval = g_markup_parse_context_parse (context, buffer, strlen (buffer), &error); - if (!retval) - break; - - retval = g_markup_parse_context_end_parse (context, &error); - if (!retval) - break; - g_markup_parse_context_free (context); - return node; - } while (0); - - g_warning ("Parse buffer failed: %s", error->message); - g_error_free (error); - g_markup_parse_context_free (context); - return NULL; +XMLNode *xml_parse_buffer (const gchar *buffer, GError **error) { + gboolean retval; + + GMarkupParseContext *context; + XMLNode *node; + + const static GMarkupParser root_parser = { + _start_root_element_cb, + _end_element_cb, + _text_cb, + 0, + 0, + }; + + context = g_markup_parse_context_new (&root_parser, 0, &node, 0); + + do { + retval = g_markup_parse_context_parse (context, buffer, strlen (buffer), error); + if (!retval) + break; + + retval = g_markup_parse_context_end_parse (context, error); + if (!retval) + break; + g_markup_parse_context_free (context); + return node; + } while (0); + + //g_warning ("Parse buffer failed: %s", (*error)->message); + g_markup_parse_context_free (context); + return NULL; } -static void -output_indent (int level, GString *output) -{ - gint i; - for (i = 0; i < level; i++) { - g_string_append (output, " "); - } +static void output_indent (int level, GString *output) { + gint i; + for (i = 0; i < level; i++) { + g_string_append (output, " "); + } } -static void -xml_output_indent (const XMLNode *node, int level, GString *output) -{ - gchar **attrs; - - output_indent (level, output); - g_string_append_printf (output, "<%s", node->name); - - attrs = node->attributes; - - while (attrs != NULL && *attrs != NULL) { - g_string_append_printf (output, " %s", *(attrs++)); - g_string_append_printf (output, "=\"%s\"", *(attrs++)); - } - - if (node->sub_nodes != NULL){ - g_string_append (output, ">\n"); - GList *sub_node; - - for (sub_node = node->sub_nodes; sub_node != NULL; sub_node = sub_node->next) { - xml_output_indent (sub_node->data, level + 1, output); - } - output_indent (level, output); - g_string_append_printf (output, "</%s>\n",node->name); - } - else if (node->text != NULL) { - gchar *text = g_markup_escape_text (node->text, -1); - g_string_append_printf (output, ">%s</%s>\n", text, node->name); - g_free (text); - } - else { - g_string_append (output, "/>\n"); - } +static void xml_output_indent (const XMLNode *node, int level, GString *output) { + gchar **attrs; + + output_indent (level, output); + g_string_append_printf (output, "<%s", node->name); + + attrs = node->attributes; + + while (attrs != NULL && *attrs != NULL) { + g_string_append_printf (output, " %s", *(attrs++)); + g_string_append_printf (output, "=\"%s\"", *(attrs++)); + } + + if (node->sub_nodes != NULL) { + g_string_append (output, ">\n"); + GList *sub_node; + + for (sub_node = node->sub_nodes; sub_node != NULL; sub_node = sub_node->next) { + xml_output_indent (sub_node->data, level + 1, output); + } + output_indent (level, output); + g_string_append_printf (output, "</%s>\n",node->name); + } else if (node->text != NULL) { + gchar *text = g_markup_escape_text (node->text, -1); + g_string_append_printf (output, ">%s</%s>\n", text, node->name); + g_free (text); + } else { + g_string_append (output, "/>\n"); + } } -void -xml_output (const XMLNode *node, GString *output) -{ - xml_output_indent (node, 0, output); +void xml_output (const XMLNode *node, GString *output) { + xml_output_indent (node, 0, output); } |