summaryrefslogtreecommitdiff
path: root/girepository
diff options
context:
space:
mode:
authorColin Walters <walters@src.gnome.org>2009-02-11 00:08:49 +0000
committerColin Walters <walters@src.gnome.org>2009-02-11 00:08:49 +0000
commite8fe46415ee058af96ca93f822e0ded9b033f45a (patch)
treee5bcb57c76d92f995169d01f21dfe688343177be /girepository
parent049dc259e7f2c5f71eec63fb42a5cd5ec70d7be3 (diff)
downloadgobject-introspection-e8fe46415ee058af96ca93f822e0ded9b033f45a.tar.gz
Bug 571248 - Ignore unknown elements in girparser
We want the gir to be extensible. svn path=/trunk/; revision=1096
Diffstat (limited to 'girepository')
-rw-r--r--girepository/girparser.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/girepository/girparser.c b/girepository/girparser.c
index b376234d..97e3a1e0 100644
--- a/girepository/girparser.c
+++ b/girepository/girparser.c
@@ -66,7 +66,8 @@ typedef enum
STATE_CLASS_CONSTANT,
STATE_INTERFACE_CONSTANT,
STATE_ALIAS,
- STATE_TYPE
+ STATE_TYPE,
+ STATE_UNKNOWN
} ParseState;
typedef struct _ParseContext ParseContext;
@@ -75,6 +76,7 @@ struct _ParseContext
GIrParser *parser;
ParseState state;
+ int unknown_depth;
ParseState prev_state;
GList *modules;
@@ -2640,15 +2642,15 @@ start_element_handler (GMarkupParseContext *context,
break;
}
- g_markup_parse_context_get_position (context, &line_number, &char_number);
-
- if (error && *error == NULL)
- g_set_error (error,
- G_MARKUP_ERROR,
- G_MARKUP_ERROR_UNKNOWN_ELEMENT,
- "Unexpected start tag '%s' on line %d char %d; current state=%d",
- element_name,
- line_number, char_number, ctx->state);
+ if (ctx->state != STATE_UNKNOWN)
+ {
+ state_switch (ctx, STATE_UNKNOWN);
+ ctx->unknown_depth = 1;
+ }
+ else
+ {
+ ctx->unknown_depth += 1;
+ }
out: ;
if (*error)
@@ -3008,6 +3010,11 @@ end_element_handler (GMarkupParseContext *context,
end_type (ctx);
break;
}
+ case STATE_UNKNOWN:
+ ctx->unknown_depth -= 1;
+ if (ctx->unknown_depth == 0)
+ state_switch (ctx, ctx->prev_state);
+ break;
default:
g_error ("Unhandled state %d in end_element_handler\n", ctx->state);
}