~ubuntu-branches/ubuntu/natty/gobject-introspection/natty-201101211713

« back to all changes in this revision

Viewing changes to girepository/giunioninfo.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Ancell
  • Date: 2010-08-10 17:55:47 UTC
  • mfrom: (1.1.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20100810175547-vurvcv4o1k3ij201
Tags: 0.9.3-0ubuntu1
* New upstream release
* debian/control:
  - Added Vcs-Bzr link
* debian/patches/01_fix_arm_ftbfs.patch:
  - Applied upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* GObject introspection: Union implementation
 
2
 *
 
3
 * Copyright (C) 2005 Matthias Clasen
 
4
 * Copyright (C) 2008,2009 Red Hat, Inc.
 
5
 *
 
6
 * This library is free software; you can redistribute it and/or
 
7
 * modify it under the terms of the GNU Lesser General Public
 
8
 * License as published by the Free Software Foundation; either
 
9
 * version 2 of the License, or (at your option) any later version.
 
10
 *
 
11
 * This library is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
 * Lesser General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU Lesser General Public
 
17
 * License along with this library; if not, write to the
 
18
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
19
 * Boston, MA 02111-1307, USA.
 
20
 */
 
21
 
 
22
#include <glib.h>
 
23
 
 
24
#include <girepository.h>
 
25
#include "girepository-private.h"
 
26
#include "gitypelib-internal.h"
 
27
 
 
28
gint
 
29
g_union_info_get_n_fields  (GIUnionInfo *info)
 
30
{
 
31
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
32
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
33
 
 
34
  return blob->n_fields;
 
35
}
 
36
 
 
37
GIFieldInfo *
 
38
g_union_info_get_field (GIUnionInfo *info,
 
39
                        gint         n)
 
40
{
 
41
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
42
  Header *header = (Header *)rinfo->typelib->data;
 
43
 
 
44
  return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
 
45
                                     rinfo->offset + header->union_blob_size +
 
46
                                     n * header->field_blob_size);
 
47
}
 
48
 
 
49
gint
 
50
g_union_info_get_n_methods (GIUnionInfo *info)
 
51
{
 
52
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
53
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
54
 
 
55
  return blob->n_functions;
 
56
}
 
57
 
 
58
GIFunctionInfo *
 
59
g_union_info_get_method (GIUnionInfo *info,
 
60
                         gint         n)
 
61
{
 
62
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
63
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
64
  Header *header = (Header *)rinfo->typelib->data;
 
65
  gint offset;
 
66
 
 
67
  offset = rinfo->offset + header->union_blob_size
 
68
    + blob->n_fields * header->field_blob_size
 
69
    + n * header->function_blob_size;
 
70
  return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
 
71
                                        rinfo->typelib, offset);
 
72
}
 
73
 
 
74
gboolean
 
75
g_union_info_is_discriminated (GIUnionInfo *info)
 
76
{
 
77
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
78
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
79
 
 
80
  return blob->discriminated;
 
81
}
 
82
 
 
83
gint
 
84
g_union_info_get_discriminator_offset (GIUnionInfo *info)
 
85
{
 
86
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
87
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
88
 
 
89
  return blob->discriminator_offset;
 
90
}
 
91
 
 
92
GITypeInfo *
 
93
g_union_info_get_discriminator_type (GIUnionInfo *info)
 
94
{
 
95
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
96
 
 
97
  return _g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24);
 
98
}
 
99
 
 
100
GIConstantInfo *
 
101
g_union_info_get_discriminator (GIUnionInfo *info,
 
102
                                gint         n)
 
103
{
 
104
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
105
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
106
 
 
107
  if (blob->discriminated)
 
108
    {
 
109
      Header *header = (Header *)rinfo->typelib->data;
 
110
      gint offset;
 
111
 
 
112
      offset = rinfo->offset + header->union_blob_size
 
113
        + blob->n_fields * header->field_blob_size
 
114
        + blob->n_functions * header->function_blob_size
 
115
        + n * header->constant_blob_size;
 
116
 
 
117
      return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
 
118
                                            rinfo->typelib, offset);
 
119
    }
 
120
 
 
121
  return NULL;
 
122
}
 
123
 
 
124
GIFunctionInfo *
 
125
g_union_info_find_method (GIUnionInfo *info,
 
126
                          const gchar *name)
 
127
{
 
128
  gint offset;
 
129
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
130
  Header *header = (Header *)rinfo->typelib->data;
 
131
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
132
 
 
133
  offset = rinfo->offset + header->union_blob_size
 
134
    + blob->n_fields * header->field_blob_size;
 
135
 
 
136
  return _g_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_functions, name);
 
137
}
 
138
 
 
139
gsize
 
140
g_union_info_get_size (GIUnionInfo *info)
 
141
{
 
142
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
143
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
144
 
 
145
  return blob->size;
 
146
}
 
147
 
 
148
gsize
 
149
g_union_info_get_alignment (GIUnionInfo *info)
 
150
{
 
151
  GIRealInfo *rinfo = (GIRealInfo *)info;
 
152
  UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
 
153
 
 
154
  return blob->alignment;
 
155
}