fix base offset calculated twice

This commit is contained in:
2025-07-20 10:36:38 +08:00
parent 106bef55f7
commit 8a36e3f6cf

View File

@@ -524,7 +524,6 @@ impl<'a, T: Iterator<Item = &'a BgiFileHeader>, R: Read + Seek + 'static> Iterat
pub struct BgiArchiveWriter<T: Write + Seek> { pub struct BgiArchiveWriter<T: Write + Seek> {
writer: T, writer: T,
file_count: u32,
headers: HashMap<String, BgiFileHeader>, headers: HashMap<String, BgiFileHeader>,
compress_file: bool, compress_file: bool,
encoding: Encoding, encoding: Encoding,
@@ -554,7 +553,6 @@ impl<T: Write + Seek> BgiArchiveWriter<T> {
} }
Ok(BgiArchiveWriter { Ok(BgiArchiveWriter {
writer, writer,
file_count: file_count as u32,
headers, headers,
compress_file: config.bgi_compress_file, compress_file: config.bgi_compress_file,
encoding, encoding,
@@ -577,7 +575,6 @@ impl<T: Write + Seek> Archive for BgiArchiveWriter<T> {
header: entry, header: entry,
writer: &mut self.writer, writer: &mut self.writer,
pos: 0, pos: 0,
base_offset: 16 + (self.file_count as u64 * 0x80),
}; };
Ok(if self.compress_file { Ok(if self.compress_file {
Box::new(BgiArchiveFileWithDsc::new(file)) Box::new(BgiArchiveFileWithDsc::new(file))
@@ -601,14 +598,12 @@ pub struct BgiArchiveFile<'a, T: Write + Seek> {
header: &'a mut BgiFileHeader, header: &'a mut BgiFileHeader,
writer: &'a mut T, writer: &'a mut T,
pos: usize, pos: usize,
base_offset: u64,
} }
impl<'a, T: Write + Seek> Write for BgiArchiveFile<'a, T> { impl<'a, T: Write + Seek> Write for BgiArchiveFile<'a, T> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.writer.seek(SeekFrom::Start( self.writer
self.base_offset + self.header.offset as u64 + self.pos as u64, .seek(SeekFrom::Start(self.header.offset as u64 + self.pos as u64))?;
))?;
let bytes_written = self.writer.write(buf)?; let bytes_written = self.writer.write(buf)?;
self.pos += bytes_written; self.pos += bytes_written;
self.header.size = self.header.size.max(self.pos as u32); self.header.size = self.header.size.max(self.pos as u32);