]> git.vpit.fr Git - perl/modules/Scalar-Vec-Util.git/commitdiff
Fix shifting more bits than the length of the window
authorVincent Pit <vince@profvince.com>
Sat, 16 May 2009 12:27:47 +0000 (14:27 +0200)
committerVincent Pit <vince@profvince.com>
Sat, 16 May 2009 12:27:47 +0000 (14:27 +0200)
lib/Scalar/Vec/Util.pm
t/40-vshift.t

index 12d049c26364708fa28e59b337745040da53e5e4..b5a8080e7f235a1cde6ca7693f59dd9547d92af0 100644 (file)
@@ -132,14 +132,17 @@ sub vshift {
   $left = 0;
   $bits = -$bits;
  }
- $bits    = $length if $bits > $length;
- $length -= $bits;
- if ($left) {
-  vcopy($_[0], $start, $_[0], $start + $bits, $length);
-  vfill($_[0], $start, $bits, $insert) if defined $insert;
+ if ($bits < $length) {
+  $length -= $bits;
+  if ($left) {
+   vcopy($_[0], $start, $_[0], $start + $bits, $length);
+   vfill($_[0], $start, $bits, $insert) if defined $insert;
+  } else {
+   vcopy($_[0], $start + $bits, $_[0], $start, $length);
+   vfill($_[0], $start + $length, $bits, $insert) if defined $insert;
+  }
  } else {
-  vcopy($_[0], $start + $bits, $_[0], $start, $length);
-  vfill($_[0], $start + $length, $bits, $insert) if defined $insert;
+  vfill($_[0], $start, $length, $insert) if defined $insert;
  }
 }
 
index 39e14d54e280c2f6ad046b41bd21ab14efb2a596..5fe1b69feded44e87c5d534b904bc2faba27cee9 100644 (file)
@@ -27,6 +27,22 @@ sub pat {
  }
 }
 
+sub expect {
+ (undef, my $s, my $l, my $b, my $left, my $insert) = @_;
+ myfill($_[0], 0, $s, 0);
+ if ($b < $l) {
+  if ($left) {
+   myfill($_[0], $s,      $b,      defined $insert ? $insert : 1);
+   myfill($_[0], $s + $b, $l - $b, 1);
+  } else {
+   myfill($_[0], $s,           $l - $b, 1);
+   myfill($_[0], $s + $l - $b, $b,      defined $insert ? $insert : 1);
+  }
+ } else {
+  myfill($_[0], $s, $l, defined $insert ? $insert : 1);
+ }
+}
+
 my ($v, $v0, $c) = ('', '') x 2;
 
 sub try {
@@ -35,22 +51,16 @@ sub try {
  for my $s (@s) {
   for my $l (0 .. $n - 1) {
    last if $s + $l > $n;
+   rst $v0;
    pat $v0, $s, $l, 0;
    my @b = (0);
    my $l2 = int($l/2);
    push @b, $l2 if $l2 != $l;
-   push @b, $l  if $l;
+   push @b, $l + 1;
    for my $b (@b) {
     $v = $v0;
-    $c = '';
-    myfill($c, 0, $s, 0);
-    if ($left) {
-     myfill($c, $s,      $b,      defined $insert ? $insert : 1);
-     myfill($c, $s + $b, $l - $b, 1);
-    } else {
-     myfill($c, $s,           $l - $b, 1);
-     myfill($c, $s + $l - $b, $b,      defined $insert ? $insert : 1);
-    }
+    rst $c;
+    expect $c, $s, $l, $b, $left, $insert;
     $b = -$b unless $left;
     vshift $v, $s, $l => $b, $insert;
     my $i = defined $insert ? $insert : 'undef';