From a51ceca67488f39ea7d888d73d38acc4148ed4ed Mon Sep 17 00:00:00 2001 From: Arne Georg Gleditsch Date: Sun, 9 Aug 2009 13:33:32 +0200 Subject: Don't restart match from first line of fragment in each iteration -- it explodes when fragment gets sufficiently large. --- lib/LXRng/Parse/Simple.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/LXRng/Parse/Simple.pm b/lib/LXRng/Parse/Simple.pm index d89ea22..3cbebf1 100644 --- a/lib/LXRng/Parse/Simple.pm +++ b/lib/LXRng/Parse/Simple.pm @@ -66,6 +66,7 @@ sub nextfrag { my ($self) = @_; my $btype; + my $pos = 0; while (1) { if (defined $btype) { if ($$self{'rest'} =~ s/\A((?s:.*?)$$self{'term'}[$btype])//m) { @@ -79,8 +80,9 @@ sub nextfrag { } } else { - if ($$self{'rest'} =~ s/\A((?s).*?)($$self{'open'})//m) { - my $pref = $1; + pos($$self{'rest'}) = $pos; + if ($$self{'rest'} =~ s/\G((?s).*?)($$self{'open'})//m) { + my $pref = substr($$self{'rest'}, 0, $pos, '').$1; my $frag = $2; if ($pref ne '') { @@ -117,6 +119,7 @@ sub nextfrag { } untabify($line, $$self{'tabwidth'}); + $pos = length($$self{'rest'}); $$self{'rest'} .= $line; unless ($$self{'bofseen'}) { -- cgit v1.2.3