An unofficial collection of APIs used in FreeJam games and mods
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
4.3KB

  1. use std::io::{Read, Write};
  2. use crate::techblox::Parsable;
  3. use half::f16;
  4. // reading
  5. pub fn parse_header_u32(reader: &mut dyn Read) -> std::io::Result<u32> {
  6. // this is possibly wrong
  7. let mut u32_buf = [0; 4];
  8. //u32_buf[3] = parse_u8(reader)?;
  9. //u32_buf[2] = parse_u8(reader)?;
  10. //u32_buf[1] = parse_u8(reader)?;
  11. //u32_buf[0] = parse_u8(reader)?;
  12. reader.read(&mut u32_buf)?;
  13. Ok(u32::from_le_bytes(u32_buf))
  14. }
  15. pub fn parse_u8(reader: &mut dyn Read) -> std::io::Result<u8> {
  16. let mut u8_buf = [0; 1];
  17. reader.read(&mut u8_buf)?;
  18. Ok(u8_buf[0])
  19. }
  20. pub fn parse_u32(reader: &mut dyn Read) -> std::io::Result<u32> {
  21. let mut u32_buf = [0; 4];
  22. reader.read(&mut u32_buf)?;
  23. Ok(u32::from_le_bytes(u32_buf))
  24. }
  25. pub fn parse_i32(reader: &mut dyn Read) -> std::io::Result<i32> {
  26. let mut i32_buf = [0; 4];
  27. reader.read(&mut i32_buf)?;
  28. Ok(i32::from_le_bytes(i32_buf))
  29. }
  30. pub fn parse_u64(reader: &mut dyn Read) -> std::io::Result<u64> {
  31. let mut u64_buf = [0; 8];
  32. reader.read(&mut u64_buf)?;
  33. Ok(u64::from_le_bytes(u64_buf))
  34. }
  35. pub fn parse_i64(reader: &mut dyn Read) -> std::io::Result<i64> {
  36. let mut i64_buf = [0; 8];
  37. reader.read(&mut i64_buf)?;
  38. Ok(i64::from_le_bytes(i64_buf))
  39. }
  40. pub fn parse_f32(reader: &mut dyn Read) -> std::io::Result<f32> {
  41. let mut f32_buf = [0; 4];
  42. reader.read(&mut f32_buf)?;
  43. Ok(f32::from_le_bytes(f32_buf))
  44. }
  45. // writing
  46. pub fn dump_u8(data: u8, writer: &mut dyn Write) -> std::io::Result<usize> {
  47. writer.write(&data.to_le_bytes())
  48. }
  49. pub fn dump_u32(data: u32, writer: &mut dyn Write) -> std::io::Result<usize> {
  50. writer.write(&data.to_le_bytes())
  51. }
  52. pub fn dump_i32(data: i32, writer: &mut dyn Write) -> std::io::Result<usize> {
  53. writer.write(&data.to_le_bytes())
  54. }
  55. pub fn dump_u64(data: u64, writer: &mut dyn Write) -> std::io::Result<usize> {
  56. writer.write(&data.to_le_bytes())
  57. }
  58. pub fn dump_i64(data: i64, writer: &mut dyn Write) -> std::io::Result<usize> {
  59. writer.write(&data.to_le_bytes())
  60. }
  61. pub fn dump_f32(data: f32, writer: &mut dyn Write) -> std::io::Result<usize> {
  62. writer.write(&data.to_le_bytes())
  63. }
  64. // trait implementations
  65. impl Parsable for u8 {
  66. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  67. let mut buf = [0; 1];
  68. reader.read(&mut buf)?;
  69. Ok(Self::from_le_bytes(buf))
  70. }
  71. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  72. writer.write(&self.to_le_bytes())
  73. }
  74. }
  75. impl Parsable for u32 {
  76. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  77. let mut buf = [0; 4];
  78. reader.read(&mut buf)?;
  79. Ok(Self::from_le_bytes(buf))
  80. }
  81. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  82. writer.write(&self.to_le_bytes())
  83. }
  84. }
  85. impl Parsable for i32 {
  86. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  87. let mut buf = [0; 4];
  88. reader.read(&mut buf)?;
  89. Ok(Self::from_le_bytes(buf))
  90. }
  91. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  92. writer.write(&self.to_le_bytes())
  93. }
  94. }
  95. impl Parsable for u64 {
  96. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  97. let mut buf = [0; 8];
  98. reader.read(&mut buf)?;
  99. Ok(Self::from_le_bytes(buf))
  100. }
  101. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  102. writer.write(&self.to_le_bytes())
  103. }
  104. }
  105. impl Parsable for i64 {
  106. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  107. let mut buf = [0; 8];
  108. reader.read(&mut buf)?;
  109. Ok(Self::from_le_bytes(buf))
  110. }
  111. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  112. writer.write(&self.to_le_bytes())
  113. }
  114. }
  115. impl Parsable for f32 {
  116. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  117. let mut buf = [0; 4];
  118. reader.read(&mut buf)?;
  119. Ok(Self::from_le_bytes(buf))
  120. }
  121. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  122. writer.write(&self.to_le_bytes())
  123. }
  124. }
  125. impl Parsable for f16 {
  126. fn parse(reader: &mut dyn Read) -> std::io::Result<Self> {
  127. let mut buf = [0; 2];
  128. reader.read(&mut buf)?;
  129. Ok(Self::from_le_bytes(buf))
  130. }
  131. fn dump(&self, writer: &mut dyn Write) -> std::io::Result<usize> {
  132. writer.write(&self.to_le_bytes())
  133. }
  134. }