1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#+build windows
package ENet
// When we implement the appropriate bindings for Windows, the section separated
// by `{` and `}` here can be removed in favor of using the bindings.
// {
foreign import WinSock2 "system:Ws2_32.lib"
@(private="file", default_calling_convention="c")
foreign WinSock2 {
__WSAFDIsSet :: proc(fd: SOCKET, s: ^fd_set) -> i32 ---
}
@(private="file") SOCKET :: uintptr
@(private="file") FD_SETSIZE :: 64
@(private="file") fd_set :: struct {
fd_count: u32,
fd_array: [FD_SETSIZE]SOCKET,
}
@(private="file") FD_CLR :: proc "contextless" (fd: SOCKET, s: ^fd_set) {
for i := u32(0); i < s.fd_count; i += 1 {
if s.fd_array[i] == fd {
for i < s.fd_count - 1 {
s.fd_array[i] = s.fd_array[i + 1]
i += 1
}
s.fd_count -= 1
break
}
}
}
@(private="file") FD_SET :: proc "contextless" (fd: SOCKET, s: ^fd_set) {
for i := u32(0); i < s.fd_count; i += 1 {
if s.fd_array[i] == fd {
return
}
}
if s.fd_count >= FD_SETSIZE {
return
}
s.fd_array[s.fd_count] = fd
s.fd_count += 1
}
@(private="file") FD_ZERO :: #force_inline proc "contextless" (s: ^fd_set) {
s.fd_count = 0
}
@(private="file") FD_ISSET :: #force_inline proc "contextless" (fd: SOCKET, s: ^fd_set) -> bool {
return __WSAFDIsSet(fd, s) != 0
}
// }
Socket :: distinct SOCKET
SOCKET_NULL :: Socket(~uintptr(0))
Buffer :: struct {
data: rawptr,
dataLength: uint,
}
SocketSet :: distinct fd_set
SOCKETSET_EMPTY :: #force_inline proc "contextless" (sockset: ^SocketSet) {
FD_ZERO(cast(^fd_set)sockset)
}
SOCKETSET_ADD :: #force_inline proc "contextless" (sockset: ^SocketSet, socket: Socket) {
FD_SET(SOCKET(socket), cast(^fd_set)sockset)
}
SOCKETSET_REMOVE :: #force_inline proc "contextless" (sockset: ^SocketSet, socket: Socket) {
FD_CLR(SOCKET(socket), cast(^fd_set)sockset)
}
SOCKSET_CHECK :: #force_inline proc "contextless" (sockset: ^SocketSet, socket: Socket) -> bool {
return FD_ISSET(SOCKET(socket), cast(^fd_set)sockset)
}
|