X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Ftermcap.pl;h=f295a2d476b53b9b360abe329f4c5448d04a2434;hb=004caa160f94253de79aa75f9b412f94823dcb96;hp=ab693f28d7ac4b7d437d79be4f0ccf4054dd93f7;hpb=a687059cbaf2c6fdccb5e0fae2aee80ec15625a8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/termcap.pl b/lib/termcap.pl index ab693f2..f295a2d 100644 --- a/lib/termcap.pl +++ b/lib/termcap.pl @@ -1,27 +1,37 @@ -;# $Header: termcap.pl,v 3.0 89/10/18 15:19:58 lwall Locked $ +;# $RCSfile: termcap.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:16 $ +# +# This library is no longer being maintained, and is included for backward +# compatibility with Perl 4 programs which may require it. +# +# In particular, this should not be used as an example of modern Perl +# programming techniques. +# +# Suggested alternative: Term::Cap +# ;# ;# Usage: -;# do 'ioctl.pl'; +;# require 'ioctl.pl'; ;# ioctl(TTY,$TIOCGETP,$foo); ;# ($ispeed,$ospeed) = unpack('cc',$foo); -;# do 'termcap.pl'; -;# do Tgetent('vt100'); # sets $TC{'cm'}, etc. -;# do Tgoto($TC{'cm'},$row,$col); -;# do Tputs($TC{'dl'},$affcnt,'FILEHANDLE'); +;# require 'termcap.pl'; +;# &Tgetent('vt100'); # sets $TC{'cm'}, etc. +;# &Tputs(&Tgoto($TC{'cm'},$col,$row), 0, 'FILEHANDLE'); +;# &Tputs($TC{'dl'},$affcnt,'FILEHANDLE'); ;# sub Tgetent { local($TERM) = @_; local($TERMCAP,$_,$entry,$loop,$field); - warn "Tgetent: no ospeed set" unless $ospeed; - foreach $key (keys(TC)) { + # warn "Tgetent: no ospeed set" unless $ospeed; + foreach $key (keys %TC) { delete $TC{$key}; } $TERM = $ENV{'TERM'} unless $TERM; + $TERM =~ s/(\W)/\\$1/g; $TERMCAP = $ENV{'TERMCAP'}; $TERMCAP = '/etc/termcap' unless $TERMCAP; if ($TERMCAP !~ m:^/:) { - if (index($TERMCAP,"|$TERM|") < $[) { + if ($TERMCAP !~ /(^|\|)$TERM[:\|]/) { $TERMCAP = '/etc/termcap'; } } @@ -33,7 +43,7 @@ sub Tgetent { while () { next if /^#/; next if /^\t/; - if (/\\|$TERM[:\\|]/) { + if (/(^|\\|)${TERM}[:\\|]/) { chop; while (chop eq '\\\\') { \$_ .= ; @@ -47,7 +57,7 @@ sub Tgetent { \$entry .= \$_; "; eval $loop; - } while s/:tc=([^:]+):/:/, $TERM = $1; + } while s/:tc=([^:]+):/:/ && ($TERM = $1); $TERMCAP = $entry; } @@ -62,6 +72,9 @@ sub Tgetent { $entry = $1; $_ = $2; s/\\E/\033/g; + s/\\(200)/pack('c',0)/eg; # NUL character + s/\\(0\d\d)/pack('c',oct($1))/eg; # octal + s/\\(0x[0-9A-Fa-f][0-9A-Fa-f])/pack('c',hex($1))/eg; # hex s/\\(\d\d\d)/pack('c',$1 & 0177)/eg; s/\\n/\n/g; s/\\r/\r/g; @@ -70,7 +83,7 @@ sub Tgetent { s/\\f/\f/g; s/\\\^/\377/g; s/\^\?/\177/g; - s/\^(.)/pack('c',$1 & 031)/eg; + s/\^(.)/pack('c',ord($1) & 31)/eg; s/\\(.)/$1/g; s/\377/^/g; $TC{$entry} = $_ if $TC{$entry} eq ''; @@ -104,17 +117,18 @@ sub Tgoto { local($result) = ''; local($after) = ''; local($code,$tmp) = @_; - @_ = ($tmp,$code); + local(@tmp); + @tmp = ($tmp,$code); local($online) = 0; while ($string =~ /^([^%]*)%(.)(.*)/) { $result .= $1; $code = $2; $string = $3; if ($code eq 'd') { - $result .= sprintf("%d",shift(@_)); + $result .= sprintf("%d",shift(@tmp)); } elsif ($code eq '.') { - $tmp = shift(@_); + $tmp = shift(@tmp); if ($tmp == 0 || $tmp == 4 || $tmp == 10) { if ($online) { ++$tmp, $after .= $TC{'up'} if $TC{'up'}; @@ -127,32 +141,32 @@ sub Tgoto { $online = !$online; } elsif ($code eq '+') { - $result .= sprintf("%c",shift(@_)+ord($string)); + $result .= sprintf("%c",shift(@tmp)+ord($string)); $string = substr($string,1,99); $online = !$online; } elsif ($code eq 'r') { - ($code,$tmp) = @_; - @_ = ($tmp,$code); + ($code,$tmp) = @tmp; + @tmp = ($tmp,$code); $online = !$online; } elsif ($code eq '>') { ($code,$tmp,$string) = unpack("CCa99",$string); - if ($_[$[] > $code) { - $_[$[] += $tmp; + if ($tmp[$[] > $code) { + $tmp[$[] += $tmp; } } elsif ($code eq '2') { - $result .= sprintf("%02d",shift(@_)); + $result .= sprintf("%02d",shift(@tmp)); $online = !$online; } elsif ($code eq '3') { - $result .= sprintf("%03d",shift(@_)); + $result .= sprintf("%03d",shift(@tmp)); $online = !$online; } elsif ($code eq 'i') { - ($code,$tmp) = @_; - @_ = ($code+1,$tmp+1); + ($code,$tmp) = @tmp; + @tmp = ($code+1,$tmp+1); } else { return "OOPS";