diff --git a/src/test/files/testFiles.Mod b/src/test/files/testFiles.Mod index f6361b89..236a1247 100644 --- a/src/test/files/testFiles.Mod +++ b/src/test/files/testFiles.Mod @@ -20,8 +20,9 @@ IF F # NIL THEN Texts.Read (R, ch); WHILE ~R.eot DO - Texts.Read (R, ch); Console.Char(ch); + IF ch = 0DX THEN Console.Char(0AX) END; + Texts.Read (R, ch); END; ELSE diff --git a/src/test/server/s.Mod b/src/test/server/s.Mod index 0c559600..be04d59e 100644 --- a/src/test/server/s.Mod +++ b/src/test/server/s.Mod @@ -1,106 +1,90 @@ MODULE s; -IMPORT sockets, types, Out := Console, Unix, S := SYSTEM; +IMPORT sockets, types, Out := Console, SYSTEM, Platform, Strings; -TYPE Int32 = types.Int32; - Int16 = types.Int16; - String = types.String; -PROCEDURE DoSmth(sock : Int32); -VAR str, aff : String; - n, s : LONGINT; +PROCEDURE DoSmth(sock: Platform.FileHandle); +VAR + str, aff: ARRAY 256 OF CHAR; + n: LONGINT; BEGIN - s := SIZE(String); - aff := "Affirmative, Dave"; - n := Unix.Read(sock, S.ADR(str), s); - - IF n < 0 THEN - Out.String("error reading from socket"); Out.Ln; - END; - Out.String("received message is "); Out.String(str); Out.Ln; - s := 17; - n := Unix.Write(sock, S.ADR(aff), s); - IF n < 2 THEN + aff := "Affirmative, Dave"; +(* IF Platform.Read(sock, SYSTEM.ADR(str), 256, n) # 0 THEN *) + IF Platform.ReadBuf(sock, str, n) # 0 THEN + Out.String("error reading from socket"); Out.Ln; + ELSE + str[n] := 0X; (* Make sure that received message is zero terminated *) + Out.String("received message is "); Out.String(str); Out.Ln; + + IF Platform.Write(sock, SYSTEM.ADR(aff), Strings.Length(aff)) # 0 THEN Out.String("error writing to socket"); Out.Ln - END; - + END; + END; END DoSmth; -PROCEDURE ZeroByteArr(VAR a : ARRAY OF S.BYTE); -VAR i : LONGINT; -BEGIN - FOR i := 0 TO LEN(a)-1 DO - a[i] := 0 - END; -END ZeroByteArr; + + +PROCEDURE -includeunistd "#include "; +PROCEDURE -fork(): LONGINT "(LONGINT)fork()"; + PROCEDURE serve; -VAR sockfd, newsockfd, portno, clilen, pid: sockets.Int32; - ServAddr, CliAddr: sockets.SockAddrIn; - Null : Int32; - Port, maxQueue, res : Int32; - afinet, port, port0: Int16; +CONST + Port = 2055; + MaxQueue = 5; +VAR + sockfd: LONGINT; + newsockfd: LONGINT; + ServAddr: sockets.SockAddrIn; + pid: LONGINT; + res: Platform.ErrorCode; + sockaddrlen: LONGINT; BEGIN - Port := 2055; - maxQueue := 5; - Null := 0; - sockfd := sockets.Socket(S.VAL(Int32, sockets.AfInet), S.VAL(Int32, sockets.SockStream), Null); - IF sockfd < 0 THEN - Out.String("error opening socket") - ELSE - Out.String("socket created.") - END; - Out.Ln; - - types.IntegerToInt16(sockets.AfInet, afinet); - types.IntegerToInt16(Port, port); - types.htons(port, port0); (* only necessary on little endian computers *) - ServAddr.SinFamily := afinet; - ServAddr.SinPort := port0; - ZeroByteArr(ServAddr.SinZero); - (*Out.String("listening on port ");Out.Int(S.VAL(INTEGER, ServAddr.SinPort), 0); Out.Ln;*) - ServAddr.SinAddr.SAddr := 0(*sockets.InAddrAny*); - - res := sockets.Bind(sockfd, S.VAL(sockets.SockAddr, ServAddr), (SIZE(sockets.SockAddr))); - IF res < 0 THEN - Out.String("error on binding") - ELSE - Out.String("binding completed.") - END; - Out.Ln; + sockfd := sockets.Socket(sockets.AfInet, sockets.SockStream, 0); + IF sockfd < 0 THEN + Out.String("error opening socket") + ELSE + Out.String("socket created.") + END; + Out.Ln; + + sockets.SetSockAddrIn(sockets.AfInet, Port, 0, ServAddr); + IF sockets.Bind(sockfd, SYSTEM.VAL(sockets.SockAddr, ServAddr), SIZE(sockets.SockAddr)) < 0 THEN + Out.String("error on binding") + ELSE + Out.String("binding completed.") + END; + Out.Ln; - res := sockets.Listen(sockfd, maxQueue); - - IF res # 0 THEN - Out.String("listen() failed"); - ELSE - Out.String("listen okay"); - END; - Out.Ln; - clilen := SIZE(sockets.SockAddrIn); - LOOP - newsockfd := sockets.Accept(sockfd, S.VAL(sockets.SockAddr, ServAddr), clilen); - IF newsockfd < 0 THEN - Out.String("error on accept") - ELSE - Out.String("accept okay") - END; - Out.Ln; - - pid := Unix.Fork(); - IF pid < 0 THEN - Out.String("error on fork") - ELSIF pid = 0 THEN - Out.String("forked okay"); Out.Ln; - res := Unix.Close(sockfd); - DoSmth(newsockfd); - EXIT - ELSE - res := Unix.Close(newsockfd); - END; - END; + IF sockets.Listen(sockfd, MaxQueue) # 0 THEN + Out.String("listen() failed"); + ELSE + Out.String("listen okay"); + END; + Out.Ln; + LOOP + sockaddrlen := SIZE(sockets.SockAddrIn); + newsockfd := sockets.Accept(sockfd, SYSTEM.VAL(sockets.SockAddr, ServAddr), sockaddrlen); + IF newsockfd < 0 THEN + Out.String("error on accept") + ELSE + Out.String("accept okay") + END; + Out.Ln; + pid := fork(); + IF pid < 0 THEN + Out.String("error on fork") + ELSIF pid = 0 THEN + Out.String("forked okay"); Out.Ln; + res := Platform.Close(sockfd); + DoSmth(newsockfd); + EXIT + ELSE + res := Platform.Close(newsockfd) + END + END END serve; diff --git a/src/test/server/sockets.Mod b/src/test/server/sockets.Mod index 4cba806e..58ff3c24 100644 --- a/src/test/server/sockets.Mod +++ b/src/test/server/sockets.Mod @@ -1,119 +1,126 @@ MODULE sockets; -IMPORT types, SYS := SYSTEM; -TYPE - Int16* = types.Int16; (* INTEGER on 32 bit platform *) - Int32* = types.Int32; - Int64* = types.Int64; +IMPORT SYSTEM, oocC; CONST - SockStream* = 1; - SockDgram* = 2; - SockRaw* = 3; - SockRdm* = 4; - SockSeqpacket* = 5; - SockDccp* = 6; - SockPacket* = 10; - - AfUnscec* = 0; (* Unspecified. *) - AfLocal* = 1; (* Local to host (pipes and file-domain). *) - AfUnix* = 1; (* POSIX name for PF_LOCAL. *) - AfFile* = 1; (* Another non-standard name for PF_LOCAL. *) - AfInet* = 2; (* IP protocol family. *) - AfAx25* = 3; (* Amateur Radio AX.25. *) - AfIpx* = 4; (* Novell Internet Protocol. *) - AfAppletalk* = 5; (* Appletalk DDP. *) - AfNetrom* = 6; (* Amateur radio NetROM. *) - AfBridge* = 7; (* Multiprotocol bridge. *) - AfAtmpvc* = 8; (* ATM PVCs. *) - AfX25* = 9; (* Reserved for X.25 project. *) - AfInet6* = 10; (* IP version 6. *) - AfRose* = 11; (* Amateur Radio X.25 PLP. *) - AfDecnet* = 12; (* Reserved for DECnet project. *) - AfNetbeui*= 13; (* Reserved for 802.2LLC project. *) - AfSecurity*=14; (* Security callback pseudo AF. *) - AfKey* = 15; (* PF_KEY key management API. *) - AfNetlink*= 16; - AfRoute* = 16; (* Alias to emulate 4.4BSD. *) - AfPacket = 17; (* Packet family. *) - AfAsh = 18; (* Ash. *) - AfEconet* = 19; (* Acorn Econet. *) - AfAtmsvc* = 20; (* ATM SVCs. *) - AfRds* = 21; (* RDS sockets. *) - AfSna = 22; (* Linux SNA Project *) - AfIrda* = 23; (* IRDA sockets. *) - AfPppox = 24; (* PPPoX sockets. *) - AfWanpipe*= 25; (* Wanpipe API sockets. *) - AfLlc* = 26; (* Linux LLC. *) - AfCan* = 29; (* Controller Area Network. *) - AfTipc* = 30; (* TIPC sockets. *) - AfBluetooth* = 31; (* Bluetooth sockets. *) - AfIucv* = 32; (* IUCV sockets. *) - AfRxrpc* = 33; (* RxRPC sockets. *) - AfIsdn* = 34; (* mISDN sockets. *) - AfPhonet* = 35; (* Phonet sockets. *) - AfIeee802154* = 36; (* IEEE 802.15.4 sockets. *) - AfCaif* = 37; (* CAIF sockets. *) - AfAlg* = 38; (* Algorithm sockets. *) - AfNfc* = 39; (* NFC sockets. *) - AfVsock* = 40; (* vSockets. *) - AfMax* = 41; (* For now.. *) - - InAddrAny* = 0; + SockStream* = 1; + SockDgram* = 2; + SockRaw* = 3; + SockRdm* = 4; + SockSeqpacket* = 5; + SockDccp* = 6; + SockPacket* = 10; + + AfUnscec* = 0; (* Unspecified. *) + AfLocal* = 1; (* Local to host (pipes and file-domain). *) + AfUnix* = 1; (* POSIX name for PF_LOCAL. *) + AfFile* = 1; (* Another non-standard name for PF_LOCAL. *) + AfInet* = 2; (* IP protocol family. *) + AfAx25* = 3; (* Amateur Radio AX.25. *) + AfIpx* = 4; (* Novell Internet Protocol. *) + AfAppletalk* = 5; (* Appletalk DDP. *) + AfNetrom* = 6; (* Amateur radio NetROM. *) + AfBridge* = 7; (* Multiprotocol bridge. *) + AfAtmpvc* = 8; (* ATM PVCs. *) + AfX25* = 9; (* Reserved for X.25 project. *) + AfInet6* = 10; (* IP version 6. *) + AfRose* = 11; (* Amateur Radio X.25 PLP. *) + AfDecnet* = 12; (* Reserved for DECnet project. *) + AfNetbeui* = 13; (* Reserved for 802.2LLC project. *) + AfSecurity* = 14; (* Security callback pseudo AF. *) + AfKey* = 15; (* PF_KEY key management API. *) + AfNetlink* = 16; + AfRoute* = 16; (* Alias to emulate 4.4BSD. *) + AfPacket = 17; (* Packet family. *) + AfAsh = 18; (* Ash. *) + AfEconet* = 19; (* Acorn Econet. *) + AfAtmsvc* = 20; (* ATM SVCs. *) + AfRds* = 21; (* RDS sockets. *) + AfSna = 22; (* Linux SNA Project *) + AfIrda* = 23; (* IRDA sockets. *) + AfPppox = 24; (* PPPoX sockets. *) + AfWanpipe* = 25; (* Wanpipe API sockets. *) + AfLlc* = 26; (* Linux LLC. *) + AfCan* = 29; (* Controller Area Network. *) + AfTipc* = 30; (* TIPC sockets. *) + AfBluetooth* = 31; (* Bluetooth sockets. *) + AfIucv* = 32; (* IUCV sockets. *) + AfRxrpc* = 33; (* RxRPC sockets. *) + AfIsdn* = 34; (* mISDN sockets. *) + AfPhonet* = 35; (* Phonet sockets. *) + AfIeee802154* = 36; (* IEEE 802.15.4 sockets. *) + AfCaif* = 37; (* CAIF sockets. *) + AfAlg* = 38; (* Algorithm sockets. *) + AfNfc* = 39; (* NFC sockets. *) + AfVsock* = 40; (* vSockets. *) + AfMax* = 41; (* For now.. *) + + InAddrAny* = 0; TYPE - (* /usr/include/netinet/in.h *) InAddr* = RECORD - SAddr* : Int32; + SAddr*: oocC.int; END; SockAddrIn* = RECORD - SinFamily* : Int16; - SinPort* : Int16; - SinAddr* : InAddr; - SinZero* : ARRAY 8 OF CHAR; + SinFamily*: oocC.shortint; + SinPort*: oocC.shortint; + SinAddr*: InAddr; + SinZero*: ARRAY 8 OF CHAR; END; (* /usr/include/sys/socket.h *) SockAddr* = RECORD - SaFamily* : Int16; - SaData* : ARRAY 14 OF CHAR + SaFamily*: oocC.shortint; + SaData*: ARRAY 14 OF CHAR END; - PROCEDURE -socket(domain, type, protocol: Int32): Int32 - "(int)socket(domain, type, protocol)"; + PROCEDURE -includesocket "#include "; - PROCEDURE Socket*(domain, type, protocol: Int32): Int32; + PROCEDURE -SetCShort(i: INTEGER; VAR si: oocC.shortint) + "*(short*)si = i"; + + PROCEDURE -SetCShortSwapped(i: INTEGER; VAR si: oocC.shortint) + "*(short*)si = ((i >> 8) & 0x00ff) | ((i << 8) & 0xff00)"; + + PROCEDURE SetSockAddrIn*(family, port, inaddr: INTEGER; VAR sai: SockAddrIn); + VAR i: INTEGER; BEGIN - RETURN socket(domain, type, protocol) + SetCShort(family, sai.SinFamily); + SetCShortSwapped(port, sai.SinPort); + sai.SinAddr.SAddr := inaddr; + i := 0; WHILE i < 8 DO sai.SinZero[i] := 0X; INC(i) END + END SetSockAddrIn; + + PROCEDURE -socket(domain, type, protocol: LONGINT): INTEGER + "(INTEGER)socket((int)domain, (int)type, (int)protocol)"; + + PROCEDURE Socket*(domain, type, protocol: LONGINT): INTEGER; + BEGIN RETURN socket(domain, type, protocol) END Socket; - PROCEDURE -bind(sockfd: Int32; VAR addr: SockAddr; addrlen: Int32): Int32 - "(int)bind(sockfd, addr, addrlen)"; + PROCEDURE -bind(sockfd: LONGINT; VAR addr: SockAddr; addrlen: LONGINT): INTEGER + "(INTEGER)bind((int)sockfd, (const struct sockaddr*)addr, (int)addrlen)"; - PROCEDURE Bind*(sockfd: Int32; VAR addr: SockAddr; addrlen: Int32): Int32; - BEGIN - RETURN bind(sockfd, addr, addrlen) + PROCEDURE Bind*(sockfd: LONGINT; VAR addr: SockAddr; addrlen: LONGINT): INTEGER; + BEGIN RETURN bind(sockfd, addr, addrlen) END Bind; - PROCEDURE -listen(sockfd, backlog: Int32): Int32 - "(int)listen(sockfd, backlog)"; + PROCEDURE -listen(sockfd, backlog: LONGINT): INTEGER + "(INTEGER)listen((int)sockfd, (int)backlog)"; - PROCEDURE Listen*(sockfd, backlog: Int32): Int32; - BEGIN - RETURN listen(sockfd, backlog) + PROCEDURE Listen*(sockfd, backlog: LONGINT): INTEGER; + BEGIN RETURN listen(sockfd, backlog) END Listen; - PROCEDURE -accept(sockfd: Int32; VAR addr: SockAddr; VAR addrlen: Int32): Int32 - "(int)accept(sockfd, addr, addrlen)"; + PROCEDURE -accept(sockfd: LONGINT; VAR addr: SockAddr; VAR addrlen: LONGINT; VAR result: INTEGER) + "int _o_al = (int)addrlen; *result = (INTEGER)accept((int)sockfd, (struct sockaddr*)addr, &_o_al); *addrlen = _o_al"; - PROCEDURE Accept*(sockfd: Int32; VAR addr: SockAddr; VAR addrlen: Int32): Int32; - BEGIN - RETURN accept(sockfd, addr, addrlen) + PROCEDURE Accept*(sockfd: LONGINT; VAR addr: SockAddr; VAR addrlen: LONGINT): INTEGER; + VAR result: INTEGER; + BEGIN accept(sockfd, addr, addrlen, result); RETURN result END Accept; -BEGIN - END sockets. diff --git a/src/test/server/types.Mod b/src/test/server/types.Mod index 633e6b26..ca6b5d02 100644 --- a/src/test/server/types.Mod +++ b/src/test/server/types.Mod @@ -1,38 +1,25 @@ MODULE types; -IMPORT SYS := SYSTEM; +IMPORT SYSTEM; TYPE - intarr64 = ARRAY 8 OF SYS.BYTE; (* to emulate int16 on x86_64; -- noch *) - intarr32 = ARRAY 4 OF SYS.BYTE; - intarr16 = ARRAY 2 OF SYS.BYTE; - Int16* = intarr16; (* INTEGER on 32 bit platform *) - Int32* = INTEGER; - Int64* = LONGINT; - String* = ARRAY 256 OF CHAR; + (* Int32* = ARRAY 4 OF SYSTEM.BYTE; *) + Int16* = ARRAY 2 OF SYSTEM.BYTE; - PROCEDURE LongintToInt16*(int: LONGINT; VAR int16: Int16); - VAR longintarr : intarr64; - BEGIN - (*RETURN SYS.VAL(Int16, int)*) - longintarr := SYS.VAL(intarr64, int); - int16[0] := longintarr[0]; - int16[1] := longintarr[1]; (* this will work for little endian -- noch *) - END LongintToInt16; + PROCEDURE IntegerToInt16*(int: INTEGER; VAR int16: Int16); + TYPE PInt16 = POINTER TO Int16; + VAR p: PInt16; + BEGIN + (* Note: We take the least significant 16 bits of int, which + is correct on supported (i.e. little-endian) architectures. *) + p := SYSTEM.VAL(PInt16, SYSTEM.ADR(int)); + int16 := p^; + END IntegerToInt16; - PROCEDURE IntegerToInt16*(int: INTEGER; VAR int16: Int16); - VAR intarr : intarr32; - BEGIN - int16 := SYS.VAL(Int16, int) - (*intarr := SYS.VAL(intarr32, int); - int16[0] := intarr[0]; - int16[1] := intarr[1];*) (* this will work for little endian -- noch *) - END IntegerToInt16; - - PROCEDURE htons*(in: Int16; VAR out : Int16); - BEGIN - out[0] := in[1]; - out[1] := in[0]; - END htons; + PROCEDURE htons*(in: Int16; VAR out : Int16); + BEGIN + out[0] := in[1]; + out[1] := in[0]; + END htons; END types. diff --git a/src/test/vt100/crt.Mod b/src/test/vt100/crt.Mod index 3fd63b47..c5f3662f 100644 --- a/src/test/vt100/crt.Mod +++ b/src/test/vt100/crt.Mod @@ -1,6 +1,6 @@ MODULE crt; -IMPORT vt100, Unix, Console, +IMPORT vt100, Platform, Console, Strings; (* strings to remove later ? *) CONST @@ -28,8 +28,6 @@ CONST (* Add-in for blinking *) Blink* = 128; -TYPE - PFdSet = POINTER TO Unix.FdSet; VAR tmpstr : ARRAY 23 OF CHAR; @@ -58,16 +56,8 @@ VAR tmpstr : ARRAY 23 OF CHAR; vt100.DECTCEMh; END cursoron; - PROCEDURE Delay*( ms : INTEGER); - VAR i : LONGINT; - tv : Unix.Timeval; - pfd : PFdSet; - BEGIN - tv.sec := 0; - tv.usec := ms * 1000; - pfd := NIL; - i := Unix.Select(0, pfd^, pfd^, pfd^, tv); - END Delay; + PROCEDURE Delay*(ms: INTEGER); + BEGIN Platform.Delay(ms) END Delay; PROCEDURE GotoXY* (x, y: INTEGER); BEGIN diff --git a/src/test/x11/0/test.Mod b/src/test/x11/0/test.Mod index 8ba92261..b15133d1 100644 --- a/src/test/x11/0/test.Mod +++ b/src/test/x11/0/test.Mod @@ -1,29 +1,31 @@ MODULE test; IMPORT p := oocXYplane, Out := Console; -VAR ch : CHAR; -i : INTEGER; + +VAR + ch : CHAR; + i : INTEGER; + BEGIN + p.Open; -p.Open; + (*p.Clear;*) + FOR i := 1 TO 555 DO + p.Dot(i,300 ,p.draw) + END; + + (* + FOR i := 100 TO 500 DO + p.Dot(i,300 ,p.erase) + END; + *) + + IF p.IsDot (5, 300) THEN Out.String("Yes") ELSE Out.String("No") END; Out.Ln; + IF p.IsDot (5, 500) THEN Out.String("Yes") ELSE Out.String("No") END; Out.Ln; -(*p.Clear;*) -FOR i := 1 TO 555 DO -p.Dot(i,300 ,p.draw) -END; -(* -FOR i := 100 TO 500 DO -p.Dot(i,300 ,p.erase) -END; -*) - -IF p.IsDot (5, 300) THEN Out.String("Yes") ELSE Out.String("No") END; Out.Ln; -IF p.IsDot (5, 500) THEN Out.String("Yes") ELSE Out.String("No") END; Out.Ln; - -REPEAT - ch := p.Key(); -UNTIL ch # 0X; - -p.Close; + REPEAT + ch := p.Key(); + UNTIL ch # 0X; + p.Close; END test.