win32.odin 1.9 KB

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