sdl_stdinc.odin 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package sdl2
  2. import "core:c"
  3. import "core:intrinsics"
  4. import "core:runtime"
  5. _, _ :: intrinsics, runtime
  6. when ODIN_OS == .Windows {
  7. foreign import lib "SDL2.lib"
  8. } else {
  9. foreign import lib "system:SDL2"
  10. }
  11. bool :: distinct b32
  12. #assert(size_of(bool) == size_of(c.int))
  13. FOURCC :: #force_inline proc "c" (A, B, C, D: u8) -> u32 {
  14. return u32(A) << 0 | u32(B) << 8 | u32(C) << 16 | u32(D) << 24
  15. }
  16. stack_alloc :: proc "c" ($T: typeid, #any_int count: int) -> ^T {
  17. return (^T)(intrinsics.alloca(size_of(T)*count))
  18. }
  19. stack_make :: proc "c" ($T: typeid/[]$E, #any_int count: int) -> T {
  20. ptr := (^T)(intrinsics.alloca(size_of(T)*count))
  21. return transmute(T)runtime.Raw_Slice{ptr, count}
  22. }
  23. stack_free :: proc "c" (ptr: rawptr) {}
  24. malloc_func :: proc "c" (size: c.size_t) -> rawptr
  25. calloc_func :: proc "c" (nmemb, size: c.size_t) -> rawptr
  26. realloc_func :: proc "c" (mem: rawptr, size: c.size_t) -> rawptr
  27. free_func :: proc "c" (mem: rawptr)
  28. @(default_calling_convention="c", link_prefix="SDL_")
  29. foreign lib {
  30. malloc :: proc(size: c.size_t) -> rawptr ---
  31. calloc :: proc(nmemb, size: c.size_t) -> rawptr ---
  32. realloc :: proc(mem: rawptr, size: c.size_t) -> rawptr ---
  33. free :: proc(mem: rawptr) ---
  34. GetMemoryFunctions :: proc(malloc_func: ^malloc_func,
  35. calloc_func: ^calloc_func,
  36. realloc_func: ^realloc_func,
  37. free_func: ^free_func) ---
  38. SetMemoryFunctions :: proc(malloc_func: malloc_func,
  39. calloc_func: calloc_func,
  40. realloc_func: realloc_func,
  41. free_func: free_func) -> c.int ---
  42. GetNumAllocations :: proc() -> c.int ---
  43. }
  44. @(default_calling_convention="c", link_prefix="SDL_")
  45. foreign lib {
  46. getenv :: proc(name: cstring) -> cstring ---
  47. setenv :: proc(name, value: cstring, overwrite: c.int) -> c.int ---
  48. }
  49. @(default_calling_convention="c", link_prefix="SDL_")
  50. foreign lib {
  51. isalpha :: proc(x: rune) -> bool ---
  52. isalnum :: proc(x: rune) -> bool ---
  53. isblank :: proc(x: rune) -> bool ---
  54. iscntrl :: proc(x: rune) -> bool ---
  55. isdigit :: proc(x: rune) -> bool ---
  56. isxdigit :: proc(x: rune) -> bool ---
  57. ispunct :: proc(x: rune) -> bool ---
  58. isspace :: proc(x: rune) -> bool ---
  59. isupper :: proc(x: rune) -> bool ---
  60. islower :: proc(x: rune) -> bool ---
  61. isprint :: proc(x: rune) -> bool ---
  62. isgraph :: proc(x: rune) -> bool ---
  63. toupper :: proc(x: rune) -> bool ---
  64. tolower :: proc(x: rune) -> bool ---
  65. crc32 :: proc(crc: u32, data: rawptr, len: c.size_t) -> u32 ---
  66. }
  67. M_PI :: 3.14159265358979323846264338327950288
  68. @(default_calling_convention="c", link_prefix="SDL_")
  69. foreign lib {
  70. acos :: proc(x: f64) -> f64 ---
  71. acosf :: proc(x: f32) -> f32 ---
  72. asin :: proc(x: f64) -> f64 ---
  73. asinf :: proc(x: f32) -> f32 ---
  74. atan :: proc(x: f64) -> f64 ---
  75. atanf :: proc(x: f32) -> f32 ---
  76. atan2 :: proc(x, y: f64) -> f64 ---
  77. atan2f :: proc(x, y: f32) -> f32 ---
  78. ceil :: proc(x: f64) -> f64 ---
  79. ceilf :: proc(x: f32) -> f32 ---
  80. copysign :: proc(x, y: f64) -> f64 ---
  81. copysignf :: proc(x, y: f32) -> f32 ---
  82. cos :: proc(x: f64) -> f64 ---
  83. cosf :: proc(x: f32) -> f32 ---
  84. exp :: proc(x: f64) -> f64 ---
  85. expf :: proc(x: f32) -> f32 ---
  86. fabs :: proc(x: f64) -> f64 ---
  87. fabsf :: proc(x: f32) -> f32 ---
  88. floor :: proc(x: f64) -> f64 ---
  89. floorf :: proc(x: f32) -> f32 ---
  90. trunc :: proc(x: f64) -> f64 ---
  91. truncf :: proc(x: f32) -> f32 ---
  92. fmod :: proc(x, y: f64) -> f64 ---
  93. fmodf :: proc(x, y: f32) -> f32 ---
  94. log :: proc(x: f64) -> f64 ---
  95. logf :: proc(x: f32) -> f32 ---
  96. log10 :: proc(x: f64) -> f64 ---
  97. log10f :: proc(x: f32) -> f32 ---
  98. pow :: proc(x, y: f64) -> f64 ---
  99. powf :: proc(x, y: f32) -> f32 ---
  100. round :: proc(x: f64) -> f64 ---
  101. roundf :: proc(x: f32) -> f32 ---
  102. lround :: proc(x: f64) -> c.long ---
  103. lroundf :: proc(x: f32) -> c.long ---
  104. scalbn :: proc(x: f64, n: c.int) -> f64 ---
  105. scalbnf :: proc(x: f32, n: c.int) -> f32 ---
  106. sin :: proc(x: f64) -> f64 ---
  107. sinf :: proc(x: f32) -> f32 ---
  108. sqrt :: proc(x: f64) -> f64 ---
  109. sqrtf :: proc(x: f32) -> f32 ---
  110. tan :: proc(x: f64) -> f64 ---
  111. tanf :: proc(x: f32) -> f32 ---
  112. }
  113. /* The SDL implementation of iconv() returns these error codes */
  114. ICONV_ERROR :: ~c.size_t(0) // (size_t)-1
  115. ICONV_E2BIG :: ~c.size_t(1) // (size_t)-2
  116. ICONV_EILSEQ :: ~c.size_t(2) // (size_t)-3
  117. ICONV_EINVAL :: ~c.size_t(3) // (size_t)-4
  118. /* SDL_iconv_* are now always real symbols/types, not macros or inlined. */
  119. iconv_t :: distinct rawptr
  120. @(default_calling_convention="c", link_prefix="SDL_")
  121. foreign lib {
  122. iconv_open :: proc(tocode, fromcode: cstring) -> iconv_t ---
  123. iconv_close :: proc(cd: iconv_t) -> c.int ---
  124. iconv :: proc(cd: iconv_t, inbuf: ^cstring, inbytesleft: ^c.size_t, outbuf: ^[^]u8, outbytesleft: ^c.size_t) -> c.size_t ---
  125. iconv_string :: proc(tocode, fromcode, inbuf: cstring, inbytesleft: c.size_t) -> [^]u8 ---
  126. }
  127. iconv_utf8_locale :: proc "c" (s: string) -> cstring {
  128. return cast(cstring)iconv_string("", "UTF-8", cstring(raw_data(s)), len(s)+1)
  129. }
  130. iconv_utf8_utf16 :: iconv_utf8_ucs2
  131. iconv_utf8_ucs2 :: proc "c" (s: string) -> [^]u16 {
  132. return cast([^]u16)iconv_string("UCS-2-INTERNAL", "UTF-8", cstring(raw_data(s)), len(s)+1)
  133. }
  134. #assert(size_of(rune) == size_of(c.int))
  135. iconv_utf8_utf32 :: iconv_utf8_ucs4
  136. iconv_utf8_ucs4 :: proc "c" (s: string) -> [^]rune {
  137. return cast([^]rune)iconv_string("UCS-4-INTERNAL", "UTF-8", cstring(raw_data(s)), len(s)+1)
  138. }