From e15f2453399d0506692a64cdc190d4239a7c6661 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 07:40:40 -0400 Subject: [PATCH] vendor ENet --- vendor/ENet/callbacks.odin | 7 + vendor/ENet/enet.odin | 392 +++++++++++++++++++++++++++++++++++++ vendor/ENet/lib/enet.lib | Bin 0 -> 48016 bytes vendor/ENet/lib/enet64.lib | Bin 0 -> 52236 bytes vendor/ENet/list.odin | 10 + vendor/ENet/protocol.odin | 164 ++++++++++++++++ vendor/ENet/time.odin | 23 +++ vendor/ENet/unix.odin | 59 ++++++ vendor/ENet/win32.odin | 81 ++++++++ 9 files changed, 736 insertions(+) create mode 100644 vendor/ENet/callbacks.odin create mode 100644 vendor/ENet/enet.odin create mode 100644 vendor/ENet/lib/enet.lib create mode 100644 vendor/ENet/lib/enet64.lib create mode 100644 vendor/ENet/list.odin create mode 100644 vendor/ENet/protocol.odin create mode 100644 vendor/ENet/time.odin create mode 100644 vendor/ENet/unix.odin create mode 100644 vendor/ENet/win32.odin diff --git a/vendor/ENet/callbacks.odin b/vendor/ENet/callbacks.odin new file mode 100644 index 000000000..444c191d6 --- /dev/null +++ b/vendor/ENet/callbacks.odin @@ -0,0 +1,7 @@ +package ENet + +Callbacks :: struct { + malloc: proc "c" (size: uint) -> rawptr, + free: proc "c" (memory: rawptr), + no_memory: proc "c" (), +} \ No newline at end of file diff --git a/vendor/ENet/enet.odin b/vendor/ENet/enet.odin new file mode 100644 index 000000000..175766ef1 --- /dev/null +++ b/vendor/ENet/enet.odin @@ -0,0 +1,392 @@ +package ENet + +when ODIN_OS == "windows" { + when ODIN_ARCH == "amd64" { + foreign import ENet "lib/enet64.lib" + } else { + foreign import ENet "lib/enet.lib" + } +} else { + foreign import ENet "system:enet" +} + +VERSION_MAJOR :: u8(1) +VERSION_MINOR :: u8(3) +VERSION_PATCH :: u8(17) + +VERSION_CREATE :: #force_inline proc(major, minor, patch: u8) -> u32 { + return (u32(major) << 16) | (u32(minor) << 8) | u32(patch) +} + +VERSION_GET_MAJOR :: #force_inline proc(version: u32) -> u8 { + return u8((version >> 16) & 0xff) +} +VERSION_GET_MINOR :: #force_inline proc(version: u32) -> u8 { + return u8((version >> 8) & 0xff); +} +VERSION_GET_PATCH :: #force_inline proc(version: u32) -> u8 { + return u8(version & 0xff); +} + +// Odin does not have "macros" or compile-time evaluation of functions, so the +// following is just the same as. +// VERSION :: VERSION_CREATE(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); +VERSION :: (u32(VERSION_MAJOR) << 16) | (u32(VERSION_MINOR) << 8) | u32(VERSION_PATCH) + +// Network byte order is always Big Endian. Instead of using the method ENet +// uses (leveraging {n,h}to{n,h}{s,l}), we can just use Odin's endianess types +// to get the correct byte swaps, if any. +HOST_TO_NET_16 :: #force_inline proc(value: u16) -> u16 { + return transmute(u16)u16be(value) +} + +HOST_TO_NET_32 :: #force_inline proc(value: u32) -> u32 { + return transmute(u32)u32be(value) +} + +NET_TO_HOST_16 :: #force_inline proc(value: u16) -> u16 { + return u16(transmute(u16be)value) +} + +NET_TO_HOST_32 :: #force_inline proc(value: u32) -> u32 { + return u32(transmute(u32be)value) +} + +Version :: u32; + +SocketType :: enum i32 { + STREAM = 1, + DATAGRAM = 2, +} + +SocketWait :: enum i32 { + NONE = 0, + SEND = 1 << 0, + RECEIVE = 1 << 1, + INTERRUPT = 1 << 2, +} + +SocketOption :: enum i32 { + NONBLOCK = 1, + BROADCAST = 2, + RCVBUF = 3, + SNDBUF = 4, + REUSEADDR = 5, + RCVTIMEO = 6, + SNDTIMEO = 7, + ERROR = 8, + NODELAY = 9, +} + +SocketShutdown :: enum i32 { + READ = 0, + WRITE = 1, + READ_WRITE = 2, +} + +HOST_ANY :: u32(0) +HOST_BROADCAST :: u32(0xffffffff) +PORT_ANY :: u16(0) + +Address :: struct { + host: u32, + port: u16, +} + +PacketFlag :: enum i32 { + RELIABLE = 1 << 0, + UNSEQUENCED = 1 << 1, + NO_ALLOCATE = 1 << 2, + UNRELIABLE_FRAGMENT = 1 << 3, + FLAG_SENT = 1 << 8, +} + +PacketFreeCallback :: proc "c" (packet: ^Packet); + +Packet :: struct { + referenceCount: uint, + flags: u32, + data: [^]u8, + dataLength: uint, + freeCallback: PacketFreeCallback, + userData: rawptr, +} + +Acknowledgment :: struct { + acknowledgementList: ListNode, + sentTime: u32, + command: Protocol, +} + +OutgoingCommand :: struct { + outgoingCommandList: ListNode, + reliableSequenceNumber: u16, + unreliableSequenceNumber: u16, + sentTime: u32, + roundTripTimeout: u32, + roundTripTimeoutLimit: u32, + fragmentOffset: u32, + fragmentLength: u16, + sendAttempts: u16, + command: Protocol, + packet: ^Packet, +} + +IncomingCommand :: struct { + incomingCommandList: ListNode, + reliableSequenceNumber: u16, + unreliableSequenceNumber: u16, + command: Protocol, + fragmentCount: u32, + fragmentsRemaining: u32, + fragments: [^]u32, + packet: ^Packet, +} + +PeerState :: enum i32 { + DISCONNECTED, + CONNECTING, + ACKNOWLEDGING_CONNECT, + CONNECTION_PENDING, + CONNECTION_SUCCEEDED, + CONNECTED, + DISCONNECT_LATER, + DISCONNECTING, + ACKNOWLEDGING_DISCONNECT, + ZOMBIE, +} + +BUFFER_MAXIMUM :: (1 + 2 * PROTOCOL_MAXIMUM_PACKET_COMMANDS) + +HOST_RECEIVE_BUFFER_SIZE :: 256 * 1024 +HOST_SEND_BUFFER_SIZE :: 256 * 1024 +HOST_BANDWIDTH_THROTTLE_INTERVAL :: 1000 +HOST_DEFAULT_MTU :: 1400 +HOST_DEFAULT_MAXIMUM_PACKET_SIZE :: 32 * 1024 * 1024 +HOST_DEFAULT_MAXIMUM_WAITING_DATA :: 32 * 1024 * 1024 + +PEER_DEFAULT_ROUND_TRIP_TIME :: 500 +PEER_DEFAULT_PACKET_THROTTLE :: 32 +PEER_PACKET_THROTTLE_SCALE :: 32 +PEER_PACKET_THROTTLE_COUNTER :: 7 +PEER_PACKET_THROTTLE_ACCELERATION :: 2 +PEER_PACKET_THROTTLE_DECELERATION :: 2 +PEER_PACKET_THROTTLE_INTERVAL :: 5000 +PEER_PACKET_LOSS_SCALE :: 1 << 16 +PEER_PACKET_LOSS_INTERVAL :: 10000 +PEER_WINDOW_SIZE_SCALE :: 64 * 1024 +PEER_TIMEOUT_LIMIT :: 32 +PEER_TIMEOUT_MINIMUM :: 5000 +PEER_TIMEOUT_MAXIMUM :: 30000 +PEER_PING_INTERVAL :: 500 +PEER_UNSEQUENCED_WINDOWS :: 64 +PEER_UNSEQUENCED_WINDOW_SIZE :: 1024 +PEER_FREE_UNSEQUENCED_WINDOWS :: 32 +PEER_RELIABLE_WINDOWS :: 16 +PEER_RELIABLE_WINDOW_SIZE :: 0x1000 +PEER_FREE_RELIABLE_WINDOWS :: 8 + +Channel :: struct { + outgoingReliableSequenceNumber: u16, + outgoingUnreliableSequenceNumber: u16, + usedReliableWindows: u16, + reliableWindows: [PEER_RELIABLE_WINDOWS]u16, + incomingReliableSequenceNumber: u16, + incomingUnreliableSequenceNumber: u16, + incomingReliableCommands: List, + incomingUnreliableCommands: List, +} + +PeerFlag :: enum i32 { + NEEDS_DISPATCH, +} + +Peer :: struct { + dispatchList: ListNode, + host: ^Host, + outgoingPeerID: u16, + incomingPeerID: u16, + connectID: u32, + outgoingSessionID: u8, + incomingSessionID: u8, + address: Address, + data: rawptr, + state: PeerState, + channels: [^]Channel, + channelCount: uint, + incomingBandwidth: u32, + outgoingBandwidth: u32, + incomingBandwidthThrottleEpoch: u32, + outgoingBandwidthThrottleEpoch: u32, + incomingDataTotal: u32, + outgoingDataTotal: u32, + lastSendTime: u32, + lastReceiveTime: u32, + nextTimeout: u32, + earliestTimeout: u32, + packetLossEpoch: u32, + packetsSent: u32, + packetsLost: u32, + packetLoss: u32, + packetLossVariance: u32, + packetThrottle: u32, + packetThrottleLimit: u32, + packetThrottleCounter: u32, + packetThrottleEpoch: u32, + packetThrottleAcceleration: u32, + packetThrottleDeceleration: u32, + packetThrottleInterval: u32, + pingInterval: u32, + timeoutLimit: u32, + timeoutMinimum: u32, + timeoutMaximum: u32, + lastRoundTripTime: u32, + lowestRoundTripTime: u32, + lastRoundTripTimeVariance: u32, + highestRoundTripTimeVariance: u32, + roundTripTime: u32, + roundTripTimeVariance: u32, + mtu: u32, + windowSize: u32, + reliableDataInTransit: u32, + outgoingReliableSequenceNumber: u16, + acknowledgements: List, + sentReliableCommands: List, + sentUnreliableCommands: List, + outgoingCommands: List, + dispatchedCommands: List, + flags: u16, + reserved: u16, + incomingUnsequencedGroup: u16, + outgoingUnsequencedGroup: u16, + unsequencedWindow: [PEER_UNSEQUENCED_WINDOW_SIZE / 32]u32, + eventData: u32, + totalWaitingData: uint, +} + +Compressor :: struct { + context_: rawptr, + compress: proc "c" (context_: rawptr, inBuffers: [^]Buffer, inBufferCount: uint, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint, + decompress: proc "c" (context_: rawptr, inData: [^]u8, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint, + destroy: proc "c" (context_: rawptr), +} + +ChecksumCallback :: proc "c" (buffers: [^]Buffer, bufferCount: uint) -> u32 +InterceptCallback :: proc "c" (host: ^Host, event: ^Event) -> i32 + +Host :: struct { + socket: Socket, + address: Address, + incomingBandwidth: u32, + outgoingBandwidth: u32, + bandwidthThrottleEpoch: u32, + mtu: u32, + randomSeed: u32, + recalculateBandwidthLimits: i32, + peers: [^]Peer, + peerCount: uint, + channelLimit: uint, + serviceTime: u32, + dispatchQueue: List, + continueSending: i32, + packetSize: uint, + headerFlags: u16, + commands: [PROTOCOL_MAXIMUM_PACKET_COMMANDS]Protocol, + commandCount: uint, + buffers: [BUFFER_MAXIMUM]Buffer, + bufferCount: uint, + checksum: ChecksumCallback, + compressor: Compressor, + packetData: [2][PROTOCOL_MAXIMUM_MTU]u8, + receivedAddress: Address, + receivedData: [^]u8, + receivedDataLength: uint, + totalSentData: u32, + totalSentPackets: u32, + totalReceivedData: u32, + totalReceivedPackets: u32, + intercept: InterceptCallback, + connectedPeers: uint, + bandwidthLimitedPeers: uint, + duplicatePeers: uint, + maximumPacketSize: uint, + maximumWaitingData: uint, +} + +EventType :: enum i32 { + NONE = 0, + CONNECT = 1, + DISCONNECT = 2, + RECEIVE = 3, +} + +Event :: struct { + type: EventType, + peer: ^Peer, + channelID: u8, + data: u32, + packet: ^Packet, +} + +@(default_calling_convention="c", link_prefix="enet_") +foreign ENet { + initialize :: proc() -> i32 --- + initialize_with_callbacks :: proc(version: Version, inits: ^Callbacks) -> i32 --- + deinitialize :: proc() --- + linked_version :: proc() -> Version --- + time_get :: proc() -> u32 --- + time_set :: proc(u32) --- + + socket_create :: proc(SocketType) -> Socket --- + socket_bind :: proc(Socket, ^Address) -> i32 --- + socket_get_address :: proc(Socket, ^Address) -> i32 --- + socket_listen :: proc(Socket, i32) -> i32 --- + socket_accept :: proc(Socket, ^Address) -> Socket --- + socket_connect :: proc(Socket, ^Address) -> i32 --- + socket_send :: proc(Socket, ^Address, ^Buffer, uint) -> i32 --- + socket_receive :: proc(Socket, ^Address, ^Buffer, uint) -> i32 --- + socket_wait :: proc(Socket, ^u32, u32) -> i32 --- + socket_set_option :: proc(Socket, SocketOption, i32) -> i32 --- + socket_get_option :: proc(Socket, SocketOption, ^i32) -> i32 --- + socket_shutdown :: proc(Socket, SocketShutdown) -> i32 --- + socket_destroy :: proc(Socket) --- + socketset_select :: proc(Socket, ^SocketSet, ^SocketSet, u32) -> i32 --- + + address_set_host_ip :: proc(address: ^Address, hostName: cstring) -> i32 --- + address_set_host :: proc(address: ^Address, hostName: cstring) -> i32 --- + address_get_host_ip :: proc(address: ^Address, hostName: cstring, nameLength: uint) -> i32 --- + address_get_host :: proc(address: ^Address, hostName: cstring, nameLength: uint) -> i32 --- + + packet_create :: proc(rawptr, uint, u32) -> ^Packet --- + packet_destroy :: proc(^Packet) --- + packet_resize :: proc(^Packet, uint) -> i32 --- + crc32 :: proc(^Buffer, uint) -> u32 --- + + host_create :: proc(^Address, uint, uint, u32, u32) -> ^Host --- + host_destroy :: proc(^Host) --- + host_connect :: proc(^Host, ^Address, uint, u32) -> ^Peer --- + host_check_events :: proc(^Host, ^Event) -> i32 --- + host_service :: proc(^Host, ^Event, u32) -> i32 --- + host_flush :: proc(^Host) --- + host_broadcast :: proc(^Host, u8, ^Packet) --- + host_compress :: proc(^Host, ^Compressor) --- + host_compress_with_range_coder :: proc(^Host) -> i32 --- + host_channel_limit :: proc(^Host, uint) --- + host_bandwidth_limit :: proc(^Host, u32, u32) --- + + peer_send :: proc(^Peer, u8, ^Packet) -> i32 --- + peer_receive :: proc(^Peer, ^u8) -> ^Packet --- + peer_ping :: proc(^Peer) --- + peer_ping_interval :: proc(^Peer, u32) --- + peer_timeout :: proc(^Peer, u32, u32, u32) --- + peer_reset :: proc(^Peer) --- + peer_disconnect :: proc(^Peer, u32) --- + peer_disconnect_now :: proc(^Peer, u32) --- + peer_disconnect_later :: proc(^Peer, u32) --- + peer_throttle_configure :: proc(^Peer, u32, u32, u32) --- + + range_coder_create :: proc() -> rawptr --- + range_coder_destroy :: proc(rawptr) --- + range_coder_compress :: proc(rawptr, [^]Buffer, uint, uint, [^]u8, uint) -> uint --- + range_coder_decompress :: proc(rawptr, [^]u8, uint, [^]u8, uint) -> uint --- +} \ No newline at end of file diff --git a/vendor/ENet/lib/enet.lib b/vendor/ENet/lib/enet.lib new file mode 100644 index 0000000000000000000000000000000000000000..f713886a8293a264b346dc02fe341ef41706a560 GIT binary patch literal 48016 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 Pwf{@)a~p$5f9n4S1!tn_ literal 0 HcmV?d00001 diff --git a/vendor/ENet/lib/enet64.lib b/vendor/ENet/lib/enet64.lib new file mode 100644 index 0000000000000000000000000000000000000000..21e4edf4aea3ef53326a0cd406af655ed1c22889 GIT binary patch literal 52236 zcmeFae|%KM)jxi3vV;&LHz?YuR9CxVwjd^eniXjGCY$80Y%mI9tds;o)y5 zZNly*xxKDUTdF=!Z9hDH{IpuzYFi(IXzgwglHjiZilEgZt(qnN0Id*E$@hI`?!CL4 z4bo5h^!fhr`P^4F_uMlxXMUYIb7tnu%*FFpG}Y97E$a$v@{^zN$>GHRR%=0_V>b6v zoh1l@TM#Bbocud8Ul7LrrcW1yFZ#{P6NIt9um4RD5`RjQApCd!8hJi(Nw#7ZA)T^ zF`vz-J|4aiRfk%wNyxm8O3J>DLq(V&Ynp22%+`t2q7IYO*+{6S+M3#WBON-X8L@rK zU+b^cYm}kau0a(gl&yhWRo|S7Mu1RzUU4LU0!rZ!+XrdxlqkUBY>_153&Z!$`ea!ct*@H=kW z%EE@?Ya5JMs^Z+j+K;!v-(1IY#@ka}ZO!dfwJoRxJwXf&W^Spk z(Tg@NZ+O5}wPP_X4BGUnwX3U|YisrT@}c&tZZ#N%eVJ^tV$~`VDe Vxj9BIq|U$ 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�y_s#UyQ^-dTb(p7Vv$TujYwiG(Ge5F!gZr2ADmIv2qN5 z!kFlI`!6^eyN0|Q@@7nbw9cblN@3k7N_C^HA0RAC^E~P*Tcu0o2L_jGW%>H?G;&{A zC3$B@uwfDT84NwJ-b`Fnu72)TKkRmgJ97{p>u+SOQvpnJ@V}5}6rB|O6@YTB^>D#} zJN%u)FapFvZ+V@&j|nv*4UhyIRRh+Rs%fn5cAS)gZvg{oNPV3tNref2~pjM^wpq>)LUgsw~-^31?l zMPs@&+`~h6)#%-sTm1>ux^5uk)~c-3L46&GbZZh>2L*o*PAJjJomgU)XOy)q7`3$r8D$f%y?=G|I|j+JEX_A^S5 zc4IYSqzsjZ!&}ZL5efSoC4Adw?!b`f4*$sDSoBn}(LpTAlEFk>IqpRW(g8aj$0t(9 z?*Ozt?<7NrIyiqX58QxDIZjHgXMw%$&&Ox+D@fwTs) zmjTg;Zyr)e2pAmEMN92}Bw8ReQP%FC2@uR~QP0MryIcDarP{4B@ABxNnofxd?Le-| zHKuXMT8R@(0zV_}a8(XCg0ZRExekOF_qw&UIoNE1Z4BqfsC}7>l)wWk1v3+nIN*+L zV}PkHdV-hR-I>(%868}g1lt!CXPE85MJuenJ89C&1;c4|&}HB4viIZkR^o%QLD_NB zvr@;4=p_{D7|HKmJ>?TU zjuD@Pv$yY|In*x@>EKLCg&FyH8 zVC(ZG+D$=rH`hEA3y1`X^}Yp|-FuVJp9lU(GBU$I-R)?#`mJDD{{^TPYQypN8~2ZM z*1Bl*Nf!Sw_*J|Dp_lP8n{CX498>c#+b?e%Qs~ccp!N_t41jnak*r6|YQKHZzLPhn zvR>IywngfEfq5xA;GR)ZjdN=uXr2N_!Rc?X@IB6o3f33Y(!TsLa`aO;8u2kk#+?r_ zHz^A^2X3dmSFfZFnqRc{FOV)n)4D$b1v}VJ8SRO)ePd>iS94(ILF@v<8x-kBq_^>od-y-&9Ax$q{y}EKZPXVm z;O+z$nEC|E&bcNjs57X($QVh>BjrjVkfi2iTwuFbP1-x)LxAnAL;B% zQY!YaaTpyk)JKVjx}a-peMOn>G+CyY(%q%WvfSbuuJ9rR@W!d(qzruY( z=!L=ykbFp*9dz2Jvqb&G1Ld4tWGD`~YSg|9*V~Zz?WDyf)W5O#ngF=NK^vX>%m%6O?G8U^+ky^=6gf;`7{^Y(LEnWgsCX_63Fs)w zLbsM}lb@sr6eRZndLvP|_<@HZ+X|K$)J2zqn4}=>URG)bWie>mhbY}>BnRk?;1TwQ z`ir+52-^OHH?~Dae3!s%2B{w%WJ$+z0#Eucz$b3#D&!w3Bh1`CVHnug03-EeGDVb| zGSP{p)F-QbWP{oMt^kd<{jE_+k^YE{EbDDe*vdqs7rM0V#MhPRar{nxJ#Y{^hDN`x z1l~HS1m3}~H!bjP8jkHei4_u@C47QjfxZm%?uz6(g5L>{J&v(ua0XIIMxEvJVC5jy|}D^JHckg|4tVY&JusaH-o1x`RIzZwAWHrcU}RfiPZ4*CI{j2@Z>Cs4jS z7wW>7)Dl?+R)W( zw9#4PvRGOTEof<;hwPZeZEjeG1xOOO!$lUFDBExpQ9x;$9e77_ww=tDI^Sk-9yVse z4v@5?BQ&Job8vBo=cmC&RO+Pp0XDM0eT#_SpM}tAQt01+#-u7GB=$==qG~b5F3*#8i

