@@ -63,6 +63,7 @@ use Getopt::Std qw(getopts);
63
63
use constant A_NOMATCH => -1;
64
64
use constant A_NOPAT => -2;
65
65
use constant A_ALL => -3;
66
+ use constant A_PATTERN => -4;
66
67
67
68
use constant E_ADDREXT => ' unexpected address' ;
68
69
use constant E_ADDRBAD => ' invalid address' ;
@@ -109,7 +110,7 @@ my $NO_QUESTIONS_MODE = 0;
109
110
my $PRINT_NUM = 1;
110
111
my $PRINT_BIN = 2;
111
112
112
- our $VERSION = ' 0.12 ' ;
113
+ our $VERSION = ' 0.13 ' ;
113
114
114
115
my @ESC = (
115
116
' \\ 000' , ' \\ 001' , ' \\ 002' , ' \\ 003' , ' \\ 004' , ' \\ 005' , ' \\ 006' , ' \\ a' ,
@@ -240,6 +241,9 @@ sub input {
240
241
} elsif ($ad == A_NOPAT) {
241
242
edWarn(E_NOPAT);
242
243
return ;
244
+ } elsif ($ad == A_PATTERN) {
245
+ edWarn(E_PATTERN);
246
+ return ;
243
247
} elsif ($ad > maxline() || $ad < 0) {
244
248
edWarn(E_ADDRBAD);
245
249
return ;
@@ -923,18 +927,19 @@ sub edParse {
923
927
}
924
928
if (s /\A ([gv])\/ // ) {
925
929
my $invert = $1 eq ' v' ;
926
- my $i ;
927
- my @chars = split //;
928
- my $lim = scalar @chars ;
929
- for ($i = 0; $i < $lim ; $i ++) {
930
- my $j = $i - 1;
931
- $j = 0 if $j < 0;
932
- last if $chars [$i ] eq ' /' && $chars [$j ] ne ' \\ ' ;
930
+ my $re = getRe(' /' , 1);
931
+ unless (defined $re ) {
932
+ $adrs [0] = A_PATTERN;
933
+ return 1;
934
+ }
935
+ if (length ($re ) == 0) {
936
+ unless (defined $SearchPat ) {
937
+ $adrs [0] = A_NOPAT;
938
+ return 1;
939
+ }
940
+ $re = $SearchPat ;
933
941
}
934
- return 0 if $i == $lim ; # g/re/p needs trailing /
935
- my $pat = substr $_ , 0, $i ;
936
- $_ = substr $_ , $i + 1;
937
- my @found = edSearchGlobal($pat , $invert );
942
+ my @found = edSearchGlobal($re , $invert );
938
943
return 1 unless @found ; # nothing to do
939
944
$isGlobal = 1;
940
945
@adrs = @found ;
@@ -972,19 +977,12 @@ sub getAddr {
972
977
$n = maxline();
973
978
} elsif (s /\A ([\/\? ])// ) { # search: '/re/' or '?re?'
974
979
my $delim = $1 ;
975
- my $i ;
976
- my @chars = split //;
977
- for ($i = 0; $i < scalar (@chars ); $i ++) {
978
- my $j = $i - 1;
979
- $j = 0 if $j < 0;
980
- last if $chars [$i ] eq $delim && $chars [$j ] ne ' \\ ' ;
981
- }
982
- my $re = substr $_ , 0, $i ;
980
+ my $re = getRe($delim );
981
+ $re = ' ' unless defined $re ; # delim not needed
983
982
if (length ($re ) == 0) {
984
983
return A_NOPAT unless defined $SearchPat ;
985
984
$re = $SearchPat ;
986
985
}
987
- $_ = substr $_ , $i + 1;
988
986
if ($delim eq ' /' ) {
989
987
$n = edSearchForward($re );
990
988
} else {
@@ -995,6 +993,23 @@ sub getAddr {
995
993
return $n ;
996
994
}
997
995
996
+ sub getRe {
997
+ my ($delim , $delimreq ) = @_ ;
998
+ my $i ;
999
+ my @chars = split //;
1000
+ my $sz = scalar @chars ;
1001
+
1002
+ for ($i = 0; $i < $sz ; $i ++) {
1003
+ my $j = $i - 1;
1004
+ $j = 0 if $j < 0;
1005
+ last if $chars [$i ] eq $delim && $chars [$j ] ne ' \\ ' ;
1006
+ }
1007
+ return if $delimreq && $i == $sz ;
1008
+ my $re = substr $_ , 0, $i ;
1009
+ $_ = substr $_ , $i + 1;
1010
+ return $re ;
1011
+ }
1012
+
998
1013
#
999
1014
# Search forward for a pattern...wrap if not found
1000
1015
#
@@ -1065,6 +1080,7 @@ sub edSearchGlobal {
1065
1080
}
1066
1081
$end = $adrs [1];
1067
1082
}
1083
+ $SearchPat = $pattern ;
1068
1084
my @found ;
1069
1085
for my $i ($start .. $end ) {
1070
1086
my $match ;
0 commit comments