2 # Copyright 2002 Patrik Stridvall
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 use output qw($output);
27 my $class = ref($proto) || $proto;
29 bless ($self, $class);
36 my $kind = \${$self->{KIND}};
40 if(defined($_)) { $$kind = $_; }
47 my $_name = \${$self->{_NAME}};
51 if(defined($_)) { $$_name = $_; }
58 my $name = \${$self->{NAME}};
62 if(defined($_)) { $$name = $_; }
67 my $kind = \${$self->{KIND}};
68 my $_name = \${$self->{_NAME}};
70 return "$$kind $$_name";
76 my $pack = \${$self->{PACK}};
80 if(defined($_)) { $$pack = $_; }
88 my $find_size = shift;
90 if (defined($find_size)) {
91 $self->_refresh($find_size);
94 my $count = $self->field_count;
97 for (my $n = 0; $n < $count; $n++) {
98 my $field = 'c_type_field'->new($self, $n);
106 my $field_aligns = \${$self->{FIELD_ALIGNS}};
108 my $find_size = shift;
110 if (defined($find_size)) {
111 $self->_refresh($find_size);
114 return $$field_aligns;
119 my $field_type_names = \${$self->{FIELD_TYPE_NAMES}};
121 my @field_type_names = @{$$field_type_names};
122 my $count = scalar(@field_type_names);
129 my $field_names = \${$self->{FIELD_NAMES}};
133 if(defined($_)) { $$field_names = $_; }
135 return $$field_names;
140 my $field_offsets = \${$self->{FIELD_OFFSETS}};
142 my $find_size = shift;
144 if (defined($find_size)) {
145 $self->_refresh($find_size);
148 return $$field_offsets;
153 my $field_sizes = \${$self->{FIELD_SIZES}};
155 my $find_size = shift;
157 if (defined($find_size)) {
158 $self->_refresh($find_size);
161 return $$field_sizes;
164 sub field_type_names {
166 my $field_type_names = \${$self->{FIELD_TYPE_NAMES}};
170 if(defined($_)) { $$field_type_names = $_; }
172 return $$field_type_names;
178 my $size = \${$self->{SIZE}};
180 my $find_size = shift;
181 if (defined($find_size)) {
182 $self->_refresh($find_size);
191 my $field_aligns = \${$self->{FIELD_ALIGNS}};
192 my $field_offsets = \${$self->{FIELD_OFFSETS}};
193 my $field_sizes = \${$self->{FIELD_SIZES}};
194 my $size = \${$self->{SIZE}};
196 my $find_size = shift;
198 my $pack = $self->pack;
204 foreach my $field ($self->fields) {
205 my $type_name = $field->type_name;
206 my $size = &$find_size($type_name);
209 my $base_type_name = $type_name;
210 if ($base_type_name =~ s/^(.*?)\s*(?:\[\s*(.*?)\s*\]|:(\d+))?$/$1/) {
214 my $base_size = &$find_size($base_type_name);
217 $align = $base_size % 4 if defined($base_size);
218 $align = 4 if !$align;
220 if (!defined($size)) {
223 } elsif ($size >= 0) {
225 $offset += $pack * int(($offset_bits + 8 * $pack - 1 ) / (8 * $pack));
229 $$$field_aligns[$n] = $align;
230 $$$field_offsets[$n] = $offset;
231 $$$field_sizes[$n] = $size;
235 $$$field_aligns[$n] = $align;
236 $$$field_offsets[$n] = $offset;
237 $$$field_sizes[$n] = $size;
239 $offset_bits += -$size;
247 if ($$size % $pack != 0) {
248 $$size = (int($$size / $pack) + 1) * $pack;
253 package c_type_field;
257 my $class = ref($proto) || $proto;
259 bless ($self, $class);
261 my $type = \${$self->{TYPE}};
262 my $number = \${$self->{NUMBER}};
272 my $type = \${$self->{TYPE}};
273 my $number = \${$self->{NUMBER}};
275 my $field_aligns = $$type->field_aligns;
277 return $$field_aligns[$$number];
282 my $type = \${$self->{TYPE}};
283 my $number = \${$self->{NUMBER}};
285 my $field_names = $$type->field_names;
287 return $$field_names[$$number];
292 my $type = \${$self->{TYPE}};
293 my $number = \${$self->{NUMBER}};
295 my $field_offsets = $$type->field_offsets;
297 return $$field_offsets[$$number];
302 my $type = \${$self->{TYPE}};
303 my $number = \${$self->{NUMBER}};
305 my $field_sizes = $$type->field_sizes;
307 return $$field_sizes[$$number];
312 my $type = \${$self->{TYPE}};
313 my $number = \${$self->{NUMBER}};
315 my $field_type_names = $$type->field_type_names;
317 return $$field_type_names[$$number];