Browse Source

CommV24 implementation added

Alexander Shiryaev 12 years ago
parent
commit
244b71d6b4

BIN
BlackBox/_LinuxOpenBSD_/Comm/Mod/V24.odc


+ 40 - 0
BlackBox/_Linux_/Lin/Mod/Ioctl.txt

@@ -0,0 +1,40 @@
+MODULE LinIoctl ["libc.so.6"];
+
+	(*
+		A. V. Shiryaev, 2012.11
+
+		Linux
+		i386
+	*)
+
+	CONST
+		(* /usr/include/i386-linux-gnu/bits/ioctl-types.h *)
+			TIOCM_LE* = 001H;
+			TIOCM_DTR* = 002H;
+			TIOCM_RTS* = 004H;
+			TIOCM_ST* = 008H;
+			TIOCM_SR* = 010H;
+			TIOCM_CTS* = 020H;
+			TIOCM_CAR* = 040H;
+			TIOCM_RNG* = 080H;
+			TIOCM_DSR* = 100H;
+
+		FIOCLEX* = 21585;
+		FIONCLEX* = 21584;
+		FIONREAD* = 21531;
+		FIONBIO* = 21537;
+		FIOASYNC* = 21586;
+		TIOCMGET* = 21525;
+		TIOCMSET* = 21528;
+		TIOCEXCL* = 21516;
+		TIOCNXCL* = 21517;
+		TIOCOUTQ* = 21521;
+		TIOCSBRK* = 21543;
+		TIOCCBRK* = 21544;
+		TIOCMBIS* = 21526;
+		TIOCMBIC* = 21527;
+
+	PROCEDURE [ccall] ioctl0* ["ioctl"] (d: INTEGER; req: INTEGER): INTEGER;
+	PROCEDURE [ccall] ioctl1* ["ioctl"] (d: INTEGER; req: INTEGER; VAR arg: INTEGER): INTEGER;
+
+END LinIoctl.

BIN
BlackBox/_Linux_/Lin/Mod/Libc.odc


+ 4 - 2
BlackBox/_Linux_/Lin/Mod/Libc.txt

@@ -236,6 +236,7 @@ MODULE LinLibc ["libc.so.6"];
 		O_RDONLY* = {} ;	(* Open read-only *)
 		O_WRONLY* = {0} ;	(* Open write-only *)
 		O_RDWR* = {1} ;	(* Open read/write *)
+		O_NONBLOCK* = {11};
 
 		SIG_BLOCK* = 0;	(* Block signals *)
 		SIG_UNBLOCK* = 1;	(* Unblock signals *)
@@ -263,6 +264,7 @@ MODULE LinLibc ["libc.so.6"];
 		SelectorFunc* = PROCEDURE (dirent: Dirent): INTEGER;
 		CmpFunc* = PROCEDURE (VAR [nil] dirent1, dirent2: PtrDirent): INTEGER;
 		size_t* = INTEGER; (* should be unsigned int *)
+		ssize_t* = INTEGER;
 		sigjmp_buf* = RECORD [untagged] 
 			buf*: jmp_buf;
 			mask_was_saved*: INTEGER;
@@ -449,8 +451,8 @@ MODULE LinLibc ["libc.so.6"];
 
 	PROCEDURE [ccall] open* (name: PtrSTR; flags: SET; mode: mode_t): INTEGER;
 	PROCEDURE [ccall] close* (d: INTEGER): INTEGER;
-	PROCEDURE [ccall] read* (d: INTEGER; buf: PtrVoid; nbytes: size_t): INTEGER;
-	PROCEDURE [ccall] write* (d: INTEGER; buf: PtrVoid; nBytes: size_t): INTEGER;
+	PROCEDURE [ccall] read* (d: INTEGER; buf: PtrVoid; nbytes: size_t): ssize_t;
+	PROCEDURE [ccall] write* (d: INTEGER; buf: PtrVoid; nBytes: size_t): ssize_t;
 
 	PROCEDURE [ccall] mmap* (addr: PtrVoid; len: size_t; prot: SET; flags: SET; fd, offset: off_t): PtrVoid;
 	PROCEDURE [ccall] munmap* (addr: PtrVoid; len: size_t): INTEGER;

+ 148 - 0
BlackBox/_Linux_/Lin/Mod/Termios.txt

