summaryrefslogtreecommitdiff
path: root/lib/complete.pl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/complete.pl')
-rw-r--r--lib/complete.pl138
1 files changed, 76 insertions, 62 deletions
diff --git a/lib/complete.pl b/lib/complete.pl
index 73d3649f8d..dabf8f66ad 100644
--- a/lib/complete.pl
+++ b/lib/complete.pl
@@ -1,5 +1,5 @@
;#
-;# @(#)complete.pl 1.0 (sun!waynet) 11/11/88
+;# @(#)complete.pl,v1.1 (me@anywhere.EBay.Sun.COM) 09/23/91
;#
;# Author: Wayne Thompson
;#
@@ -7,7 +7,7 @@
;# This routine provides word completion.
;# (TAB) attempts word completion.
;# (^D) prints completion list.
-;# (These may be changed by setting $Complete'complete, etc.)
+;# (These may be changed by setting $Complete'complete, etc.)
;#
;# Diagnostics:
;# Bell when word completion fails.
@@ -18,78 +18,92 @@
;# Bugs:
;#
;# Usage:
-;# $input = do Complete('prompt_string', @completion_list);
+;# $input = &Complete('prompt_string', *completion_list);
+;# or
+;# $input = &Complete('prompt_string', @completion_list);
;#
CONFIG: {
package Complete;
- $complete = "\004";
- $kill = "\025";
- $erase1 = "\177";
- $erase2 = "\010";
+ $complete = "\004";
+ $kill = "\025";
+ $erase1 = "\177";
+ $erase2 = "\010";
}
sub Complete {
package Complete;
- local ($prompt) = shift (@_);
- local ($c, $cmp, $l, $r, $ret, $return, $test);
- @_cmp_lst = sort @_;
local($[) = 0;
- system 'stty raw -echo';
- loop: {
- print $prompt, $return;
- while (($c = getc(stdin)) ne "\r") {
- if ($c eq "\t") { # (TAB) attempt completion
- @_match = ();
- foreach $cmp (@_cmp_lst) {
- push (@_match, $cmp) if $cmp =~ /^$return/;
- }
- $test = $_match[0];
- $l = length ($test);
- unless ($#_match == 0) {
- shift (@_match);
- foreach $cmp (@_match) {
- until (substr ($cmp, 0, $l) eq substr ($test, 0, $l)) {
- $l--;
- }
- }
- print "\007";
- }
- print $test = substr ($test, $r, $l - $r);
- $r = length ($return .= $test);
- }
- elsif ($c eq $complete) { # (^D) completion list
- print "\r\n";
- foreach $cmp (@_cmp_lst) {
- print "$cmp\r\n" if $cmp =~ /^$return/;
- }
- redo loop;
- }
- elsif ($c eq $kill && $r) { # (^U) kill
- $return = '';
- $r = 0;
- print "\r\n";
- redo loop;
- }
- # (DEL) || (BS) erase
- elsif ($c eq $erase1 || $c eq $erase2) {
- if($r) {
- print "\b \b";
- chop ($return);
- $r--;
- }
- }
- elsif ($c =~ /\S/) { # printable char
- $return .= $c;
- $r++;
- print $c;
- }
- }
+ if ($_[1] =~ /^StB\0/) {
+ ($prompt, *_) = @_;
}
- system 'stty -raw echo';
- print "\n";
+ else {
+ $prompt = shift(@_);
+ }
+ @cmp_lst = sort(@_);
+
+ system('stty raw -echo');
+ LOOP: {
+ print($prompt, $return);
+ while (($_ = getc(STDIN)) ne "\r") {
+ CASE: {
+ # (TAB) attempt completion
+ $_ eq "\t" && do {
+ @match = grep(/^$return/, @cmp_lst);
+ $l = length($test = shift(@match));
+ unless ($#match < 0) {
+ foreach $cmp (@match) {
+ until (substr($cmp, 0, $l) eq substr($test, 0, $l)) {
+ $l--;
+ }
+ }
+ print("\a");
+ }
+ print($test = substr($test, $r, $l - $r));
+ $r = length($return .= $test);
+ last CASE;
+ };
+
+ # (^D) completion list
+ $_ eq $complete && do {
+ print(join("\r\n", '', grep(/^$return/, @cmp_lst)), "\r\n");
+ redo LOOP;
+ };
+
+ # (^U) kill
+ $_ eq $kill && do {
+ if ($r) {
+ undef($r, $return);
+ print("\r\n");
+ redo LOOP;
+ }
+ last CASE;
+ };
+
+ # (DEL) || (BS) erase
+ ($_ eq $erase1 || $_ eq $erase2) && do {
+ if($r) {
+ print("\b \b");
+ chop($return);
+ $r--;
+ }
+ last CASE;
+ };
+
+ # printable char
+ ord >= 32 && do {
+ $return .= $_;
+ $r++;
+ print;
+ last CASE;
+ };
+ }
+ }
+ }
+ system('stty -raw echo');
+ print("\n");
$return;
}