Blame genchars.pl

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