|
Packit |
910689 |
#!/usr/bin/perl
|
|
Packit |
910689 |
#
|
|
Packit |
910689 |
# $Id: genchars.pl,v 2.22 2005/01/11 21:15:17 jonathan Exp $
|
|
Packit |
910689 |
#
|
|
Packit |
910689 |
##############################
|
|
Packit |
910689 |
$version="1.98";
|
|
Packit |
910689 |
##############################
|
|
Packit |
910689 |
use Config;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
BEGIN { push @INC, "."; }
|
|
Packit |
910689 |
use Configure;
|
|
Packit |
910689 |
use constant SILENT =>
|
|
Packit |
910689 |
(defined $ENV{MAKEFLAGS} and $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/ ? 1 : 0);
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#sub report {
|
|
Packit |
910689 |
# my($prog)=join(" ",@_);
|
|
Packit |
910689 |
#
|
|
Packit |
910689 |
# my($ccflags, $ldflags, $cc, $rm) = @Config{'ccflags', 'ldflags', 'cc', 'rm'};
|
|
Packit |
910689 |
# my($command, $ret);
|
|
Packit |
910689 |
#
|
|
Packit |
910689 |
# $command = $prog;
|
|
Packit |
910689 |
# open(F, ">temp$$.c") || die "Can't make temp file temp$$.c! $!\n";
|
|
Packit |
910689 |
# print F $command;
|
|
Packit |
910689 |
# close F;
|
|
Packit |
910689 |
#
|
|
Packit |
910689 |
# $command = "$cc $ccflags -o temp$$ temp$$.c $ldfcrs $libcrs $ldflags -lbsd";
|
|
Packit |
910689 |
# $command .= " >/dev/null 2>&1;;
|
|
Packit |
910689 |
# $ret = system $command;
|
|
Packit |
910689 |
# #if(!$ret) { system "temp$$" }
|
|
Packit |
910689 |
# unlink "temp$$", "temp$$.o", "temp$$.c";
|
|
Packit |
910689 |
#
|
|
Packit |
910689 |
# return $ret;
|
|
Packit |
910689 |
#}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
open(CCHARS,">cchars.h") || die "Fatal error, Unable to write to cchars.h!";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#print "Checking for termio...\n";
|
|
Packit |
910689 |
#$TERMIO = !report( "#include <termio.h>\n struct termios s; main(){}");
|
|
Packit |
910689 |
#print " Termio ",($TERMIO?"":"NOT "),"found.\n";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#print "Checking for termios...\n";
|
|
Packit |
910689 |
#$TERMIOS = !report( "#include <termios.h>\n struct termio s; main(){}");
|
|
Packit |
910689 |
#print " Termios ",($TERMIOS?"":"NOT "),"found.\n";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#print "Checking for sgtty...\n";
|
|
Packit |
910689 |
#$SGTTY = !report( "#include <sgtty.h>\n struct sgttyb s; main(){}");
|
|
Packit |
910689 |
#print " Sgtty ",($SGTTY?"":"NOT "),"found.\n";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#print "Termio=$TERMIO, Termios=$TERMIOS, Sgtty=$SGTTY\n";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
# Control characters used for termio and termios
|
|
Packit |
910689 |
%possible = ( VINTR => "INTERRUPT",
|
|
Packit |
910689 |
VQUIT => "QUIT",
|
|
Packit |
910689 |
VERASE => "ERASE",
|
|
Packit |
910689 |
VKILL => "KILL",
|
|
Packit |
910689 |
VEOF => "EOF",
|
|
Packit |
910689 |
VTIME => "TIME",
|
|
Packit |
910689 |
VMIN => "MIN",
|
|
Packit |
910689 |
VSWTC => "SWITCH",
|
|
Packit |
910689 |
VSWTCH => "SWITCH",
|
|
Packit |
910689 |
VSTART => "START",
|
|
Packit |
910689 |
VSTOP => "STOP",
|
|
Packit |
910689 |
VSUSP => "SUSPEND",
|
|
Packit |
910689 |
VDSUSP => "DSUSPEND",
|
|
Packit |
910689 |
VEOL => "EOL",
|
|
Packit |
910689 |
VREPRINT => "REPRINT",
|
|
Packit |
910689 |
VDISCARD => "DISCARD",
|
|
Packit |
910689 |
VFLUSH => "DISCARD",
|
|
Packit |
910689 |
VWERASE => "ERASEWORD",
|
|
Packit |
910689 |
VLNEXT => "QUOTENEXT",
|
|
Packit |
910689 |
VQUOTE => "QUOTENEXT",
|
|
Packit |
910689 |
VEOL2 => "EOL2",
|
|
Packit |
910689 |
VSTATUS => "STATUS",
|
|
Packit |
910689 |
);
|
|
Packit |
910689 |
|
|
Packit |
910689 |
# Control characters for sgtty
|
|
Packit |
910689 |
%possible2 = ( "intrc" => "INTERRUPT",
|
|
Packit |
910689 |
"quitc" => "QUIT",
|
|
Packit |
910689 |
"eofc" => "EOF",
|
|
Packit |
910689 |
"startc"=> "START",
|
|
Packit |
910689 |
"stopc" => "STOP",
|
|
Packit |
910689 |
"brkc" => "EOL",
|
|
Packit |
910689 |
"eolc" => "EOL",
|
|
Packit |
910689 |
"suspc" => "SUSPEND",
|
|
Packit |
910689 |
"dsuspc"=> "DSUSPEND",
|
|
Packit |
910689 |
"rprntc"=> "REPRINT",
|
|
Packit |
910689 |
"flushc"=> "DISCARD",
|
|
Packit |
910689 |
"lnextc"=> "QUOTENEXT",
|
|
Packit |
910689 |
"werasc"=> "ERASEWORD",
|
|
Packit |
910689 |
);
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print CCHARS "
|
|
Packit |
910689 |
/* -*- buffer-read-only: t -*-
|
|
Packit |
910689 |
|
|
Packit |
910689 |
This file is auto-generated. ***ANY*** changes here will be lost.
|
|
Packit |
910689 |
Written by genchars.pl version $version */
|
|
Packit |
910689 |
|
|
Packit |
910689 |
";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print CCHARS "#define HAVE_POLL_H\n" if CheckHeader("poll.h");
|
|
Packit |
910689 |
print CCHARS "#define HAVE_SYS_POLL_H\n" if CheckHeader("sys/poll.h");
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "\n" unless SILENT;
|
|
Packit |
910689 |
if(1) {
|
|
Packit |
910689 |
@values = sort { $possible{$a} cmp $possible{$b} or $a cmp $b } keys %possible;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "Writing termio/termios section of cchars.h... " unless SILENT;
|
|
Packit |
910689 |
print CCHARS "
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#ifdef CC_TERMIOS
|
|
Packit |
910689 |
# define TermStructure struct termios
|
|
Packit |
910689 |
# ifdef NCCS
|
|
Packit |
910689 |
# define LEGALMAXCC NCCS
|
|
Packit |
910689 |
# else
|
|
Packit |
910689 |
# ifdef NCC
|
|
Packit |
910689 |
# define LEGALMAXCC NCC
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
#else
|
|
Packit |
910689 |
# ifdef CC_TERMIO
|
|
Packit |
910689 |
# define TermStructure struct termio
|
|
Packit |
910689 |
# ifdef NCC
|
|
Packit |
910689 |
# define LEGALMAXCC NCC
|
|
Packit |
910689 |
# else
|
|
Packit |
910689 |
# ifdef NCCS
|
|
Packit |
910689 |
# define LEGALMAXCC NCCS
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#if !defined(LEGALMAXCC)
|
|
Packit |
910689 |
# define LEGALMAXCC 126
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#ifdef XS_INTERNAL
|
|
Packit |
910689 |
# define TRTXS(a) XS_INTERNAL(a)
|
|
Packit |
910689 |
#else
|
|
Packit |
910689 |
# define TRTXS(a) XS(a)
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#if defined(CC_TERMIO) || defined(CC_TERMIOS)
|
|
Packit |
910689 |
|
|
Packit |
910689 |
STATIC const char * const cc_names[] = { ".join('',map("
|
|
Packit |
910689 |
#if defined($_) && ($_ < LEGALMAXCC)
|
|
Packit |
910689 |
\"$possible{$_}\", "."
|
|
Packit |
910689 |
#else "."
|
|
Packit |
910689 |
\"\", "."
|
|
Packit |
910689 |
#endif ", @values ))."
|
|
Packit |
910689 |
};
|
|
Packit |
910689 |
|
|
Packit |
910689 |
STATIC const int MAXCC = 0 ",join('',map("
|
|
Packit |
910689 |
#if defined($_) && ($_ < LEGALMAXCC)
|
|
Packit |
910689 |
+1 /* $possible{$_} */
|
|
Packit |
910689 |
#endif ", @values ))."
|
|
Packit |
910689 |
;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
TRTXS(XS_Term__ReadKey_GetControlChars)
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
dXSARGS;
|
|
Packit |
910689 |
if (items < 0 || items > 1) {
|
|
Packit |
910689 |
croak(\"Usage: Term::ReadKey::GetControlChars()\");
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
SP -= items;
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
PerlIO * file;
|
|
Packit |
910689 |
TermStructure s;
|
|
Packit |
910689 |
if (items < 1)
|
|
Packit |
910689 |
file = STDIN;
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
file = IoIFP(sv_2io(ST(0)));
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#ifdef CC_TERMIOS
|
|
Packit |
910689 |
if(tcgetattr(PerlIO_fileno(file),&s))
|
|
Packit |
910689 |
#else
|
|
Packit |
910689 |
# ifdef CC_TERMIO
|
|
Packit |
910689 |
if(ioctl(PerlIO_fileno(file),TCGETA,&s))
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
croak(\"Unable to read terminal settings in GetControlChars\");
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
EXTEND(sp,MAXCC*2); ".join('',map("
|
|
Packit |
910689 |
#if defined($values[$_]) && ($values[$_] < LEGALMAXCC) "."
|
|
Packit |
910689 |
PUSHs(sv_2mortal(newSVpv(cc_names[$_],strlen(cc_names[$_])))); /* $possible{$values[$_]} */
|
|
Packit |
910689 |
PUSHs(sv_2mortal(newSVpv((char*)&s.c_cc[$values[$_]],1))); "."
|
|
Packit |
910689 |
#endif " ,0..$#values))."
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
PUTBACK;
|
|
Packit |
910689 |
return;
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
TRTXS(XS_Term__ReadKey_SetControlChars)
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
dXSARGS;
|
|
Packit |
910689 |
/*if ((items % 2) != 0) {
|
|
Packit |
910689 |
croak(\"Usage: Term::ReadKey::SetControlChars(%charpairs,file=STDIN)\");
|
|
Packit |
910689 |
}*/
|
|
Packit |
910689 |
SP -= items;
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
TermStructure s;
|
|
Packit |
910689 |
PerlIO * file;
|
|
Packit |
910689 |
if ((items % 2) == 1)
|
|
Packit |
910689 |
file = IoIFP(sv_2io(ST(items-1)));
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
file = STDIN;
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#ifdef CC_TERMIOS
|
|
Packit |
910689 |
if(tcgetattr(PerlIO_fileno(file),&s))
|
|
Packit |
910689 |
#else
|
|
Packit |
910689 |
# ifdef CC_TERMIO
|
|
Packit |
910689 |
if(ioctl(PerlIO_fileno(file),TCGETA,&s))
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
croak(\"Unable to read terminal settings in SetControlChars\");
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
int i;
|
|
Packit |
910689 |
char * name, value;
|
|
Packit |
910689 |
for(i=0;i+1
|
|
Packit |
910689 |
name = SvPV(ST(i),PL_na);
|
|
Packit |
910689 |
if( SvIOKp(ST(i+1)) || SvNOKp(ST(i+1)) )/* If Int or Float */
|
|
Packit |
910689 |
value = (char)SvIV(ST(i+1)); /* Store int value */
|
|
Packit |
910689 |
else /* Otherwise */
|
|
Packit |
910689 |
value = SvPV(ST(i+1),PL_na)[0]; /* Use first char of PV */
|
|
Packit |
910689 |
|
|
Packit |
910689 |
if (0) ; ".join('',map("
|
|
Packit |
910689 |
#if defined($values[$_]) && ($values[$_] < LEGALMAXCC) "."
|
|
Packit |
910689 |
else if(strcmp(name,cc_names[$_])==0) /* $possible{$values[$_]} */
|
|
Packit |
910689 |
s.c_cc[$values[$_]] = value; "."
|
|
Packit |
910689 |
#endif ",0..$#values))."
|
|
Packit |
910689 |
else
|
|
Packit |
910689 |
croak(\"Invalid control character passed to SetControlChars\");
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
#ifdef CC_TERMIOS
|
|
Packit |
910689 |
if(tcsetattr(PerlIO_fileno(file),TCSANOW,&s))
|
|
Packit |
910689 |
#else
|
|
Packit |
910689 |
# ifdef CC_TERMIO
|
|
Packit |
910689 |
if(ioctl(PerlIO_fileno(file),TCSETA,&s))
|
|
Packit |
910689 |
# endif
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
croak(\"Unable to write terminal settings in SetControlChars\");
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
XSRETURN(1);
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
|
|
Packit |
910689 |
";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "Done.\n" unless SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
undef %billy;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
if(@ARGV) { # If any argument is supplied on the command-line don't check sgtty
|
|
Packit |
910689 |
$SGTTY=0; #skip tests
|
|
Packit |
910689 |
} else {
|
|
Packit |
910689 |
print "Checking for sgtty...\n" unless SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
$SGTTY = CheckStructure("sgttyb","sgtty.h");
|
|
Packit |
910689 |
# $SGTTY = !Compile("
|
|
Packit |
910689 |
##include <sgtty.h>
|
|
Packit |
910689 |
#struct sgttyb s;
|
|
Packit |
910689 |
#main(){
|
|
Packit |
910689 |
#ioctl(0,TIOCGETP,&s);
|
|
Packit |
910689 |
#}");
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
# $SGTTY = !report("
|
|
Packit |
910689 |
##include <sgtty.h>
|
|
Packit |
910689 |
#struct sgttyb s;
|
|
Packit |
910689 |
#main(){
|
|
Packit |
910689 |
#ioctl(0,TIOCGETP,&s);
|
|
Packit |
910689 |
#}");
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print " Sgtty ",($SGTTY?"":"NOT "),"found.\n" unless SILENT;
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
$billy{"ERASE"} = "s1.sg_erase";
|
|
Packit |
910689 |
$billy{"KILL"} = "s1.sg_kill";
|
|
Packit |
910689 |
$tchars=$ltchars=0;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
if($SGTTY) {
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "Checking sgtty...\n" unless SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
$tchars = CheckStructure("tchars","sgtty.h");
|
|
Packit |
910689 |
# $tchars = !report( '
|
|
Packit |
910689 |
##include <sgtty.h>
|
|
Packit |
910689 |
#struct tchars t;
|
|
Packit |
910689 |
#main() { ioctl(0,TIOCGETC,&t); }
|
|
Packit |
910689 |
#');
|
|
Packit |
910689 |
print " tchars structure found.\n" if $tchars and !SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
$ltchars = CheckStructure("ltchars","sgtty.h");
|
|
Packit |
910689 |
# $ltchars = !report( '
|
|
Packit |
910689 |
##include <sgtty.h>
|
|
Packit |
910689 |
#struct ltchars t;
|
|
Packit |
910689 |
#main() { ioctl(0,TIOCGLTC,&t); }
|
|
Packit |
910689 |
#');
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print " ltchars structure found.\n" if $ltchars and !SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "Checking symbols\n" unless SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
for $c (sort keys %possible2) {
|
|
Packit |
910689 |
|
|
Packit |
910689 |
# if($tchars and !report("
|
|
Packit |
910689 |
##include <sgtty.h>
|
|
Packit |
910689 |
#struct tchars s2;
|
|
Packit |
910689 |
#main () { char c = s2.t_$c; }
|
|
Packit |
910689 |
#")) {
|
|
Packit |
910689 |
if($tchars and CheckField("tchars","t_$c","sgtty.h")) {
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print " t_$c ($possible2{$c}) found in tchars\n" unless SILENT;
|
|
Packit |
910689 |
$billy{$possible2{$c}} = "s2.t_$c";
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
# elsif($ltchars and !report("
|
|
Packit |
910689 |
##include <sgtty.h>
|
|
Packit |
910689 |
#struct ltchars s3;
|
|
Packit |
910689 |
#main () { char c = s3.t_$c; }
|
|
Packit |
910689 |
#")) {
|
|
Packit |
910689 |
elsif($ltchars and CheckField("ltchars","t_$c","sgtty.h")) {
|
|
Packit |
910689 |
print " t_$c ($possible2{$c}) found in ltchars\n" unless SILENT;
|
|
Packit |
910689 |
$billy{$possible2{$c}} = "s3.t_$c";
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#undef @names;
|
|
Packit |
910689 |
#undef @values;
|
|
Packit |
910689 |
#for $v (sort keys %billy) {
|
|
Packit |
910689 |
# push(@names,$billy{$v});
|
|
Packit |
910689 |
# push(@values,$v);
|
|
Packit |
910689 |
#}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#$numchars = keys %billy;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
@values = sort keys %billy;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
$struct = "
|
|
Packit |
910689 |
struct termstruct {
|
|
Packit |
910689 |
struct sgttyb s1;
|
|
Packit |
910689 |
";
|
|
Packit |
910689 |
$struct .= "
|
|
Packit |
910689 |
struct tchars s2;
|
|
Packit |
910689 |
" if $tchars;
|
|
Packit |
910689 |
$struct .= "
|
|
Packit |
910689 |
struct ltchars s3;
|
|
Packit |
910689 |
" if $ltchars;
|
|
Packit |
910689 |
$struct .= "
|
|
Packit |
910689 |
};";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "Writing sgtty section of cchars.h... " unless SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print CCHARS "
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#ifdef CC_SGTTY
|
|
Packit |
910689 |
$struct
|
|
Packit |
910689 |
#define TermStructure struct termstruct
|
|
Packit |
910689 |
|
|
Packit |
910689 |
STATIC const char * const cc_names[] = { ".join('',map("
|
|
Packit |
910689 |
\"$_\", ", @values ))."
|
|
Packit |
910689 |
};
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#define MAXCC ". ($#values+1)."
|
|
Packit |
910689 |
|
|
Packit |
910689 |
TRTXS(XS_Term__ReadKey_GetControlChars)
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
dXSARGS;
|
|
Packit |
910689 |
if (items < 0 || items > 1) {
|
|
Packit |
910689 |
croak(\"Usage: Term::ReadKey::GetControlChars()\");
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
SP -= items;
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
PerlIO * file;
|
|
Packit |
910689 |
TermStructure s;
|
|
Packit |
910689 |
if (items < 1)
|
|
Packit |
910689 |
file = STDIN;
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
file = IoIFP(sv_2io(ST(0)));
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
if(ioctl(fileno(PerlIO_file),TIOCGETP,&s.s1) ".($tchars?"
|
|
Packit |
910689 |
||ioctl(fileno(PerlIO_file),TIOCGETC,&s.s2) ":'').($ltchars?"
|
|
Packit |
910689 |
||ioctl(fileno(PerlIO_file),TIOCGLTC,&s.s3) ":'')."
|
|
Packit |
910689 |
)
|
|
Packit |
910689 |
croak(\"Unable to read terminal settings in GetControlChars\");
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
int i;
|
|
Packit |
910689 |
EXTEND(sp,MAXCC*2); ".join('',map("
|
|
Packit |
910689 |
PUSHs(sv_2mortal(newSVpv(cc_names[$_],strlen(cc_names[$_])))); /* $values[$_] */
|
|
Packit |
910689 |
PUSHs(sv_2mortal(newSVpv(&s.$billy{$values[$_]},1))); ",0..$#values))."
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
PUTBACK;
|
|
Packit |
910689 |
return;
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
TRTXS(XS_Term__ReadKey_SetControlChars)
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
dXSARGS;
|
|
Packit |
910689 |
/*if ((items % 2) != 0) {
|
|
Packit |
910689 |
croak(\"Usage: Term::ReadKey::SetControlChars(%charpairs,file=STDIN)\");
|
|
Packit |
910689 |
}*/
|
|
Packit |
910689 |
SP -= items;
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
PerlIO * file;
|
|
Packit |
910689 |
TermStructure s;
|
|
Packit |
910689 |
if ((items%2)==0)
|
|
Packit |
910689 |
file = STDIN;
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
file = IoIFP(sv_2io(ST(items-1)));
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
if(ioctl(PerlIO_fileno(file),TIOCGETP,&s.s1) ".($tchars?"
|
|
Packit |
910689 |
||ioctl(fileno(PerlIO_file),TIOCGETC,&s.s2) ":'').($ltchars?"
|
|
Packit |
910689 |
||ioctl(fileno(PerlIO_file),TIOCGLTC,&s.s3) ":'')."
|
|
Packit |
910689 |
)
|
|
Packit |
910689 |
croak(\"Unable to read terminal settings in SetControlChars\");
|
|
Packit |
910689 |
else {
|
|
Packit |
910689 |
int i;
|
|
Packit |
910689 |
char * name, value;
|
|
Packit |
910689 |
for(i=0;i+1
|
|
Packit |
910689 |
name = SvPV(ST(i),PL_na);
|
|
Packit |
910689 |
if( SvIOKp(ST(i+1)) || SvNOKp(ST(i+1)) )/* If Int or Float */
|
|
Packit |
910689 |
value = (char)SvIV(ST(i+1)); /* Store int value */
|
|
Packit |
910689 |
else /* Otherwise */
|
|
Packit |
910689 |
value = SvPV(ST(i+1),PL_na)[0]; /* Use first char of PV */
|
|
Packit |
910689 |
|
|
Packit |
910689 |
if (0) ; ".join('',map("
|
|
Packit |
910689 |
else if(strcmp(name,cc_names[$_])==0) /* $values[$_] */
|
|
Packit |
910689 |
s.$billy{$values[$_]} = value; ",0..$#values))."
|
|
Packit |
910689 |
else
|
|
Packit |
910689 |
croak(\"Invalid control character passed to SetControlChars\");
|
|
Packit |
910689 |
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
if(ioctl(fileno(PerlIO_file),TIOCSETN,&s.s1) ".($tchars?"
|
|
Packit |
910689 |
||ioctl(fileno(PerlIO_file),TIOCSETC,&s.s2) ":'').($ltchars?"
|
|
Packit |
910689 |
||ioctl(fileno(PerlIO_file),TIOCSLTC,&s.s3) ":'')."
|
|
Packit |
910689 |
) croak(\"Unable to write terminal settings in SetControlChars\");
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
XSRETURN(1);
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#if !defined(CC_TERMIO) && !defined(CC_TERMIOS) && !defined(CC_SGTTY)
|
|
Packit |
910689 |
#define TermStructure int
|
|
Packit |
910689 |
TRTXS(XS_Term__ReadKey_GetControlChars)
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
dXSARGS;
|
|
Packit |
910689 |
if (items <0 || items>1) {
|
|
Packit |
910689 |
croak(\"Usage: Term::ReadKey::GetControlChars([FileHandle])\");
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
SP -= items;
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
ST(0) = sv_newmortal();
|
|
Packit |
910689 |
PUTBACK;
|
|
Packit |
910689 |
return;
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
TRTXS(XS_Term__ReadKey_SetControlChars)
|
|
Packit |
910689 |
{
|
|
Packit |
910689 |
dXSARGS;
|
|
Packit |
910689 |
if (items < 0 || items > 1) {
|
|
Packit |
910689 |
croak(\"Invalid control character passed to SetControlChars\");
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
SP -= items;
|
|
Packit |
910689 |
XSRETURN(1);
|
|
Packit |
910689 |
}
|
|
Packit |
910689 |
|
|
Packit |
910689 |
#endif
|
|
Packit |
910689 |
|
|
Packit |
910689 |
/* ex: set ro: */
|
|
Packit |
910689 |
";
|
|
Packit |
910689 |
|
|
Packit |
910689 |
print "Done.\n" unless SILENT;
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|
|
Packit |
910689 |
|