(LbL+o0JX0#4caM#h&RdHp*Th7MV|&w; zZd|&^c+9cAH4kkh5A@M2i!%U|6hhiwGY2<*JYVe zv~BuES1q95mvI0${JEsEUKE4T*h9B~&{6Kuf=kpeU(1}JDv%I!*$;7Tr1eqsd}Pu~ z9X4698C4|(o?@M}QC(8!qcpndS(w3V8+Q&#J=g~^bE11*kX4%0$*k_;6(?<2had@+ zCw1ORG}x`obXo2~ixQsShCLsZO7vX|<}#g}HciZ7#^}1~vKqmqIvDDZwKkb;)4Xcn z5E>;jFokJu228c@6(Qx?=3$(&8EdO%djZpM4jPg=K19xx@Qr8%gVF{zN4D87n5|$J zxsn<4mz^k6J|B$!8hiYD$VL26ag0bC9%a6UW1pgq<7_N-{t$Q#Sy4aNQ@=1%Ry!U7 zCF46A-w&GK_}GMx*tM*x$bV{^Rwnb)=JMb%Zz_Un{`EI(=y&6$2tr*>l|4Wbr z?B$YzzayaoVa;~bP>(c~WLg8T$ZJ_IKMfsm(nOwqD0&@?VC49z=tz0&4|>H=E0qF~ zFZ-|?zP)$|)Jm0B&0>MEs94W1I3t+e4zLd2V{)LGBT=#3t7>pof{S8*L|#1(F% z$quh$Z}__cK+G*-_ovixDbl4Lfd`ret@NVDpxZC^yX^aL{&R3DDqcP84nN}r9d{p_ zu|PJVUDK{AARZ^_fCpl+gW__jhwUTA{#)$2#a<=I5%g0eKj_NMN<+MmXn|nYRZA-9 zN1?gWvCfrDVyj2?9K<2QIFnkQw2?&|y8{&%Z$9hcJ&{cs@EtEhmg(fyvk)GV%I_LN zB$l6@NRTMi?sih^@r0+f(UpK6@y~Q8MJ4Aq)^h0PYrWxM+e5tVY|2I0MM^OI# zXnS?ki29{__|S%_I@-eQ(O1E2kQCJf&{^~A2%yvFeWS0^y#6}K9T+@d+2V)TVdZkr zjg)~dfau;0=8!sD$qi-ZlhOSI>gfx2;i2|$Ke*I+Grrlt0$hs~p+;B;uY-l~G2d5V zQICBSXzL`jhR=eHw-k7S`g#pJ+2H|}-=(npj<&w7grBx;f~O~uG4um(QYHF6{@*U7 z6w`M&Y&>Fg5?)N~{fsQO(%G zyn*!^dk%!q_uYfK2&_@W;&Ar)lhUvQzf#dEauvs}mJCc{m)Ku(VLTmPoU5cOIVI{K zizjfmB1oYd5R#O%N~F!`wPFjXYV|x#V%gn}7OZC%_Rr_&!XjKT0!6DOA6mssBQWE# z5lq-^f|NIqCE6lftT2E>k$|MV5TD2PQ|(~w1e2xMq4*rW=wL2GxTwfE#&`;5W|Rdd zQBG3looHU#!fB8<^O!tC|Hd#@h9QY2g_bgmjbS!1j0+efX_})rPYPX)54ZN4!*D6* zv+W+ocK=ziH(BmhV~S@xrlRoS4SYLC^uO2kZTqPI9oE8_(`Goi+wWHB(1w=F+&JVw z>S^D69sHvNzJ#=TRpZm2=?(nH6L30-nHIVfzS^u{nq47vxtdPN_%hWth6HC|t_f2i zY~6%rU9h!=5~YV_73S9Nqm;9t*m&W~(u#7^i!d2d+Q|5p=`5H=}a^)3Z5J=si;K9dwJ}3sgJHmCVO|SR7%4MNCy94%Cn8NB2@P zHTGK!$DyI%-cj1Do4_Jy+U~H7`wcjI{5zc8_0XuaN({2RK#Dv(Z070mDW*V^Y1ftTCbxb50inIU#FA4hW|*sPQrL5 zWG$OW{|X7+1g)f>X-}l)L@;i~97_8E>Q5%^l+|76S_CwK_O}Q_o4m?)+4r`e`~0&lsH)XYIT-q9YjzLJVOMa-gB~Q2Me!u zY#}6*LM2j32l+9gP&*>{3Po5Jh#OJ8K41jN)$0y#J`4!#(ZIV1y+z^%!o{NE_yq0o zo-C3!tD$dyA_c#L5AVE^9RK^SYi_jr-(@rv#|Kid7B1!UmMYCo>Qc&Y-(69jz7$Qe zAN`4f)9}PW$oI+&+)eqq@5^+V0rvRuPyb|Hcpk${?ZrhFX*2e<;a-y^wrXs;!2Q*g zj5m#WP->*r<2KR))CdAH-+KGRzPQAuNj!qxakS1C7|Fm;28j+pJ_avgK|jYLf)sil z194nfU70S0c4P8RHX01t32QS~qCa7AoUXM5KnQzn^bw8}2og1Ol!N^t_>MCuiYIBL zBXur;ds4SwOo+s8e>M^mMd;-Z zQzcXDS;P<WM$?N&dr{KAr&z@iH-@;Rj~f#KZY--&ys_6X z0K(Z4m;%5`bm>Q2C8&S~ppPptTrLb8pVXSi*>KOnW4$2~o1wEXchmNc=#y~IJe2mf z6G+KPBoAebzRVmE#ts1ofpT*m_TxOrM#@s?GDI4ifq%S?(OWq6(GpT@`+)6)egk7R zV}6k2Vek&iqt0mlsDA>j#?g&QfdlE(-sEdat^Ta|H@k5hewJSB*48+w*P`BQ{wM?p_oPO{ zMHIMjm*m2}Wa>`COC|_i9;kO+i!N3iuSfw}Sf;bGpoOhdp!iiQ>IaIt9j76e6ueFw zz_5og4Xd4OFC=Y%gn+n^6%iaUo4SLq{NZ4t&7g!sasbin1I`*K-J!oO}Y_ z=-yq&-lqRWk*z~yr|W5X2WwuFBUw=RQ1WQZG=v$WQ;wN_Kpx{`CL)l7ZW?VPL^Fm) zcg?Q3?pQ{iw+5iIk$eO1Ejk~aFS5!tPhPva=7p|=x_mF11Jx$0g|49O=Q`{IOlvNv zWsriWhw*{aGxlOUREN)BF*mvkB?n)Rn_pA$^@RS#?}!3-8Q;VzaHp;Yikp5{6o$*} z+t82sJu2|_EYJ`$(;ylR(F1Hhu&m-@?Px|a1^`oKsTlv0Mw~I6bTXrvo`Md}9`He?_KtWd{eSx0 zA43%;oTu<~VF-oMN`LBD|k(Hk?Ruo)0kxv&gQZ2r*S+bxRNqy z3|?3r^O4H~puT2MYhCqQTg44C=T7 z-+2zy)L1Jzx2-=w1uD{iVnF+&gsP;DfEz;?Cky-%u8Gr1x-gHOO_fdK1GRU!U8i1w z5{=a(wt}NrxZ4fATCCUwz*KBJeC($G@GZV+T%;?!CY7vqQcT=O)lU&Vp`nugrmJy^;|2e@F){-(+7H)NU+~@0_U%03jw2X7P8WO)Olkcq zQ(E6d7~d@gyJO|h&uHz1FHGqgx;hvgO0)Mux9dkS>qfJ!&hn!a$|i|9Qt}H>Dn(y!6$%X zd3c}YK??pS`C)_M*V$nB73M7rEHZNh)KO<{2h(n)P{y$S%@lkobQDF0EK;v;pb4H@*< zFq6&=bW$1cA|&+`3}}H96R@4Xg>r0gV73%`<6VOTE5U&;;mb8|DLC*6(xD^xlzKep zp7bK&Cu3hj!cE@KM0#R15C~)t5DG*7nWYr_4!%r};8xf+>CHK`j95Z%b<9h=k;rfw zlUZY=K2|D(&Vk?I9-a53P#cMrPx0@Rx2MznWn=eo(?0ES?jA$+3gQI)B<%6Rv76g3 zNV&Nk!Gv;JcE(eIcPGXLxq!)-;1`%unF;uDy#I)w3vdMQgZL?c59573#AOBGYP`u_ zeih&r@KnWxg7Ea01>pf)hf#^&w=TwgSj201XP<}LLa>9W7{5{Mo_vE0*T;FNw&=;{ zFP0Vp4Lmv~_8_V3G4PardW>(HU8Dy|WRKylf2O=nwP2B09gif zHF$^P$^dcPZAj`x%(V}Yl|jbvYrr3J6r_Mq=*zQ$Uw6+z6nrFlYv{Y-7-^ zfOs7L2?zy?ux*%e;bFS~@p!XQ7?(2F0zf>(1{3#l6E}#Cj8pkA%h=mH5kqfIWf~w( z`D#Esr9U-sj{xG7i%{fN7Te2!E@My?xP_-aXhOdS#7mNP9Op5AS7WM}$MH=-Jm*^g z@vy^yc+M|Fb@JFA1H{8V1BlaGk7W`&qxU%=NHUbme_)Rtcl|RUjw7DrP%R*g;NY(h z&dGXpjix})^-JhRs-Ut_8=hq!QY+JjMDubAYQBQ z0OGNAq2PIm{}B)mQG-I}uHS`s4%w^*l^XzYDw_fEuof@|_jffA9BKuW&r*2fOz}(i3$A$ z5U-CiFcpvOHb9(muZbHrp~*-lcbyH0hX8r~Ry~UeWdZ`5!?+{c#GxtZ{=m+wFXEG$EJis+c&B300V`02n>KtC=WU znC#||ks}L}-yBCd;*gOei`#V}3yPd#iLb3ZWD&k`n$`S~6G zQ*Rr`^a4YDZXB~880vXBCUO6o2$yt`dgNw6@#i1gCmauNK&ktL*BegeJ8{1nvXAsE z!GDsI@h5ek@WXICGwwl$hV}PEyic`H_-H~XUWRE@4En<{lT$F~r(mX=7^5z(PQfTC znA95wZ%y%YR|=*(1+ysy^Sczx&J@h+DVRekn2{7rHZK&Ekdf2NQ!v*iVaC5zf(*3y zW6)7kFq={^krd3|vupbElu(!RW~S%DiLaDB(&i4-y4srCtJeB`x30y8;i?+GXSP|; zfyKDXLf-&u2!N_p_05edd^L4d^=sfOG1RQa6-~ZbR|DfRuhNn3&0#fod!plsKysjczpr9+_;?q+13nrdrm>sx9Qd?47^ zDD+z#6E0#TQjO+zZ}SdDR=~RNRLcCO$FWtIP}D0|tXb7szsgrPW-q-?v2{g#VpdX_ zqN%o_o-Ut>^Hh9yKFfF&OM<~&lnI_D?519`wzZ*l)vdLwQO`U{Df_8w8fsTGC6v@@ zZ>~&Dp?}R6rO`Y=z`v$`ow1|Zisy8@s^=EyS6QMKIjrLM?16D#wdO>Q>J0>E0{&)4fMA^_osIr_e(h;y+WnP;OG5HoDPt zUBZDU@NodY&q%FHc*ff^KNV^F6I4n%lZBoV{KnfePrBh@s3Dgiuk;W%6Ss`VRaQN( z%%kpavC{rt1aUnn;vbgUY*xNtp>D&j;v(9DY@ILq?O2J2<;#fZzlhm^>wfmZxRnCq zT0LXVl)F5I+1k z5^T?e`W*LS-=`X$aO^&#r=KrR*XZm~!ni6zeW`6;zCueLI7l05Z@Xp|PF-c0zcx(? ze*->Xx!rcBnD4)_%>lRDnA`PmyBTf>*LH`PFNFd~3=4bhcwwc`$K>w73i4OsUJy~Q zM#|Zl^;F1tGFjeZF^ca*T>w=crceS=!m8^=z&~H!>E7+yZ}2)X7g+m z75Il;cK{;}oV2h9@$!1cf|PHfH?S@z%{K*$H`pddY;nu-*kn*pG$;0oVTX>I!ESK` zKH)wm zIw3j|38HU5m?z9+gt{9$2f96CWb}XswN=e6p0?6x7)s_a7K(8Q(p&7Dc0bp%jiof*oWXFH+re#wqAs z6sI@g6ka|IaFrv3tj%B5V58tIx(i6jdZtGs0*=#N*QN+Jhz z$N5>^Yp^o0=q$#@Fmix7|1vN-%9U|9-d{x=MhjD4Gnn`|XY34w)h%7XD%cz`8CP`c ztW5RAQ&g~f!5mDnNk8g6_FA$#lRru#gTn^t8j^B}TuzJRMEsm_Ii26@rjQ)M`MucI z$0Mac>>L4dG36)tf4oux*X!kdeAJ&6?{DMG9;9N3-w)SFtNFAi(4%fISD!~YEhBf@ zr{*e%u%aa)Kw_hsN^>Q-;(Z&vsqEHJiC6Qq(DzC$UBP+WF54B_b0&&=HwW6`OaNX3MSh^ z>6Bdi%wV`1>S?Yf{TFPg(VpDuZfr-{x~F_)4(_@*c90TY$XZeKP{#k)+4Y7CyIR)1VR z#D8sSWoz)yKHZ!)km}Ab(c#vldfeD}LoWVteR%N}*xDj^o+gf_yj$pL)1f3fM~<8N zIYz5*WMoz;qbA0!7niu@!bPaEVHAs+A)@)o#ri1x@2K=uH01$q8WvgdUp za|pkGjv_w>sRExseg?u-)d}S9&62&ax&P(in-Qa>J@QMCv%uW*@;tuNOaQM${VkZ( zw?g(n#vornu0!sHt_QLl*iZlUmo)ou86<7~D&+K%PHe>I{RZvA=W>G%D)$Nymat*> zwxZ)e5^)+=?t*fAF(}(`lumr5=pOh%xL!rvvGD<8mxMPYUUnRjiYBy*AsL7xq z)eft63`ok}0FqeNo$%H}rUZXU_^?4`AdZN1q6#FjqHlm6G2HJ!OANXjy}8Pu^+3%A zJ)_*qijFBdujnsD3*Z;2r3Cb-spTAywC^XN7Q>}59v(BO4QRDNTY;pdJCu73=y9Vx z1+>PXMHoL)UmoZQ!yN&V`fkH0YBk&{AgON~kZ31?)*9_jj5I;-0CgDdV?{VLkvQ2! z`7RvEF3JlHYEbQ5MI2$GHqUA3Lc zbt&prZI5zW6m3;)pK>`x1FFp{S5oAuc1XG1iuS1XfO0P?8dmM7a<3|SUA1p0S5-8o z+M~)HS9C(PCzbn1(I={{DR)}YS=D~2+=Qa9Rr{@S-zl0>?f1%EQFK+c*OdEB(Vwcl zt{f*g@iZnE>-|~EH7Meb-4>!09s#zjL^4@cBAJ33R6AGE?TY3pny;u)(PBmM^+;LM z%fcd@{58U40x=o1aJt0jXbEC$i~;ZI(Fn5vM^$CG+}@U{I3UdR$~8ZYqZ%Zrhpm~4 zFuQS7#Zx!1IRb`rWWc-&rWI8N%;#Wg5oVG$>9EbuU^sUMrEaiPgrSe7BFueYIGYBg z_*bkSl|{3V7}Mj-8rV3ri7?NB;Vc{290tR=HelYO&8#r)qKrMSr>KPLwEhC;++}>MpoSfK21BK?O;@EIo zCYM8ut^#YX*OYckQm9@LW&8il+*gRX4IyrG3$`hipp`vA#E?-~^i?>ZnJqgR&t9-C z&9)Xxo?DDsveIejNHo^gkjZA9lI;P%(t$xQSKJY;G7{eP4H4yzv@jBK6(hE=;^Z|5 zY>S#uYRIb+qTak|?IsWL^udzdjM~gJPQP2|cFJxsXIYr7LnyQmG3zMgB1SB_!SQ;K z*<$Dw`gPmRLPj~afc7Cuo~gH?Pb|k^xxZ_+@t-sn)$w9Nm4&12)_-Cu7j3IUkMJ1& zv4mU9dijWntvWFAJ*VA-E9=TsypD3Y=r_}P(w@=xp&VxO#flR-1-lyV>nYks;CQ2x ZeRh4hxLw<6yw=+b)%x})E1Phm`~zg;evJSC literal 0 HcmV?d00001 diff --git a/vendor/ENet/list.odin b/vendor/ENet/list.odin new file mode 100644 index 000000000..891f734df --- /dev/null +++ b/vendor/ENet/list.odin @@ -0,0 +1,10 @@ +package ENet + +ListNode :: struct { + next: ^ListNode, + previous: ^ListNode, +} + +List :: struct { + sentinel: ListNode, +} \ No newline at end of file diff --git a/vendor/ENet/protocol.odin b/vendor/ENet/protocol.odin new file mode 100644 index 000000000..e6cef3e4e --- /dev/null +++ b/vendor/ENet/protocol.odin @@ -0,0 +1,164 @@ +package ENet + +PROTOCOL_MINIMUM_MTU :: 576 +PROTOCOL_MAXIMUM_MTU :: 4096 +PROTOCOL_MAXIMUM_PACKET_COMMANDS :: 32 +PROTOCOL_MINIMUM_WINDOW_SIZE :: 4096 +PROTOCOL_MAXIMUM_WINDOW_SIZE :: 65536 +PROTOCOL_MINIMUM_CHANNEL_COUNT :: 1 +PROTOCOL_MAXIMUM_CHANNEL_COUNT :: 255 +PROTOCOL_MAXIMUM_PEER_ID :: 0xFFF +PROTOCOL_MAXIMUM_FRAGMENT_COUNT :: 1024 * 1024 + +ProtocolCommand :: enum i32 { + NONE = 0, + ACKNOWLEDGE = 1, + CONNECT = 2, + VERIFY_CONNECT = 3, + DISCONNECT = 4, + PING = 5, + SEND_RELIABLE = 6, + SEND_UNRELIABLE = 7, + SEND_FRAGMENT = 8, + SEND_UNSEQUENCED = 9, + BANDWIDTH_LIMIT = 10, + THROTTLE_CONFIGURE = 11, + SEND_UNRELIABLE_FRAGMENT = 12, + COUNT = 13, + MASK = 0x0F, +} + +ProtocolFlag :: enum i32 { + COMMAND_ACKNOWLEDGE = 1 << 7, + COMMAND_UNSEQUENCED = 1 << 6, + HEADER_COMPRESSED = 1 << 14, + HEADER_SENT_TIME = 1 << 15, + HEADER_MASK = HEADER_COMPRESSED | HEADER_SENT_TIME, + HEADER_SESSION_MASK = 3 << 12, + HEADER_SESSION_SHIFT = 12, +} + +ProtocolHeader :: struct #packed { + peerID: u16, + sentTime: u16, +} + +ProtocolCommandHeader :: struct #packed { + command: u8, + channelID: u8, + reliableSequenceNumber: u16, +} + +ProtocolAcknowledge :: struct #packed { + header: ProtocolCommandHeader, + outgoingPeerID: u16, + incomingSessionID: u8, + outgoingSessionID: u8, + mtu: u32, + windowSize: u32, + channelCount: u32, + incomingBandwidth: u32, + outgoingBandwidth: u32, + packetThrottleInterval: u32, + packetThrottleAcceleration: u32, + packetThrottleDeceleration: u32, + connectID: u32, + data: u32, +} + +ProtocolConnect :: struct #packed { + header: ProtocolCommandHeader, + outgoingPeerID: u16, + incomingSessionID: u8, + outgoingSessionID: u8, + mtu: u32, + windowSize: u32, + channelCount: u32, + incomingBandwidth: u32, + outgoingBandwidth: u32, + packetThrottleInterval: u32, + packetThrottleAcceleration: u32, + packetThrottleDeceleration: u32, + connectID: u32, + data: u32, +} + +ProtocolVerifyConnect :: struct #packed { + header: ProtocolCommandHeader, + outgoingPeerID: u16, + incomingSessionID: u8, + outgoingSessionID: u8, + mtu: u32, + windowSize: u32, + channelCount: u32, + incomingBandwidth: u32, + outgoingBandwidth: u32, + packetThrottleInterval: u32, + packetThrottleAcceleration: u32, + packetThrottleDeceleration: u32, + connectID: u32, +} + +ProtocolBandwidthLimit :: struct #packed { + header: ProtocolCommandHeader, + incomingBandwidth: u32, + outgoingBandwidth: u32, +} + +ProtocolThrottleConfigure :: struct #packed { + header: ProtocolCommandHeader, + packetThrottleInterval: u32, + packetThrottleAcceleration: u32, + packetThrottleDeceleration: u32, +} + +ProtocolDisconnect :: struct #packed { + header: ProtocolCommandHeader, + data: u32, +} + +ProtocolPing :: struct #packed { + header: ProtocolCommandHeader, +} + +ProtocolSendReliable :: struct #packed { + header: ProtocolCommandHeader, + dataLength: u16, +} + +ProtocolSendUnreliable :: struct #packed { + header: ProtocolCommandHeader, + unreliableSequenceNumber: u16, + dataLength: u16, +} + +ProtocolSendUnsequenced :: struct #packed { + header: ProtocolCommandHeader, + unsequencedGroup: u16, + dataLength: u16, +} + +ProtocolSendFragment :: struct #packed { + header: ProtocolCommandHeader, + startSequenceNumber: u16, + dataLength: u16, + fragmentCount: u32, + fragmentNumber: u32, + totalLength: u32, + fragmentOffset: u32, +} + +Protocol :: struct #raw_union { + header: ProtocolCommandHeader, + acknowledge: ProtocolAcknowledge, + connect: ProtocolConnect, + verifyConnect: ProtocolVerifyConnect, + disconnect: ProtocolDisconnect, + ping: ProtocolPing, + sendReliable: ProtocolSendReliable, + sendUnreliable: ProtocolSendUnreliable, + sendUnsequenced: ProtocolSendUnsequenced, + sendFragment: ProtocolSendFragment, + bandwidthLimit: ProtocolBandwidthLimit, + throttleConfigure: ProtocolThrottleConfigure, +} \ No newline at end of file diff --git a/vendor/ENet/time.odin b/vendor/ENet/time.odin new file mode 100644 index 000000000..87cef0bec --- /dev/null +++ b/vendor/ENet/time.odin @@ -0,0 +1,23 @@ +package ENet + +TIME_OVERFLOW :: u32(86400000) + +TIME_LESS :: #force_inline proc(a, b: u32) -> bool { + return a - b >= TIME_OVERFLOW +} + +TIME_GREATER :: #force_inline proc(a, b: u32) -> bool { + return b - a >= TIME_OVERFLOW +} + +TIME_LESS_EQUAL :: #force_inline proc(a, b: u32) -> bool { + return !TIME_GREATER(a, b) +} + +TIME_GREATER_EQUAL :: #force_inline proc(a, b: u32) -> bool { + return TIME_LESS(a, b) +} + +TIME_DIFFERENCE :: #force_inline proc(a, b: u32) -> u32 { + return a - b >= TIME_OVERFLOW ? b - a : a - b +} \ No newline at end of file diff --git a/vendor/ENet/unix.odin b/vendor/ENet/unix.odin new file mode 100644 index 000000000..ea6b84199 --- /dev/null +++ b/vendor/ENet/unix.odin @@ -0,0 +1,59 @@ +//+build linux, darwin, freebsd +package ENet + +// When we implement the appropriate bindings for Unix, the section separated +// by `{` and `}` here can be removed in favor of using the bindings. +// { +import "core:c" + +@(private="file") FD_SETSIZE :: 1024 + +@(private="file") fd_set :: struct { + fds_bits: [FD_SETSIZE / 8 / size_of(c.long)]c.ulong, +} + +@(private="file") FD_ZERO :: #force_inline proc(s: ^fd_set) { + for i := size_of(fd_set) / size_of(c.long); i != 0; i -= 1 { + s.fds_bits[i] = 0; + } +} + +@(private="file") FD_SET :: #force_inline proc(d: i32, s: ^fd_set) { + s.fds_bits[d / (8 * size_of(c.long))] |= c.ulong(1) << (c.ulong(d) % (8 * size_of(c.ulong))) +} + +@(private="file") FD_CLR :: #force_inline proc(d: i32, s: ^fd_set) { + s.fds_bits[d / (8 * size_of(c.long))] &= ~(c.ulong(1) << (c.ulong(d) % (8 * size_of(c.ulong)))) +} + +@(private="file") FD_ISSET :: #force_inline proc(d: i32, s: ^fd_set) -> bool { + return (s.fds_bits[d / (8 * size_of(c.long))] & c.ulong(1) << (c.ulong(d) % (8 * size_of(c.ulong)))) != 0 +} +// } + +Socket :: distinct i32 + +SOCKET_NULL :: Socket(-1) + +Buffer :: struct { + data: rawptr, + dataLength: uint, +} + +SocketSet :: distinct fd_set + +SOCKETSET_EMPTY :: #force_inline proc(sockset: ^SocketSet) { + FD_ZERO(cast(^fd_set)sockset) +} + +SOCKETSET_ADD :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_SET(i32(socket), cast(^fd_set)sockset) +} + +SOCKETSET_REMOVE :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_CLR(i32(socket), cast(^fd_set)sockset) +} + +SOCKSET_CHECK :: #force_inline proc(sockset: ^SocketSet, socket: Socket) -> bool { + return FD_ISSET(i32(socket), cast(^fd_set)sockset) +} \ No newline at end of file diff --git a/vendor/ENet/win32.odin b/vendor/ENet/win32.odin new file mode 100644 index 000000000..5f07a895f --- /dev/null +++ b/vendor/ENet/win32.odin @@ -0,0 +1,81 @@ +//+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 WinSock2 import "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") fs_set :: struct { + fd_count: u32, + fd_array: [FD_SETSIZE]SOCKET, +} + +@(private="file") FD_CLR :: proc(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(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 do return + s.fd_array[s.fd_count] = fd + s.fd_count += 1 +} + +@(private="file") FD_ZERO proc #force_inline (s: ^fd_set) { + s.fd_count = 0 +} + +@(private="file") FD_ISSET proc #force_inline (fd: SOCKET, s: ^fd_set) -> bool { + return __WSAFDIsSet(fd, s) != 0 +} +// } + +Socket :: distinct Socket + +SOCKET_NULL :: Socket(~0) + +Buffer :: struct { + data: rawptr, + dataLength: uint, +} + +SocketSet :: distinct fd_set + +SOCKETSET_EMPTY :: #force_inline proc(sockset: ^SocketSet) { + FD_ZERO(cast(^fd_set)sockset) +} + +SOCKETSET_ADD :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_SET(i32(socket), cast(^fd_set)sockset) +} + +SOCKETSET_REMOVE :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_CLR(i32(socket), cast(^fd_set)sockset) +} + +SOCKSET_CHECK :: #force_inline proc(sockset: ^SocketSet, socket: Socket) -> bool { + return FD_ISSET(i32(socket), cast(^fd_set)sockset) +} \ No newline at end of file