Mon Feb 13 15:32:14 2012: Request 74578 was acted upon. Transaction: Correspondence added by DOUGW Queue: Win32-API Subject: Win32::API::Struct alignment wrong Broken in: 0.64 Severity: Normal Owner: Nobody Requestors: do...@cpan.org Status: open Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=74578 >
On Fri Feb 10 06:43:35 2012, cos...@streppone.it wrote: > > I'm going to release this patch to CPAN > during the weekend. > I see you perltidy'd everything. Here's a patch against version 0.65 in case you want to just use the 'patch' command.
--- Struct.pm Sun Feb 12 06:39:26 2012 +++ Struct.pm Mon Feb 13 12:22:16 2012 @@ -212,9 +212,10 @@ $packed_size += $subpacksize; } else { + my $repeat = 1; if ($type =~ /\w\*(\d+)/) { - my $size = $1; - $type = "a$size"; + $repeat = $1; + $type = "a$repeat"; } DEBUG "(PM)Struct::getPack($self->{__typedef__}) ++ $type\n"; @@ -230,7 +231,7 @@ $type_size = Win32::API::Type::sizeof($orig); $type_align = (($packed_size + $type_size) % $type_size); $packing .= "x" x $type_align . $type; - $packed_size += $type_size + $type_align; + $packed_size += ( $type_size * $repeat ) + $type_align; } } @@ -267,7 +268,7 @@ foreach my $member (@{$self->{typedef}}) { ($name, $type, $orig) = @$member; if ($type eq '>') { - my ($subpacking, @subitems, $subpacksize) = $self->{$name}->getUnpack(); + my ($subpacking, $subpacksize, @subitems) = $self->{$name}->getUnpack(); DEBUG "(PM)Struct::getUnpack($self->{__typedef__}) ++ $subpacking\n"; $packing .= $subpacking; $packed_size += $subpacksize; @@ -274,26 +275,27 @@ push(@items, @subitems); } else { + my $repeat = 1; if ($type =~ /\w\*(\d+)/) { - my $size = $1; - $type = "Z$size"; + $repeat = $1; + $type = "Z$repeat"; } DEBUG "(PM)Struct::getUnpack($self->{__typedef__}) ++ $type\n"; $type_size = Win32::API::Type::sizeof($orig); $type_align = (($packed_size + $type_size) % $type_size); $packing .= "x" x $type_align . $type; - $packed_size += $type_size + $type_align; + $packed_size += ( $type_size * $repeat ) + $type_align; push(@items, $name); } } DEBUG "(PM)Struct::getUnpack($self->{__typedef__}): unpack($packing, @items)\n"; - return ($packing, @items, $packed_size); + return ($packing, $packed_size, @items); } sub Unpack { my $self = shift; - my ($packing, @items) = $self->getUnpack(); + my ($packing, undef, @items) = $self->getUnpack(); my @itemvalue = unpack($packing, $self->{buffer}); DEBUG "(PM)Struct::Unpack: unpack($packing, buffer) = @itemvalue\n"; foreach my $i (0 .. $#items) {