@@ -0,0 +1,148 @@
+MODULE LinTermios ["libc.so.6"];
+
+	(*
+		A. V. Shiryaev, 2012.11
+
+		Linux
+		i386
+	*)
+
+	CONST
+		NCCS* = 32;
+		_HAVE_STRUCT_TERMIOS_C_ISPEED* = 1;
+		_HAVE_STRUCT_TERMIOS_C_OSPEED* = 1;
+		VINTR* = 0;
+		VQUIT* = 1;
+		VERASE* = 2;
+		VKILL* = 3;
+		VEOF* = 4;
+		VTIME* = 5;
+		VMIN* = 6;
+		VSWTC* = 7;
+		VSTART* = 8;
+		VSTOP* = 9;
+		VSUSP* = 10;
+		VEOL* = 11;
+		VREPRINT* = 12;
+		VDISCARD* = 13;
+		VWERASE* = 14;
+		VLNEXT* = 15;
+		VEOL2* = 16;
+		IGNBRK* = 1;
+		BRKINT* = 2;
+		IGNPAR* = 4;
+		PARMRK* = 8;
+		INPCK* = 16;
+		ISTRIP* = 32;
+		INLCR* = 64;
+		IGNCR* = 128;
+		ICRNL* = 256;
+		IUCLC* = 512;
+		IXON* = 1024;
+		IXANY* = 2048;
+		IXOFF* = 4096;
+		IMAXBEL* = 8192;
+		IUTF8* = 16384;
+		OPOST* = 1;
+		OLCUC* = 2;
+		ONLCR* = 4;
+		OCRNL* = 8;
+		ONOCR* = 16;
+		ONLRET* = 32;
+		OFILL* = 64;
+		OFDEL* = 128;
+		VTDLY* = 16384;
+		VT0* = 0;
+		VT1* = 16384;
+		B0* = 0; (* hang up *)
+		B50* = 1;
+		B75* = 2;
+		B110* = 3;
+		B134* = 4;
+		B150* = 5;
+		B200* = 6;
+		B300* = 7;
+		B600* = 8;
+		B1200* = 9;
+		B1800* = 10;
+		B2400* = 11;
+		B4800* = 12;
+		B9600* = 13;
+		B19200* = 14;
+		B38400* = 15;
+		CSIZE* = 48;
+		CS5* = 0;
+		CS6* = 16;
+		CS7* = 32;
+		CS8* = 48;
+		CSTOPB* = 64;
+		CREAD* = 128;
+		PARENB* = 256;
+		PARODD* = 512;
+		HUPCL* = 1024;
+		CLOCAL* = 2048;
+		B57600* = 4097;
+		B115200* = 4098;
+		B230400* = 4099;
+		B460800* = 4100;
+		B500000* = 4101;
+		B576000* = 4102;
+		B921600* = 4103;
+		B1000000* = 4104;
+		B1152000* = 4105;
+		B1500000* = 4106;
+		B2000000* = 4107;
+		B2500000* = 4108;
+		B3000000* = 4109;
+		B3500000* = 4110;
+		B4000000* = 4111;
+		__MAX_BAUD* = B4000000;
+		ISIG* = 1;
+		ICANON* = 2;
+		ECHO* = 8;
+		ECHOE* = 16;
+		ECHOK* = 32;
+		ECHONL* = 64;
+		NOFLSH* = 128;
+		TOSTOP* = 256;
+		IEXTEN* = 32768;
+		TCOOFF* = 0;
+		TCOON* = 1;
+		TCIOFF* = 2;
+		TCION* = 3;
+		TCIFLUSH* = 0;
+		TCOFLUSH* = 1;
+		TCIOFLUSH* = 2;
+		TCSANOW* = 0;
+		TCSADRAIN* = 1;
+		TCSAFLUSH* = 2;
+
+	TYPE
+		tcflag_t* = INTEGER; (* unsigned int *)
+		cc_t* = SHORTCHAR; (* unsigned char *)
+		speed_t* = INTEGER; (* unsigned int *)
+		termios* = RECORD [untagged]
+			c_iflag*: tcflag_t; (* input mode flags *)
+			c_oflag*: tcflag_t; (* output mode flags *)
+			c_cflag*: tcflag_t; (* control mode flags *)
+			c_lflag*: tcflag_t; (* local mode flags *)
+			c_line*: cc_t; (* line discipline *)
+			cc_c*: ARRAY [untagged] NCCS OF cc_t; (* control chars *)
+			c_ispeed*: INTEGER; (* input speed *)
+			c_ospeed*: INTEGER; (* output speed *)
+		END;
+
+	(* POSIX.1 *)
+	PROCEDURE [ccall] cfgetispeed* (VAR tp: termios): speed_t;
+	PROCEDURE [ccall] cfsetispeed* (VAR tp: termios; ispeed: speed_t): INTEGER;
+	PROCEDURE [ccall] cfgetospeed* (VAR tp: termios): speed_t;
+	PROCEDURE [ccall] cfsetospeed* (VAR tp: termios; ospeed: speed_t): INTEGER;
+	PROCEDURE [ccall] tcgetattr* (fd: INTEGER; VAR tp: termios): INTEGER;
+	PROCEDURE [ccall] tcsetattr* (fd: INTEGER; action: INTEGER; VAR tp: termios): INTEGER;
+
+	PROCEDURE [ccall] tcdrain* (fd: INTEGER): INTEGER;
+	PROCEDURE [ccall] tcflow* (fd: INTEGER; action: INTEGER): INTEGER;
+	PROCEDURE [ccall] tcflush* (fd: INTEGER; action: INTEGER): INTEGER;
+	PROCEDURE [ccall] tcsendbreak* (fd: INTEGER; len: INTEGER): INTEGER;
+
+END LinTermios.

