mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-02 22:49:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			352 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			352 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
 | 
						|
CONST
 | 
						|
 | 
						|
{
 | 
						|
 * Special Control Characters
 | 
						|
 *
 | 
						|
 * Index into c_cc[] character array.
 | 
						|
 *
 | 
						|
 *	Name	     Subscript	Enabled by
 | 
						|
 }
 | 
						|
 VEOF		=0;	
 | 
						|
 VEOL		=1;	
 | 
						|
 VEOL2		=2;	
 | 
						|
 VERASE		=3;	
 | 
						|
 VWERASE 	=4;	
 | 
						|
 VKILL		=5;	
 | 
						|
 VREPRINT 	=6;	
 | 
						|
{		=7;	   spare 1 }
 | 
						|
 VINTR		=8;	
 | 
						|
 VQUIT		=9;	
 | 
						|
 VSUSP		=10;	
 | 
						|
 VDSUSP		=11;	
 | 
						|
 VSTART		=12;	
 | 
						|
 VSTOP		=13;	
 | 
						|
 VLNEXT		=14;	
 | 
						|
 VDISCARD	=15;	
 | 
						|
 VMIN		=16;	
 | 
						|
 VTIME		=17;	
 | 
						|
 VSTATUS	=18;	
 | 
						|
{		=19	   spare 2 }
 | 
						|
 NCCS		=20;
 | 
						|
 | 
						|
Type
 | 
						|
  winsize = packed record
 | 
						|
    ws_row,
 | 
						|
    ws_col,
 | 
						|
    ws_xpixel,
 | 
						|
    ws_ypixel : word;
 | 
						|
  end;
 | 
						|
  TWinSize=winsize;
 | 
						|
 | 
						|
 | 
						|
type
 | 
						|
  Termios = packed record
 | 
						|
    c_iflag,
 | 
						|
    c_oflag,
 | 
						|
    c_cflag,
 | 
						|
    c_lflag  : longint;
 | 
						|
    c_line   : char;
 | 
						|
    c_cc     : array[0..NCCS-1] of byte;
 | 
						|
   {$IFDEF BSD}
 | 
						|
    c_ispeed,
 | 
						|
    c_ospeed : longint; 
 | 
						|
   {$endif}
 | 
						|
  end;
 | 
						|
  TTermios=Termios;
 | 
						|
 | 
						|
