endian.odin 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package encoding_endian
  2. Byte_Order :: enum u8 {
  3. Little,
  4. Big,
  5. }
  6. PLATFORM_BYTE_ORDER :: Byte_Order.Little when ODIN_ENDIAN == .Little else Byte_Order.Big
  7. get_u16 :: proc(b: []byte, order: Byte_Order) -> (v: u16, ok: bool) {
  8. if len(b) < 2 {
  9. return 0, false
  10. }
  11. #no_bounds_check if order == .Little {
  12. v = u16(b[0]) | u16(b[1])<<8
  13. } else {
  14. v = u16(b[1]) | u16(b[0])<<8
  15. }
  16. return v, true
  17. }
  18. get_u32 :: proc(b: []byte, order: Byte_Order) -> (v: u32, ok: bool) {
  19. if len(b) < 4 {
  20. return 0, false
  21. }
  22. #no_bounds_check if order == .Little {
  23. v = u32(b[0]) | u32(b[1])<<8 | u32(b[2])<<16 | u32(b[3])<<24
  24. } else {
  25. v = u32(b[3]) | u32(b[2])<<8 | u32(b[1])<<16 | u32(b[0])<<24
  26. }
  27. return v, true
  28. }
  29. get_u64 :: proc(b: []byte, order: Byte_Order) -> (v: u64, ok: bool) {
  30. if len(b) < 8 {
  31. return 0, false
  32. }
  33. #no_bounds_check if order == .Little {
  34. v = u64(b[0]) | u64(b[1])<<8 | u64(b[2])<<16 | u64(b[3])<<24 |
  35. u64(b[4])<<32 | u64(b[5])<<40 | u64(b[6])<<48 | u64(b[7])<<56
  36. } else {
  37. v = u64(b[7]) | u64(b[6])<<8 | u64(b[5])<<16 | u64(b[4])<<24 |
  38. u64(b[3])<<32 | u64(b[2])<<40 | u64(b[1])<<48 | u64(b[0])<<56
  39. }
  40. return v, true
  41. }
  42. get_i16 :: proc(b: []byte, order: Byte_Order) -> (i16, bool) {
  43. v, ok := get_u16(b, order)
  44. return i16(v), ok
  45. }
  46. get_i32 :: proc(b: []byte, order: Byte_Order) -> (i32, bool) {
  47. v, ok := get_u32(b, order)
  48. return i32(v), ok
  49. }
  50. get_i64 :: proc(b: []byte, order: Byte_Order) -> (i64, bool) {
  51. v, ok := get_u64(b, order)
  52. return i64(v), ok
  53. }
  54. get_f16 :: proc(b: []byte, order: Byte_Order) -> (f16, bool) {
  55. v, ok := get_u16(b, order)
  56. return transmute(f16)v, ok
  57. }
  58. get_f32 :: proc(b: []byte, order: Byte_Order) -> (f32, bool) {
  59. v, ok := get_u32(b, order)
  60. return transmute(f32)v, ok
  61. }
  62. get_f64 :: proc(b: []byte, order: Byte_Order) -> (f64, bool) {
  63. v, ok := get_u64(b, order)
  64. return transmute(f64)v, ok
  65. }
  66. put_u16 :: proc(b: []byte, order: Byte_Order, v: u16) -> bool {
  67. if len(b) < 2 {
  68. return false
  69. }
  70. #no_bounds_check if order == .Little {
  71. b[0] = byte(v)
  72. b[1] = byte(v >> 8)
  73. } else {
  74. b[0] = byte(v >> 8)
  75. b[1] = byte(v)
  76. }
  77. return true
  78. }
  79. put_u32 :: proc(b: []byte, order: Byte_Order, v: u32) -> bool {
  80. if len(b) < 4 {
  81. return false
  82. }
  83. #no_bounds_check if order == .Little {
  84. b[0] = byte(v)
  85. b[1] = byte(v >> 8)
  86. b[2] = byte(v >> 16)
  87. b[3] = byte(v >> 24)
  88. } else {
  89. b[0] = byte(v >> 24)
  90. b[1] = byte(v >> 16)
  91. b[2] = byte(v >> 8)
  92. b[3] = byte(v)
  93. }
  94. return true
  95. }
  96. put_u64 :: proc(b: []byte, order: Byte_Order, v: u64) -> bool {
  97. if len(b) < 8 {
  98. return false
  99. }
  100. #no_bounds_check if order == .Little {
  101. b[0] = byte(v >> 0)
  102. b[1] = byte(v >> 8)
  103. b[2] = byte(v >> 16)
  104. b[3] = byte(v >> 24)
  105. b[4] = byte(v >> 32)
  106. b[5] = byte(v >> 40)
  107. b[6] = byte(v >> 48)
  108. b[7] = byte(v >> 56)
  109. } else {
  110. b[0] = byte(v >> 56)
  111. b[1] = byte(v >> 48)
  112. b[2] = byte(v >> 40)
  113. b[3] = byte(v >> 32)
  114. b[4] = byte(v >> 24)
  115. b[5] = byte(v >> 16)
  116. b[6] = byte(v >> 8)
  117. b[7] = byte(v)
  118. }
  119. return true
  120. }
  121. put_i16 :: proc(b: []byte, order: Byte_Order, v: i16) -> bool {
  122. return put_u16(b, order, u16(v))
  123. }
  124. put_i32 :: proc(b: []byte, order: Byte_Order, v: i32) -> bool {
  125. return put_u32(b, order, u32(v))
  126. }
  127. put_i64 :: proc(b: []byte, order: Byte_Order, v: i64) -> bool {
  128. return put_u64(b, order, u64(v))
  129. }
  130. put_f16 :: proc(b: []byte, order: Byte_Order, v: f16) -> bool {
  131. return put_u16(b, order, transmute(u16)v)
  132. }
  133. put_f32 :: proc(b: []byte, order: Byte_Order, v: f32) -> bool {
  134. return put_u32(b, order, transmute(u32)v)
  135. }
  136. put_f64 :: proc(b: []byte, order: Byte_Order, v: f64) -> bool {
  137. return put_u64(b, order, transmute(u64)v)
  138. }