[librsvg: 90/95] rsvg_start_xinclude(): Parse attributes with the PHF
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 90/95] rsvg_start_xinclude(): Parse attributes with the PHF
- Date: Thu, 22 Feb 2018 03:20:42 +0000 (UTC)
commit 7cb911659f9501d9cf39654daedc68fe49ea7e90
Author: Federico Mena Quintero <federico gnome org>
Date: Wed Feb 21 18:13:27 2018 -0600
rsvg_start_xinclude(): Parse attributes with the PHF
rsvg-base.c | 111 ++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 67 insertions(+), 44 deletions(-)
---
diff --git a/rsvg-base.c b/rsvg-base.c
index 77fc55b6..cb74f54f 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -692,68 +692,91 @@ static void
rsvg_start_xinclude (RsvgHandle *handle, RsvgPropertyBag * atts)
{
RsvgSaxHandlerXinclude *handler;
- const char *href, *parse;
+ const char *href = NULL;
+ const char *parse = NULL;
+ const char *encoding = NULL;
gboolean success = FALSE;
- href = rsvg_property_bag_lookup (atts, "href");
- if (href == NULL)
- goto fallback;
+ RsvgPropertyBagIter *iter;
+ const char *key;
+ RsvgAttribute attr;
+ const char *value;
- parse = rsvg_property_bag_lookup (atts, "parse");
- if (parse && !strcmp (parse, "text")) {
- char *data;
- gsize data_len;
- const char *encoding;
+ iter = rsvg_property_bag_iter_begin (atts);
- data = _rsvg_handle_acquire_data (handle, href, NULL, &data_len, NULL);
- if (data == NULL)
- goto fallback;
+ while (rsvg_property_bag_iter_next (iter, &key, &attr, &value)) {
+ switch (attr) {
+ case RSVG_ATTRIBUTE_HREF:
+ href = value;
+ break;
- encoding = rsvg_property_bag_lookup (atts, "encoding");
- if (encoding && g_ascii_strcasecmp (encoding, "UTF-8") != 0) {
- char *text_data;
- gsize text_data_len;
+ case RSVG_ATTRIBUTE_PARSE:
+ parse = value;
+ break;
- text_data = g_convert (data, data_len, "utf-8", encoding, NULL,
- &text_data_len, NULL);
- g_free (data);
+ case RSVG_ATTRIBUTE_ENCODING:
+ encoding = value;
+ break;
- data = text_data;
- data_len = text_data_len;
+ default:
+ break;
}
+ }
- rsvg_characters_impl (handle, data, data_len);
+ rsvg_property_bag_iter_end (iter);
- g_free (data);
- } else {
- /* xml */
- GInputStream *stream;
- GError *err = NULL;
- xmlParserCtxtPtr xml_parser;
+ if (href) {
+ if (parse && !strcmp (parse, "text")) {
+ char *data;
+ gsize data_len;
- stream = _rsvg_handle_acquire_stream (handle, href, NULL, NULL);
- if (stream == NULL)
- goto fallback;
+ data = _rsvg_handle_acquire_data (handle, href, NULL, &data_len, NULL);
+ if (data) {
+ if (encoding && g_ascii_strcasecmp (encoding, "UTF-8") != 0) {
+ char *text_data;
+ gsize text_data_len;
- xml_parser = create_xml_stream_parser (handle,
- stream,
- NULL, /* cancellable */
- &err);
+ text_data = g_convert (data, data_len, "utf-8", encoding, NULL,
+ &text_data_len, NULL);
+ g_free (data);
- g_object_unref (stream);
+ data = text_data;
+ data_len = text_data_len;
+ }
- if (xml_parser) {
- (void) xmlParseDocument (xml_parser);
+ rsvg_characters_impl (handle, data, data_len);
- xml_parser = rsvg_free_xml_parser_and_doc (xml_parser);
- }
+ g_free (data);
- g_clear_error (&err);
- }
+ success = TRUE;
+ }
+ } else {
+ /* xml */
+ GInputStream *stream;
+ GError *err = NULL;
+ xmlParserCtxtPtr xml_parser;
+
+ stream = _rsvg_handle_acquire_stream (handle, href, NULL, NULL);
+ if (stream) {
+ xml_parser = create_xml_stream_parser (handle,
+ stream,
+ NULL, /* cancellable */
+ &err);
- success = TRUE;
+ g_object_unref (stream);
- fallback:
+ if (xml_parser) {
+ (void) xmlParseDocument (xml_parser);
+
+ xml_parser = rsvg_free_xml_parser_and_doc (xml_parser);
+ }
+
+ g_clear_error (&err);
+
+ success = TRUE;
+ }
+ }
+ }
/* needed to handle xi:fallback */
handler = g_new0 (RsvgSaxHandlerXinclude, 1);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]