From: Ilya Zakharevich Date: Fri, 20 Feb 1998 00:09:52 +0000 (-0500) Subject: [5.004_5* PATCH] Make ornaments default in Term::ReadLine X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=405ff068e2619349f4ed6b3f2508dc01044357a8;p=p5sagit%2Fp5-mst-13.2.git [5.004_5* PATCH] Make ornaments default in Term::ReadLine Date: Fri, 20 Feb 1998 00:09:52 -0500 (EST) Subject: [PATCH 5.004_5*] Fix debugger messages and the default package Date: Fri, 20 Feb 1998 00:12:28 -0500 (EST) Subject: Re: Continued presence of segmentation violation in study_chunk()[PATCH] Date: Sat, 21 Feb 1998 15:32:29 -0500 (EST) p4raw-id: //depot/perl@576 --- diff --git a/lib/Term/ReadLine.pm b/lib/Term/ReadLine.pm index b6923dd..6b0b5e7 100644 --- a/lib/Term/ReadLine.pm +++ b/lib/Term/ReadLine.pm @@ -139,12 +139,23 @@ None =head1 ENVIRONMENT -The variable C governs which ReadLine clone is loaded. If the -value is false, a dummy interface is used. If the value is true, it -should be tail of the name of the package to use, such as C or -C. +The envrironment variable C governs which ReadLine clone is +loaded. If the value is false, a dummy interface is used. If the value +is true, it should be tail of the name of the package to use, such as +C or C. -If the variable is not set, the best available package is loaded. +As a special case, if the value of this variable is space-separated, +the tail might be used to disable the ornaments by setting the tail to +be C or C. The head should be as described above, say + +If the variable is not set, or if the head of space-separated list is +empty, the best available package is loaded. + + export "PERL_RL=Perl o=0" # Use Perl ReadLine without ornaments + export "PERL_RL= o=0" # Use best available ReadLine without ornaments + +(Note that processing of C for ornaments is in the discretion of the +particular used C package). =cut @@ -205,7 +216,7 @@ sub new { die "method new called with wrong number of arguments" unless @_==2 or @_==4; #local (*FIN, *FOUT); - my ($FIN, $FOUT); + my ($FIN, $FOUT, $ret); if (@_==2) { ($console, $consoleOUT) = findConsole; @@ -215,15 +226,21 @@ sub new { $sel = select(FOUT); $| = 1; # for DB::OUT select($sel); - bless [\*FIN, \*FOUT]; + $ret = bless [\*FIN, \*FOUT]; } else { # Filehandles supplied $FIN = $_[2]; $FOUT = $_[3]; #OUT->autoflush(1); # Conflicts with debugger? $sel = select($FOUT); $| = 1; # for DB::OUT select($sel); - bless [$FIN, $FOUT]; + $ret = bless [$FIN, $FOUT]; } + if ($ret->Features->{ornaments} + and not ($ENV{PERL_RL} and $ENV{PERL_RL} =~ /\bo\w*=0/)) { + local $Term::ReadLine::termcap_nowarn = 1; + $ret->ornaments(1); + } + return $ret; } sub newTTY { @@ -245,7 +262,7 @@ sub Features { \%features } package Term::ReadLine; # So late to allow the above code be defined? -my $which = $ENV{PERL_RL}; +my ($which) = exists $ENV{PERL_RL} ? split /\s+/, $ENV{PERL_RL} : undef; if ($which) { if ($which =~ /\bgnu\b/i){ eval "use Term::ReadLine::Gnu;"; @@ -254,7 +271,7 @@ if ($which) { } else { eval "use Term::ReadLine::$which;"; } -} elsif (defined $which) { # Defined but false +} elsif (defined $which and $which ne '') { # Defined but false # Do nothing fancy } else { eval "use Term::ReadLine::Gnu; 1" or eval "use Term::ReadLine::Perl; 1"; @@ -296,7 +313,11 @@ sub ornaments { $rl_term_set = 'us,ue,md,me' if $rl_term_set == 1; my @ts = split /,/, $rl_term_set, 4; eval { LoadTermCap }; - warn("Cannot find termcap: $@\n"), return unless defined $terminal; + unless (defined $terminal) { + warn("Cannot find termcap: $@\n") unless $Term::ReadLine::termcap_nowarn; + $rl_term_set = ',,,'; + return; + } @rl_term_set = map {$_ ? $terminal->Tputs($_,1) || '' : ''} @ts; return $rl_term_set; } diff --git a/lib/perl5db.pl b/lib/perl5db.pl index 9048ed2..a4a1b1a 100644 --- a/lib/perl5db.pl +++ b/lib/perl5db.pl @@ -390,9 +390,9 @@ sub DB { if ($val ne $old_watch[$n]) { $signal = 1; print $OUT < to quit or B to restart, + use B I to avoid stopping after program termination, + B, B or B to get additional info. +EOP + $package = 'main'; + $usercontext = '($@, $!, $,, $/, $\, $^W) = @saved;' . + "package $package;"; # this won't let them modify, alas } else { $sub =~ s/\'/::/; $prefix = $sub =~ /::/ ? "" : "${'package'}::"; @@ -1461,8 +1470,14 @@ sub resetterm { # We forked, so we need a different TTY TTY($fork_TTY); undef $fork_TTY; } else { - print $OUT "Forked, but do not know how to change a TTY.\n", - "Define \$DB::fork_TTY or get_fork_TTY().\n"; + print_help(< Forked, but do not know how to change a B. I<#########> + Define B<\$DB::fork_TTY> + - or a function B which will set B<\$DB::fork_TTY>. + The value of B<\$DB::fork_TTY> should be the name of I to use. + On I-like systems one can get the name of a I for the given window + by typing B, and disconnect the I from I by B. +EOP } } @@ -1824,7 +1839,7 @@ B Pure-man-restart of debugger, some of debugger state and the following command-line options: I<-w>, I<-I>, I<-e>. B [I] Get help [on a specific debugger command], enter B<|h> to page. B Summary of debugger commands. -B or B<^D> Quit. Set \$DB::finished to 0 to debug global destruction. +B or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction. "; $summary = <<"END_SUM"; diff --git a/regcomp.c b/regcomp.c index 7411b8a..a958971 100644 --- a/regcomp.c +++ b/regcomp.c @@ -339,7 +339,7 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 scan = next; if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) pars++; - if (data_fake.flags & SF_HAS_EVAL) + if (data && (data_fake.flags & SF_HAS_EVAL)) data->flags |= SF_HAS_EVAL; if (code == SUSPEND) break; @@ -585,7 +585,7 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 data->longest = &(data->longest_float); } } - if (fl & SF_HAS_EVAL) + if (data && (fl & SF_HAS_EVAL)) data->flags |= SF_HAS_EVAL; optimize_curly_tail: #ifdef REGALIGN @@ -634,7 +634,7 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 } if (data && data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) pars++; - if (data_fake.flags & SF_HAS_EVAL) + if (data && (data_fake.flags & SF_HAS_EVAL)) data->flags |= SF_HAS_EVAL; } else if (OP(scan) == OPEN) { pars++;