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 __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);