diff options
| author | Teddy Wing | 2021-08-15 19:22:28 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2021-08-15 19:22:28 +0200 | 
| commit | c03cb253bf0400654ea5a1ac9e06be7e6275eab8 (patch) | |
| tree | 8286924b9d63946564261733745d79bbcb277f05 | |
| parent | 12d8440ec63b9d9fdcae337533e78eaaddc054a7 (diff) | |
| download | readline-incdec-c03cb253bf0400654ea5a1ac9e06be7e6275eab8.tar.bz2 | |
incdec: Handle point in the middle of subsequent numbers
Previously, we correctly incremented the first number if point was in
the middle of that number, but we did not do so for subsequent numbers.
This change adds similar handling for all numbers in the line.
Got a little lost here trying different loops and changes. I kind of
hacked it without heavily planning the algorithm ahead of time.
The idea is that if the point position is beyond the right side of the
match, we cut off the part of the line from the start to the end of the
last match, then try matching again. This allows us to pull out the
number around point so that we can increment it with the evaluated regex
that follows the loop.
| -rw-r--r-- | incdec.pm | 60 | 
1 files changed, 52 insertions, 8 deletions
| @@ -1,6 +1,8 @@  use strict;  use warnings; +# use 5.010; +  package incdec;  sub incdec { @@ -13,8 +15,46 @@ sub incdec {  	# If point is within a number, move it to ensure we match the whole number  	# rather than only part of its digits. +	my $final_line = '';  	my $line_part = $line; -	while (1) { +	# my $previous_point_position = $point_position; +	my $previous_point_position = 0; +	$final_line .= substr($line_part, $previous_point_position); +	# while (1) { +	# for (my $i = 0; $i < 3; $i++) { +	# while ($point_position < length($line_part)) { +	# # do { +	# 	$line_part =~ /(\d+)/; +	# 	say "$-[0]:$+[0]...$line_part..."; +	# 	if ($-[0] <= $point_position && $point_position < $+[0]) { +	# 		$point_position = $-[0]; +    # +	# 		last; +	# 	} +    # +	# 	# if ($point_position >= length($line_part)) { +	# 	# 	last; +	# 	# } +	# 	# elsif ($point_position >= $+[0]) { +	# 	if ($point_position >= $+[0]) { +	# 		# repeat loop +	# 		$final_line .= substr($line, $previous_point_position, $point_position + 1); +	# 		$line_part = substr $line_part, $point_position; +	# 		next; +	# 	} +	# 	else { +	# 		last; +	# 	} +    # +	# 	# $line_part = substr $line_part, $point_position; +	# } +	# } while ($point_position < length($line_part)); + +	my $line_start = ''; +	# while ($line_part =~ /(\d+)/) { +	while ($point_position < length($line_part)) { +		my $len = length($line_part); +		# print "p[$line_part]p{$point_position:$len}";  		$line_part =~ /(\d+)/;  		if ($-[0] <= $point_position && $point_position < $+[0]) {  			$point_position = $-[0]; @@ -23,27 +63,31 @@ sub incdec {  		}  		if ($point_position >= $+[0]) { -			# repeat loop +			$line_start .= substr($line_part, $previous_point_position, $+[0]); +			$line_part = substr($line_part, $+[0]); +			$previous_point_position = $point_position; +			$point_position = 0; +  			next;  		}  		else {  			last;  		} - -		$line_part = substr $line_part, $point_position;  	}  	# my $line_part = substr $line, $point_position;  	$line_part =~ s/(\d+)/$1+1/e; -	my $line_excluded = substr $line, 0, $original_point_position; +	my $line_excluded = substr $line_start, 0, $original_point_position; +	# print "x[$line_excluded]x[$line_part]x"; -	# $line = $line_excluded . $line_part; +	$line = $line_excluded . $line_part; -	# return $line; +	return $line; -	return $line_part; +	# return $line_part; +	# return $final_line;  }  1; | 
