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) {

Reply via email to