diff options
Diffstat (limited to 'girepository/gistructinfo.c')
-rw-r--r-- | girepository/gistructinfo.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/girepository/gistructinfo.c b/girepository/gistructinfo.c index 0fbaec84..bd777463 100644 --- a/girepository/gistructinfo.c +++ b/girepository/gistructinfo.c @@ -22,6 +22,8 @@ #include "config.h" +#include <string.h> + #include <glib.h> #include <girepository.h> @@ -115,6 +117,47 @@ g_struct_info_get_field (GIStructInfo *info, } /** + * g_struct_info_find_field: + * @info: a #GIStructInfo + * @name: a field name + * + * Obtain the type information for field named @name. + * + * Returns: (transfer full): the #GIFieldInfo or %NULL if not found, + * free it with g_base_info_unref() when done. + */ +GIFieldInfo * +g_struct_info_find_field (GIStructInfo *info, + const gchar *name) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + Header *header = (Header *)rinfo->typelib->data; + guint32 offset = rinfo->offset + header->struct_blob_size; + gint i; + + for (i = 0; i < blob->n_fields; i++) + { + FieldBlob *field_blob = (FieldBlob *)&rinfo->typelib->data[offset]; + const gchar *fname = (const gchar *)&rinfo->typelib->data[field_blob->name]; + + if (strcmp (name, fname) == 0) + { + return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, + (GIBaseInfo* )info, + rinfo->typelib, + offset); + } + + offset += header->field_blob_size; + if (field_blob->has_embedded_type) + offset += header->callback_blob_size; + } + + return NULL; +} + +/** * g_struct_info_get_n_methods: * @info: a #GIStructInfo * |