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.

152 lines
4.0KB

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