I think that this is a good idea, but there may be arguments against it.
The stub Term::ReadLine has been in perl since pre 5.004, so it's quite safe
to use it. However, to actually get line editing one needs to have installed
either Term::ReadLine::Perl or Term::ReadLine::Gnu. Attached patch makes
Configure.pl use Term::ReadLine to give interactive editing if there's a real
Term::ReadLine present, else Configure.pl continues to use the old way.

I think that this is easier to use than cut and paste or the rem:{} add:{}
syntax that &prompt appears to offer.

Tested with Term::ReadLine::Gnu and Term::ReadLine::Perl
(and I don't know why Term::ReadLine::Perl later decided that it could do
multi-line editing when it initially was doing sideways scrolling)

Nicholas Clark
-- 
ENOCHOCOLATE http://www.ccl4.org/~nick/CV.html

--- Configure.pl.orig   Sun Jan 20 22:57:28 2002
+++ Configure.pl        Mon Jan 21 17:25:28 2002
@@ -13,10 +13,9 @@
 use Getopt::Long;
 use ExtUtils::Manifest qw(manicheck);
 use File::Copy;
-
+use Term::ReadLine; # The stub is present from earlier than 5.004
 use Parrot::BuildUtil;
 
-
 #
 # Read the array and scalar forms of the version.
 # from the VERSION file.
@@ -287,15 +286,17 @@
 # Ask questions
 #
 
-prompt("What C compiler do you want to use?", 'cc');
-prompt("How about your linker?", 'ld');
-prompt("What flags would you like passed to your C compiler?", 'ccflags');
-prompt("What flags would you like passed to your linker?", 'ldflags');
-prompt("Which libraries would you like your C compiler to include?", 'libs');
-prompt("How big would you like integers to be?", 'iv');
-prompt("And your floats?", 'nv');
-prompt("What is your native opcode type?", 'opcode_t');
+my $term = initialise_term();
 
+prompt($term, "What C compiler do you want to use?", 'cc');
+prompt($term, "How about your linker?", 'ld');
+prompt($term, "What flags would you like passed to your C compiler?",
+       'ccflags');
+prompt($term, "Which libraries would you like your C compiler to include?",
+       'libs');
+prompt($term, "How big would you like integers to be?", 'iv');
+prompt($term, "And your floats?", 'nv');
+prompt($term, "What is your native opcode type?", 'opcode_t');
 
 {
        my(@ops)=glob("*.ops");
@@ -326,7 +327,7 @@
 Which opcode files would you like?
 END
 
-       prompt($msg, 'ops');
+       prompt($term, $msg, 'ops');
 }
 
 
@@ -428,7 +429,7 @@
         next unless $opt; # Ignore blank lines
         $c{cc_warn} .= " $opt";
     }
-    prompt("What gcc warning flags do you want to use?", 'cc_warn');
+    prompt($term, "What gcc warning flags do you want to use?", 'cc_warn');
 }
 
 #
@@ -708,21 +709,29 @@
 sub prompt {
     return if $opt_defaults;
 
-    my($message, $field)=(@_);
+    my($term, $message, $field)=(@_);
     my($input);
-    print "$message [$c{$field}] ";
-    chomp($input=<STDIN>);
+    if ($term) {
+        # Term::ReadLine::Gnu does a multiline edit just like bash.
+        # Term::ReadLine::Perl does a sideways scrolling single line like ksh.
+        print "$message [$c{$field}]\n";
+        $input = $term->readline("", $c{$field});
+        $term->addhistory($input) if /\S/ and !$term->Features->{autohistory};
+    } else {
+        print "$message [$c{$field}] ";
+        chomp($input=<STDIN>);
 
-    if($input =~ s/^\+//) {
-        $input="$c{$field} $input";
-    }
-    else {
-        if($input =~ s/:rem\{(.*?)\}//) {
-            $c{$field} =~ s/$_//g for split / /, $1;
+        if($input =~ s/^\+//) {
+            $input="$c{$field} $input";
         }
+        else {
+            if($input =~ s/:rem\{(.*?)\}//) {
+                $c{$field} =~ s/$_//g for split / /, $1;
+            }
 
-        if($input =~ s/:add\{(.*?)\}//) {
-            $input="$c{$field} $1 $input";
+            if($input =~ s/:add\{(.*?)\}//) {
+                $input="$c{$field} $1 $input";
+            }
         }
     }
 
@@ -816,8 +825,32 @@
 
         exit 1;
     }
-    else {
-                print <<"END";
+}
+
+#
+# initialise_term()
+#
+
+sub initialise_term {
+    my $term = Term::ReadLine->new ('Parrot configuration');
+    undef $term if $term && $term->ReadLine eq "Term::ReadLine::Stub";
+
+    if ($term) {
+        my $type = $term->ReadLine;
+        print <<"END";
+Okay, we found everything.  Next you'll need to answer
+a few questions about your system.  You have
+${             type} installed, so I'll use that to let
+you edit your answers interactively. I'll put the
+default in square brackets, and also prime the input
+line with the default. Just hit enter straight away to
+accept the default, or edit it to suit. Like Perl 5's
+Configure you can also chose the default by entering a
+zero length line.
+
+END
+    } else {
+        print <<"END";
 Okay, we found everything.  Next you'll need to answer
 a few questions about your system.  Defaults are in square
 brackets, and you can hit enter to accept them.  If you
@@ -827,8 +860,8 @@
 
 END
     }
+    return $term;
 }
-
 
 #
 # compiletestc()

Reply via email to