fix fib zeros
parent
33b34781c1
commit
5c55e80477
|
@ -81,8 +81,8 @@ textbook.
|
||||||
|
|
||||||
sub fib {
|
sub fib {
|
||||||
my $num=shift;
|
my $num=shift;
|
||||||
return 0 if $num == 1;
|
return 0 if $num == 0;
|
||||||
return 1 if $num == 2;
|
return 1 if $num == 1;
|
||||||
return fib($num - 1) + fib($num - 2);
|
return fib($num - 1) + fib($num - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ And let's change the `preprocess` sub to use it:
|
||||||
|
|
||||||
sub preprocess {
|
sub preprocess {
|
||||||
my %params=@_;
|
my %params=@_;
|
||||||
my $num=$last++;
|
my $num=++$last;
|
||||||
return fib($num);
|
return fib($num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ Feel free to try it out with a simple page like this:
|
||||||
|
|
||||||
Looks like it works ok, doesn't it? That creates a page that lists:
|
Looks like it works ok, doesn't it? That creates a page that lists:
|
||||||
|
|
||||||
1, 1, 3, 5, 8
|
1, 1, 2, 3, 5
|
||||||
|
|
||||||
But what happens if there are two pages that both use fib? Try it out.
|
But what happens if there are two pages that both use fib? Try it out.
|
||||||
If ikiwiki builds both pages in one pass, the sequence will continue
|
If ikiwiki builds both pages in one pass, the sequence will continue
|
||||||
|
@ -127,7 +127,7 @@ to start from 1 in every page that uses it.
|
||||||
sub preprocess {
|
sub preprocess {
|
||||||
my %params=@_;
|
my %params=@_;
|
||||||
my $page=$params{destpage};
|
my $page=$params{destpage};
|
||||||
my $num=$last{$page}++;
|
my $num=++$last{$page};
|
||||||
return fib($num);
|
return fib($num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ Just insert these lines of code inside `preprocess`, in the appropriate
|
||||||
spot:
|
spot:
|
||||||
|
|
||||||
if (exists $params{seed}) {
|
if (exists $params{seed}) {
|
||||||
$last{$page}=$params{seed}-1;
|
$last{$page}=$params{seed};
|
||||||
}
|
}
|
||||||
|
|
||||||
But this highlights another issue with the plugin. The `fib()` function is
|
But this highlights another issue with the plugin. The `fib()` function is
|
||||||
|
@ -158,7 +158,7 @@ Now, we could try to fix `fib()` to run in constant time for any number,
|
||||||
but that's not the focus of this tutorial. Instead, let's concentrate on
|
but that's not the focus of this tutorial. Instead, let's concentrate on
|
||||||
making the plugin use the existing function safely. A good first step would
|
making the plugin use the existing function safely. A good first step would
|
||||||
be a guard on how high it will go.
|
be a guard on how high it will go.
|
||||||
|
|
||||||
my %last;
|
my %last;
|
||||||
|
|
||||||
sub preprocess {
|
sub preprocess {
|
||||||
|
@ -167,7 +167,7 @@ be a guard on how high it will go.
|
||||||
if (exists $params{seed}) {
|
if (exists $params{seed}) {
|
||||||
$last{$page}=$params{seed}-1;
|
$last{$page}=$params{seed}-1;
|
||||||
}
|
}
|
||||||
my $num=$last{$page}++;
|
my $num=++$last{$page};
|
||||||
if ($num > 25) {
|
if ($num > 25) {
|
||||||
error "can only calculate the first 25 numbers in the sequence";
|
error "can only calculate the first 25 numbers in the sequence";
|
||||||
}
|
}
|
||||||
|
@ -178,10 +178,10 @@ Returning an error message like this is standard for preprocessor plugins,
|
||||||
so that the user can look at the built page and see what went wrong.
|
so that the user can look at the built page and see what went wrong.
|
||||||
|
|
||||||
Are we done? Nope, there's still a security hole. Consider what `fib()`
|
Are we done? Nope, there's still a security hole. Consider what `fib()`
|
||||||
does for numbers less than 1. Or for any number that's not an integer. In
|
does for numbers less than 0. Or for any number that's not an integer. In
|
||||||
either case, it will run forever. Here's one way to fix that:
|
either case, it will run forever. Here's one way to fix that:
|
||||||
|
|
||||||
if (int($num) != $num || $num < 1) {
|
if (int($num) != $num || $num < 0) {
|
||||||
error "positive integers only, please";
|
error "positive integers only, please";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue