+parse_requires (ParserData *data,
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ GError **error)
+{
+ RequiresInfo *req_info;
+ const gchar *library = NULL;
+ const gchar *version = NULL;
+ gchar **split;
+ gint i, version_major = 0, version_minor = 0;
+ gint line_number, char_number;
+
+ g_markup_parse_context_get_position (data->ctx,
+ &line_number,
+ &char_number);
+
+ for (i = 0; names[i] != NULL; i++)
+ {
+ if (strcmp (names[i], "lib") == 0)
+ library = values[i];
+ else if (strcmp (names[i], "version") == 0)
+ version = values[i];
+ else
+ error_invalid_attribute (data, element_name, names[i], error);
+ }
+
+ if (!library || !version)
+ {
+ error_missing_attribute (data, element_name,
+ version ? "lib" : "version", error);
+ return;
+ }
+
+ if (!(split = g_strsplit (version, ".", 2)) || !split[0] || !split[1])
+ {
+ g_set_error (error,
+ GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "%s:%d:%d <%s> attribute has malformed value \"%s\"",
+ data->filename,
+ line_number, char_number, "version", version);
+ return;
+ }
+ version_major = g_ascii_strtoll (split[0], NULL, 10);
+ version_minor = g_ascii_strtoll (split[1], NULL, 10);
+ g_strfreev (split);
+
+ req_info = g_slice_new0 (RequiresInfo);
+ req_info->library = g_strdup (library);
+ req_info->major = version_major;
+ req_info->minor = version_minor;
+ state_push (data, req_info);
+ req_info->tag.name = element_name;
+}
+
+static gboolean
+is_requested_object (const gchar *object,
+ ParserData *data)
+{
+ GSList *l;
+
+ for (l = data->requested_objects; l; l = l->next)
+ {
+ if (strcmp (l->data, object) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+parse_object (GMarkupParseContext *context,
+ ParserData *data,
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ GError **error)