+ 46 - 0
BlackBox/_OpenBSD_/Lin/Mod/Ioctl.txt

@@ -0,0 +1,46 @@
+MODULE LinIoctl ["libc.so.66.0"];
+
+	(*
+		A. V. Shiryaev, 2012.11
+
+		OpenBSD 5.2
+		32-bit
+	*)
+
+	CONST
+		(* /usr/include/sys/ttycom.h *)
+			TIOCM_LE* = 1; (* line enable *)
+			TIOCM_DTR* = 2; (* data terminal ready *)
+			TIOCM_RTS* = 4; (* request to send *)
+			TIOCM_ST* = 8; (* secondary transmit *)
+			TIOCM_SR* = 16; (* secondary receive *)
+			TIOCM_CTS* = 32; (* clear to send *)
+			TIOCM_CAR* = 64; (* carrier detect *)
+			TIOCM_RNG* = 128; (* ring *)
+			TIOCM_DSR* = 256; (* data set ready *)
+
+		FIOCLEX* = 536897025;
+		FIONCLEX* = 536897026;
+		FIONREAD* = 1074030207;
+		FIONBIO* = -2147195266;
+		FIOASYNC* = -2147195267;
+		FIOSETOWN* = -2147195268;
+		FIOGETOWN* = 1074030203;
+		TIOCMGET* = 1074033770;
+		TIOCMSET* = -2147191699;
+		TIOCEXCL* = 536900621;
+		TIOCNXCL* = 536900622;
+		TIOCFLUSH* = -2147191792;
+		TIOCDRAIN* = 536900702;
+		TIOCOUTQ* = 1074033779;
+		TIOCSBRK* = 536900731;
+		TIOCCBRK* = 536900730;
+		TIOCSDTR* = 536900729;
+		TIOCCDTR* = 536900728;
+		TIOCMBIS* = -2147191700;
+		TIOCMBIC* = -2147191701;
+
+	PROCEDURE [ccall] ioctl0* ["ioctl"] (d: INTEGER; req: INTEGER): INTEGER;
+	PROCEDURE [ccall] ioctl1* ["ioctl"] (d: INTEGER; req: INTEGER; VAR arg: INTEGER): INTEGER;
+
+END LinIoctl.

+ 156 - 0
BlackBox/_OpenBSD_/Lin/Mod/Termios.txt