CONST
 | 
						|
 | 
						|
 | 
						|
 POSIX_VDISABLE=Chr($ff);
 | 
						|
{
 | 
						|
 | 
						|
#define	CCEQ(val, c)	((c) == (val) ? (val) != _POSIX_VDISABLE : 0)
 | 
						|
}
 | 
						|
 | 
						|
{ * Input flags - software input processing}
 | 
						|
 | 
						|
       	IGNBRK		=       $1;	{ ignore BREAK condition }
 | 
						|
       	BRKINT		=       $2;	{ map BREAK to SIGINTR }
 | 
						|
       	IGNPAR		=       $4;	{ ignore (discard) parity errors }
 | 
						|
       	PARMRK		=       $8;	{ mark parity and framing errors }
 | 
						|
       	INPCK		=      $10;	{ enable checking of parity errors }
 | 
						|
       	ISTRIP		=      $20;	{ strip 8th bit off chars }
 | 
						|
       	INLCR		=      $40;	{ map NL into CR }
 | 
						|
       	IGNCR		=      $80;	{ ignore CR }
 | 
						|
       	ICRNL		=     $100;	{ map CR to NL (ala CRMOD) }
 | 
						|
       	IXON		=     $200;	{ enable output flow control }
 | 
						|
       	IXOFF		=     $400;	{ enable input flow control }
 | 
						|
       	IXANY		=     $800;	{ any char will restart after stop }
 | 
						|
        IMAXBEL		=    $2000;	{ ring bell on input queue full }
 | 
						|
 | 
						|
{
 | 
						|
 * Output flags - software output processing
 | 
						|
}
 | 
						|
       	OPOST		=       $1;	{ enable following output processing }
 | 
						|
        ONLCR		=       $2;	{ map NL to CR-NL (ala CRMOD) }
 | 
						|
        OXTABS		=       $4;	{ expand tabs to spaces }
 | 
						|
        ONOEOT		=       $8;	{ discard EOT's (^D) on output) }
 | 
						|
 | 
						|
{
 | 
						|
 * Control flags - hardware control of terminal
 | 
						|
}
 | 
						|
       	CIGNORE		=       $1;	{ ignore control flags }
 | 
						|
        CSIZE		=     $300;	{ character size mask }
 | 
						|
        CS5		=       $0;	    { 5 bits (pseudo) }
 | 
						|
        CS6		=     $100;	    { 6 bits }
 | 
						|
        CS7		=     $200;	    { 7 bits }
 | 
						|
        CS8		=     $300;	    { 8 bits }
 | 
						|
        CSTOPB		=     $400;	{ send 2 stop bits }
 | 
						|
        CREAD		=     $800;	{ enable receiver }
 | 
						|
        PARENB		=    $1000;	{ parity enable }
 | 
						|
        PARODD		=    $2000;	{ odd parity, else even }
 | 
						|
        HUPCL		=    $4000;	{ hang up on last close }
 | 
						|
        CLOCAL		=    $8000;	{ ignore modem status lines }
 | 
						|
        CCTS_OFLOW	=   $10000;	{ CTS flow control of output }
 | 
						|
        CRTS_IFLOW	=   $20000;	{ RTS flow control of input }
 | 
						|
        CRTSCTS		=   (CCTS_OFLOW or CRTS_IFLOW);
 | 
						|
       	CDTR_IFLOW	=   $40000;	{ DTR flow control of input }
 | 
						|
        CDSR_OFLOW	=   $80000;	{ DSR flow control of output }
 | 
						|
       	CCAR_OFLOW	=  $100000;	{ DCD flow control of output }
 | 
						|
       	MDMBUF		=  $100000;	{ old name for CCAR_OFLOW }
 | 
						|
 | 
						|
{
 | 
						|
 * "Local" flags - dumping ground for other state
 | 
						|
 *
 | 
						|
 * Warning: some flags in this structure begin with
 | 
						|
 * the letter "I" and look like they belong in the
 | 
						|
 * input flag.
 | 
						|
 }
 | 
						|
 | 
						|
       	ECHOKE		=       $1;	{ visual erase for line kill }
 | 
						|
       	ECHOE		=       $2;	{ visually erase chars }
 | 
						|
       	ECHOK		=       $4;	{ echo NL after line kill }
 | 
						|
        ECHO		=       $8;	{ enable echoing }
 | 
						|
       	ECHONL		=      $10;	{ echo NL even if ECHO is off }
 | 
						|
       	ECHOPRT		=      $20;	{ visual erase mode for hardcopy }
 | 
						|
        ECHOCTL  	=      $40;	{ echo control chars as ^(Char) }
 | 
						|
       	ISIG		=      $80;	{ enable signals INTR, QUIT, [D]SUSP }
 | 
						|
       	ICANON		=     $100;	{ canonicalize input lines }
 | 
						|
        ALTWERASE	=     $200;	{ use alternate WERASE algorithm }
 | 
						|
       	IEXTEN		=     $400;	{ enable DISCARD and LNEXT }
 | 
						|
        EXTPROC         =     $800;      { external processing }
 | 
						|
        TOSTOP		=  $400000;	{ stop background jobs from output }
 | 
						|
        FLUSHO		=  $800000;	{ output being flushed (state) }
 | 
						|
       	NOKERNINFO	= $2000000;	{ no kernel output from VSTATUS }
 | 
						|
        PENDIN		=$20000000;	{ XXX retype pending input (state) }
 | 
						|
       	NOFLSH		=$80000000;	{ don't flush after interrupt }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
{
 | 
						|
 * Commands passed to tcsetattr() for setting the termios structure.
 | 
						|
}
 | 
						|
 | 
						|
CONST
 | 
						|
 | 
						|
       	TCSANOW		=0;		{ make change immediate }
 | 
						|
       	TCSADRAIN	=1;		{ drain output, then change }
 | 
						|
       	TCSAFLUSH	=2;		{ drain output, flush input }
 | 
						|
        TCSASOFT	=$10;		{ flag - don't alter h.w. state }
 | 
						|
 | 
						|
{
 | 
						|
 * Standard speeds
 | 
						|
}
 | 
						|
        B0	=     0;
 | 
						|
        B50	=    50;
 | 
						|
        B75	=    75;
 | 
						|
        B110	=   110;
 | 
						|
        B134	=   134;
 | 
						|
        B150	=   150;
 | 
						|
        B200	=   200;
 | 
						|
        B300	=   300;
 | 
						|
        B600	=   600;
 | 
						|
        B1200	=  1200;
 | 
						|
       	B1800	=  1800;
 | 
						|
        B2400	=  2400;
 | 
						|
        B4800	=  4800;
 | 
						|
        B9600	=  9600;
 | 
						|
        B19200	= 19200;
 | 
						|
        B38400	= 38400;
 | 
						|
        B7200	=  7200;
 | 
						|
        B14400	= 14400;
 | 
						|
        B28800	= 28800;
 | 
						|
        B57600	= 57600;
 | 
						|
        B76800	= 76800;
 | 
						|
        B115200	=115200;
 | 
						|
        B230400	=230400;
 | 
						|
        EXTA	= 19200;
 | 
						|
        EXTB	= 38400;
 | 
						|
 | 
						|
       	TCIFLUSH	=1;
 | 
						|
       	TCOFLUSH	=2;
 | 
						|
        TCIOFLUSH	=3;
 | 
						|
       	TCOOFF		=1;
 | 
						|
       	TCOON		=2;
 | 
						|
        TCIOFF		=3;
 | 
						|
        TCION		=4;
 | 
						|
 | 
						|
{
 | 
						|
#include <sys/cdefs.h>
 | 
						|
 | 
						|
__BEGIN_DECLS
 | 
						|
speed_t	cfgetispeed __P((const struct termios *));
 | 
						|
speed_t	cfgetospeed __P((const struct termios *));
 | 
						|
int	cfsetispeed __P((struct termios *, speed_t));
 | 
						|
int	cfsetospeed __P((struct termios *, speed_t));
 | 
						|
int	tcgetattr __P((int, struct termios *));
 | 
						|
int	tcsetattr __P((int, int, const struct termios *));
 | 
						|
int	tcdrain __P((int));
 | 
						|
int	tcflow __P((int, int));
 | 
						|
int	tcflush __P((int, int));
 | 
						|
int	tcsendbreak __P((int, int));
 | 
						|
 | 
						|
#ifndef _POSIX_SOURCE
 | 
						|
void	cfmakeraw __P((struct termios *));
 | 
						|
int	cfsetspeed __P((struct termios *, speed_t));
 | 
						|
#endif { !_POSIX_SOURCE }
 | 
						|
__END_DECLS
 | 
						|
 | 
						|
#endif { !_KERNEL }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
struct winsize {
 | 
						|
	unsigned short	ws_row;		{ rows, in characters }
 | 
						|
	unsigned short	ws_col;		{ columns, in characters }
 | 
						|
	unsigned short	ws_xpixel;	{ horizontal size, pixels }
 | 
						|
	unsigned short	ws_ypixel;	{ vertical size, pixels }
 | 
						|
};
 | 
						|
 | 
						|
}
 | 
						|
       IOCTLREAD        = $40000000;
 | 
						|
       IOCTLWRITE       = $80000000;
 | 
						|
       IOCTLVOID	= $20000000;
 | 
						|
 | 
						|
      	TIOCMODG	= IOCTLREAD+$47400+ 3;	{ get modem control state }
 | 
						|
      	TIOCMODS	= IOCTLWRITE+$47400+ 4;	{ set modem control state }
 | 
						|
      		TIOCM_LE	=$0001;		{ line enable }
 | 
						|
      		TIOCM_DTR	=$0002;		{ data terminal ready }
 | 
						|
      		TIOCM_RTS	=$0004;		{ request to send }
 | 
						|
      		TIOCM_ST	=$0010;		{ secondary transmit }
 | 
						|
      		TIOCM_SR	=$0020;		{ secondary receive }
 | 
						|
      		TIOCM_CTS	=$0040;		{ clear to send }
 | 
						|
      		TIOCM_CAR	=$0100;		{ carrier detect }
 | 
						|
      		TIOCM_CD	=TIOCM_CAR;
 | 
						|
      		TIOCM_RNG	=$0200; 	{ ring }
 | 
						|
      		TIOCM_RI	=TIOCM_RNG;
 | 
						|
      		TIOCM_DSR	=$0400;		{ data set ready }
 | 
						|
						{ 8-10 compat }
 | 
						|
      	TIOCEXCL	 =IOCTLVOID+$7400+ 13;		{ set exclusive use of tty }
 | 
						|
      	TIOCNXCL	 =IOCTLVOID+$7400+ 14;		{ reset exclusive use of tty }
 | 
						|
						{ 15 unused }
 | 
						|
      	TIOCFLUSH 	 =IOCTLWRITE+$47400+ 16;	{ flush buffers }
 | 
						|
						{ 17-18 compat }
 | 
						|
      	TIOCGETA	 =IOCTLREAD+$2C7400+ 19; { get termios struct }
 | 
						|
      	TIOCSETA	 =IOCTLWRITE+$2C7400+ 20; { set termios struct }
 | 
						|
      	TIOCSETAW	 =IOCTLWRITE+$2C7400+ 21; { drain output, set }
 | 
						|
      	TIOCSETAF	 =IOCTLWRITE+$2C7400+ 22; { drn out, fls in, set }
 | 
						|
      	TIOCGETD	 =IOCTLREAD+$47400+ 26;	{ get line discipline }
 | 
						|
      	TIOCSETD	 =IOCTLWRITE+$47400+ 27;	{ set line discipline }
 | 
						|
						{ 127-124 compat }
 | 
						|
      	TIOCSBRK	 =IOCTLVOID+$7400+ 123;		{ set break bit }
 | 
						|
      	TIOCCBRK	 =IOCTLVOID+$7400+ 122;		{ clear break bit }
 | 
						|
      	TIOCSDTR	 =IOCTLVOID+$7400+ 121;		{ set data terminal ready }
 | 
						|
      	TIOCCDTR	 =IOCTLVOID+$7400+ 120;		{ clear data terminal ready }
 | 
						|
      	TIOCGPGRP	 =IOCTLREAD+$47400+ 119;	{ get pgrp of tty }
 | 
						|
      	TIOCSPGRP	 =IOCTLWRITE+$47400+ 118;	{ set pgrp of tty }
 | 
						|
						{ 117-116 compat }
 | 
						|
      	TIOCOUTQ	 =IOCTLREAD+$47400+ 115;	{ output queue size }
 | 
						|
      	TIOCSTI		 =IOCTLWRITE+$17400+ 114;	{ simulate terminal input }
 | 
						|
      	TIOCNOTTY	 =IOCTLVOID+$7400+ 113;		{ void tty association }
 | 
						|
      	TIOCPKT		 =IOCTLWRITE+$47400+ 112;	{ pty: set/clear packet mode }
 | 
						|
      		TIOCPKT_DATA		=$00;	{ data packet }
 | 
						|
      		TIOCPKT_FLUSHREAD	=$01;	{ flush packet }
 | 
						|
      		TIOCPKT_FLUSHWRITE	=$02;	{ flush packet }
 | 
						|
      		TIOCPKT_STOP		=$04;	{ stop output }
 | 
						|
      		TIOCPKT_START		=$08;	{ start output }
 | 
						|
      		TIOCPKT_NOSTOP		=$10;	{ no more ^S, ^Q }
 | 
						|
      		TIOCPKT_DOSTOP		=$20;	{ now do ^S ^Q }
 | 
						|
      		TIOCPKT_IOCTL		=$40;	{ state change of pty driver }
 | 
						|
      	TIOCSTOP	 =IOCTLVOID+$7400+ 111;		{ stop output, like ^S }
 | 
						|
      	TIOCSTART	 =IOCTLVOID+$7400+ 110;		{ start output, like ^Q }
 | 
						|
      	TIOCMSET	 =IOCTLWRITE+$47400+ 109;	{ set all modem bits }
 | 
						|
      	TIOCMBIS	 =IOCTLWRITE+$47400+ 108;	{ bis modem bits }
 | 
						|
      	TIOCMBIC	 =IOCTLWRITE+$47400+ 107;	{ bic modem bits }
 | 
						|
      	TIOCMGET	 =IOCTLREAD+$47400+ 106;	{ get all modem bits }
 | 
						|
      	TIOCREMOTE	 =IOCTLWRITE+$47400+ 105;	{ remote input editing }
 | 
						|
      	TIOCGWINSZ	 =IOCTLREAD+$87400+ 104;	{ get window size }
 | 
						|
      	TIOCSWINSZ	 =IOCTLWRITE+$87400+ 103;	{ set window size }
 | 
						|
      	TIOCUCNTL	 =IOCTLWRITE+$47400+ 102;	{ pty: set/clr usr cntl mode }
 | 
						|
      	TIOCSTAT	 =IOCTLVOID+$7400+ 101;		{ simulate ^T status message }
 | 
						|
  //    		   UIOCCMD(n)	_IO('u', n)	{ usr cntl op "n" }
 | 
						|
      	TIOCCONS	 =IOCTLWRITE+$47400+ 98;	{ become virtual console }
 | 
						|
      	TIOCSCTTY	 =IOCTLVOID+$7400+ 97;		{ become controlling tty }
 | 
						|
      	TIOCEXT		 =IOCTLWRITE+$47400+ 96;	{ pty: external processing }
 | 
						|
      	TIOCSIG		 =IOCTLVOID+$7400+ 95;		{ pty: generate signal }
 | 
						|
      	TIOCDRAIN	 =IOCTLVOID+$7400+ 94;		{ wait till output drained }
 | 
						|
      	TIOCMSDTRWAIT	 =IOCTLWRITE+$47400+ 91;	{ modem: set wait on close }
 | 
						|
      	TIOCMGDTRWAIT	 =IOCTLREAD+$47400+ 90;	{ modem: get wait on close }
 | 
						|
      	TIOCTIMESTAMP	 =IOCTLREAD+$87400+ 89; 	{ enable/get timestamp
 | 
						|
						 * of last input event }
 | 
						|
      	TIOCDCDTIMESTAMP =IOCTLREAD+$87400+ 88;	{ enable/get timestamp
 | 
						|
						 * of last DCd rise }
 | 
						|
      	TIOCSDRAINWAIT	 =IOCTLWRITE+$47400+ 87;	{ set ttywait timeout }
 | 
						|
       	TIOCGDRAINWAIT	 =IOCTLREAD+$47400+ 86;	{ get ttywait timeout }
 | 
						|
 | 
						|
      	TTYDISC		 =0;		{ termios tty line discipline }
 | 
						|
      	SLIPDISC	 =4; 		{ serial IP discipline }
 | 
						|
      	PPPDISC		 =5;		{ PPP discipline }
 | 
						|
      	NETGRAPHDISC	 =6;		{ Netgraph tty node discipline }
 | 
						|
 | 
						|
 | 
						|
{
 | 
						|
 * Defaults on "first" open.
 | 
						|
 }
 | 
						|
      	TTYDEF_IFLAG	 =(BRKINT	or ICRNL	or IMAXBEL or IXON or IXANY);
 | 
						|
       TTYDEF_OFLAG	 =(OPOST or ONLCR);
 | 
						|
       TTYDEF_LFLAG	 =(ECHO or ICANON or ISIG or IEXTEN or ECHOE or ECHOKE or ECHOCTL);
 | 
						|
      	TTYDEF_CFLAG	 =(CREAD or CS8 or HUPCL);
 | 
						|
       TTYDEF_SPEED	 =(B9600);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
{
 | 
						|
 * Control Character Defaults
 | 
						|
 }
 | 
						|
        CtrlMask	= $1f;	{\037}
 | 
						|
      	CEOF		=chr( ORD('d') and CtrlMask);
 | 
						|
      	CEOL		=chr( $ff and CtrlMask);{ XXX avoid _POSIX_VDISABLE }
 | 
						|
      	CERASE		=chr( $7F and CtrlMask);
 | 
						|
      	CINTR		=chr(ORD('c') and CtrlMask);
 | 
						|
      	CSTATUS		=chr(ORD('t') and CtrlMask);
 | 
						|
      	CKILL		=chr(ORD('u') and CtrlMask);
 | 
						|
      	CMIN		=chr(1);
 | 
						|
      	CQUIT		=chr(034  and CtrlMask);	{ FS, ^\ }
 | 
						|
      	CSUSP		=chr(ORD('z') and CtrlMask);
 | 
						|
      	CTIME		=chr(0);
 | 
						|
      	CDSUSP		=chr(ORD('y') and CtrlMask);
 | 
						|
      	CSTART		=chr(ORD('q') and CtrlMask);
 | 
						|
      	CSTOP		=chr(ORD('s') and CtrlMask);
 | 
						|
      	CLNEXT		=chr(ORD('v') and CtrlMask);
 | 
						|
      	CDISCARD 	=chr(ORD('o') and CtrlMask);
 | 
						|
      	CWERASE 	=chr(ORD('w') and CtrlMask);
 | 
						|
      	CREPRINT 	=chr(ORD('r') and CtrlMask);
 | 
						|
      	CEOT		=CEOF;
 | 
						|
{ compat }
 | 
						|
      	CBRK		=CEOL;
 | 
						|
        CRPRNT		=CREPRINT;
 | 
						|
      	CFLUSH		=CDISCARD;
 | 
						|
 | 
						|
 | 
						|
{
 | 
						|
 *        TTYDEFCHARS to include an array of default control characters.
 | 
						|
}
 | 
						|
    ttydefchars : array[0..NCCS-1] OF char =(
 | 
						|
	CEOF,	CEOL,	CEOL,	CERASE, CWERASE, CKILL, CREPRINT,
 | 
						|
	POSIX_VDISABLE, CINTR,	CQUIT,	CSUSP,	CDSUSP,	CSTART,	CSTOP,	CLNEXT,
 | 
						|
	CDISCARD, CMIN,	CTIME,  CSTATUS, POSIX_VDISABLE);
 | 
						|
 | 
						|
 |