aboutsummaryrefslogtreecommitdiff
path: root/doc/plugins
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2012-04-02 11:18:32 -0400
committerJoey Hess <joey@kitenet.net>2012-04-02 11:18:32 -0400
commit5c55e804771a7c3195df62016ad01993581d931a (patch)
tree747d866a48edf1e815ff2bfa3c0b5f3010e0403b /doc/plugins
parent33b34781c1af4eb187af699b52515d8c5a1829d6 (diff)
downloadikiwiki-5c55e804771a7c3195df62016ad01993581d931a.tar
ikiwiki-5c55e804771a7c3195df62016ad01993581d931a.tar.gz
fix fib zeros
Diffstat (limited to 'doc/plugins')
-rw-r--r--doc/plugins/write/tutorial.mdwn20
1 files changed, 10 insertions, 10 deletions
diff --git a/doc/plugins/write/tutorial.mdwn b/doc/plugins/write/tutorial.mdwn
index 5345f71f2..1912c8a2f 100644
--- a/doc/plugins/write/tutorial.mdwn
+++ b/doc/plugins/write/tutorial.mdwn
@@ -81,8 +81,8 @@ textbook.
sub fib {
my $num=shift;
- return 0 if $num == 1;
- return 1 if $num == 2;
+ return 0 if $num == 0;
+ return 1 if $num == 1;
return fib($num - 1) + fib($num - 2);
}
@@ -92,7 +92,7 @@ And let's change the `preprocess` sub to use it:
sub preprocess {
my %params=@_;
- my $num=$last++;
+ my $num=++$last;
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:
- 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.
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 {
my %params=@_;
my $page=$params{destpage};
- my $num=$last{$page}++;
+ my $num=++$last{$page};
return fib($num);
}
@@ -145,7 +145,7 @@ Just insert these lines of code inside `preprocess`, in the appropriate
spot:
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
@@ -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
making the plugin use the existing function safely. A good first step would
be a guard on how high it will go.
-
+
my %last;
sub preprocess {
@@ -167,7 +167,7 @@ be a guard on how high it will go.
if (exists $params{seed}) {
$last{$page}=$params{seed}-1;
}
- my $num=$last{$page}++;
+ my $num=++$last{$page};
if ($num > 25) {
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.
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:
- if (int($num) != $num || $num < 1) {
+ if (int($num) != $num || $num < 0) {
error "positive integers only, please";
}