@@ -0,0 +1,156 @@
+MODULE LinTermios ["libc.so.66.0"];
+
+	(*
+		A. V. Shiryaev, 2012.11
+
+		OpenBSD 5.2
+		32-bit
+	*)
+
+	CONST
+		VEOF* = 0; (* ICANON *)
+		VEOL* = 1; (* ICANON *)
+		VERASE* = 3; (* ICANON *)
+		VKILL* = 5; (* ICANON *)
+		VINTR* = 8; (* ISIG *)
+		VQUIT* = 9; (* ISIG *)
+		VSUSP* = 10; (* ISIG *)
+		VSTART* = 12; (* IXON, IXOFF *)
+		VSTOP* = 13; (* IXON, IXOFF *)
+		VMIN* = 16; (* !ICANON *)
+		VTIME* = 17; (* !ICANON *)
+		NCCS* = 20;
+		IGNBRK* = 00000001H; (* ignore BREAK condition *)
+		BRKINT* = 00000002H; (* map BREAK to SIGINT *)
+		IGNPAR* = 00000004H; (* ignore (discard) parity errors *)
+		PARMRK* = 00000008H; (* mark parity and framing errors *)
+		INPCK* = 00000010H; (* enable checking of parity errors *)
+		ISTRIP* = 00000020H; (* strip 8th bit off chars *)
+		INLCR* = 00000040H; (* map NL into CR *)
+		IGNCR* = 00000080H; (* ignore CR *)
+		ICRNL* = 00000100H; (* map CR to NL (ala CRMOD) *)
+		IXON* = 00000200H; (* enable output flow control *)
+		IXOFF* = 00000400H; (* enable input flow control *)
+		OPOST* = 00000001H; (* enable following output processing *)
+		CSIZE* = 00000300H; (* character size mask *)
+		CS5* = 00000000H; (* 5 bits (pseudo) *)
+		CS6* = 00000100H; (* 6 bits *)
+		CS7* = 00000200H; (* 7 bits *)
+		CS8* = 00000300H; (* 8 bits *)
+		CSTOPB* = 00000400H; (* send 2 stop bits *)
+		CREAD* = 00000800H; (* enable receiver *)
+		PARENB* = 00001000H; (* parity enable *)
+		PARODD* = 00002000H; (* odd parity, else even *)
+		HUPCL* = 00004000H; (* hang up on last close *)
+		CLOCAL* = 00008000H; (* ignore modem status lines *)
+		ECHOE* = 00000002H; (* visually erase chars *)
+		ECHOK* = 00000004H; (* echo NL after line kill *)
+		ECHO* = 00000008H; (* enable echoing *)
+		ECHONL* = 00000010H; (* echo NL even if ECHO is off *)
+		ISIG* = 00000080H; (* enable signals INTR, QUIT, [D]SUSP *)
+		ICANON* = 00000100H; (* canonicalize input lines *)
+		IEXTEN* = 00000400H; (* enable DISCARD and LNEXT *)
+		EXTPROC* = 00000800H; (* external processing *)
+		TOSTOP* = 00400000H; (* stop background jobs from output *)
+		NOFLSH* = 80000000H; (* don't flush after interrupt *)
+		TCSANOW* = 0; (* make change immediate *)
+		TCSADRAIN* = 1; (* drain output, then change *)
+		TCSAFLUSH* = 2; (* drain output, flush input *)
+		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;
+		VEOL2* = 2; (* ICANON *)
+		VWERASE* = 4; (* ICANON *)
+		VREPRINT* = 6; (* ICANON *)
+		VDSUSP* = 11; (* ISIG *)
+		VLNEXT* = 14; (* IEXTEN *)
+		VDISCARD* = 15; (* IEXTEN *)
+		VSTATUS* = 18; (* ICANON *)
+		IXANY* = 00000800H; (* any char will restart after stop *)
+		IUCLC* = 00001000H; (* translate upper to lower case *)
+		IMAXBEL* = 00002000H; (* ring bell on input queue full *)
+		ONLCR* = 00000002H; (* map NL to CR-NL (ala CRMOD) *)
+		OXTABS* = 00000004H; (* expand tabs to spaces *)
+		ONOEOT* = 00000008H; (* discard EOT's (^D) on output *)
+		OCRNL* = 00000010H; (* map CR to NL *)
+		OLCUC* = 00000020H; (* translate lower case to upper case *)
+		ONOCR* = 00000040H; (* No CR output at column 0 *)
+		ONLRET* = 00000080H; (* NL performs the CR function *)
+		CIGNORE* = 00000001H; (* ignore control flags *)
+		CRTSCTS* = 00010000H; (* RTS/CTS full-duplex flow control *)
+		CRTS_IFLOW* = CRTSCTS; (* XXX compat *)
+		CCTS_OFLOW* = CRTSCTS; (* XXX compat *)
+		MDMBUF* = 00100000H; (* DTR/DCD hardware flow control *)
+		ECHOKE* = 00000001H; (* visual erase for line kill *)
+		ECHOPRT* = 00000020H; (* visual erase mode for hardcopy *)
+		ECHOCTL* = 00000040H; (* echo control chars as ^(Char) *)
+		ALTWERASE* = 00000200H; (* use alternate WERASE algorithm *)
+		FLUSHO* = 00800000H; (* output being flushed (state) *)
+		XCASE* = 01000000H; (* canonical upper/lower case *)
+		NOKERNINFO* = 02000000H; (* no kernel output from VSTATUS *)
+		PENDIN* = 20000000H; (* XXX retype pending input (state) *)
+		TCSASOFT* = 10H; (* flag - don't alter h.w. state *)
+		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;
+
+	TYPE
+		tcflag_t* = INTEGER; (* unsigned int *)
+		cc_t* = SHORTCHAR; (* unsigned char *)
+		speed_t* = INTEGER; (* unsigned int *)
+		termios* = RECORD [untagged]
+			c_iflag*: tcflag_t; (* input flags *)
+			c_oflag*: tcflag_t; (* output flags *)
+			c_cflag*: tcflag_t; (* control flags *)
+			c_lflag*: tcflag_t; (* local flags *)
+			c_cc*: ARRAY [untagged] NCCS OF cc_t; (* control chars *)
+			c_ispeed*: INTEGER; (* input speed *)
+			c_ospeed*: INTEGER; (* output speed *)
+		END;
+
+	(* POSIX.1 *)
+	PROCEDURE [ccall] cfgetispeed* (VAR tp: termios): speed_t;
+	PROCEDURE [ccall] cfsetispeed* (VAR tp: termios; ispeed: speed_t): INTEGER;
+	PROCEDURE [ccall] cfgetospeed* (VAR tp: termios): speed_t;
+	PROCEDURE [ccall] cfsetospeed* (VAR tp: termios; ospeed: speed_t): INTEGER;
+	PROCEDURE [ccall] tcgetattr* (fd: INTEGER; VAR tp: termios): INTEGER;
+	PROCEDURE [ccall] tcsetattr* (fd: INTEGER; action: INTEGER; VAR tp: termios): INTEGER;
+
+	PROCEDURE [ccall] tcdrain* (fd: INTEGER): INTEGER;
+	PROCEDURE [ccall] tcflow* (fd: INTEGER; action: INTEGER): INTEGER;
+	PROCEDURE [ccall] tcflush* (fd: INTEGER; action: INTEGER): INTEGER;
+	PROCEDURE [ccall] tcsendbreak* (fd: INTEGER; len: INTEGER): INTEGER;
+
+	(* extensions *)
+(*
+	PROCEDURE [ccall] cfsetspeed* (VAR tp: termios; speed: speed_t): INTEGER;
+	PROCEDURE [ccall] cfmakeraw* (VAR tp: termios);
+*)
+
+END LinTermios.

+ 6 - 0
BlackBox/build

@@ -123,3 +123,9 @@ DevCompiler.CompileThis XhtmlEntitySets XhtmlWriters XhtmlStdFileWriters XhtmlTe
 
 DevCompiler.CompileThis ObxHello0 ObxPi ObxRandom ObxTrap
 DATA
+
+./run-BlackBox <<DATA
+ConsCompiler.Compile('Lin/Mod', 'Termios.txt')
+ConsCompiler.Compile('Lin/Mod', 'Ioctl.txt')
+DevCompiler.CompileThis CommV24
+DATA

+ 3 - 0
README

@@ -121,7 +121,10 @@ Files:
 			Compiler.odc: console interface to Dev compiler
 			Log.odc: Log.Hook console implementation
 		{_Linux_,_OpenBSD_}/Lin/Mod/Iconv.odc: interface to libiconv system library
+		{_Linux_,_OpenBSD_}/Lin/Mod/Ioctl.odc: interface to ioctl
+		{_Linux_,_OpenBSD_}/Lin/Mod/Termios.odc: interface to termios
 		_LinuxOpenBSD_/Host/Mod/Lang.odc: Dialog.LanguageHook implementation and LANG environment variable support
+		_LinuxOpenBSD_/Comm/Mod/V24.odc: CommV24 implementation for Linux and OpenBSD
 
 		{_OpenBSD_,_Linux_}/libBB.so: compiled and linked shared library to run BlackBox
 		{_OpenBSD_,_Linux_}/libBB0.so: compiled and linked shared library to run simple development interpreter

+ 1 - 1
TODO

@@ -11,7 +11,7 @@ By priority:
 
 	handle SIGTERM in server version (when Kernel.Start used)
 
-	CommTCP, CommV24
+	CommTCP
 
 	printing (to PostScript)