This commit is contained in:
Pyrex 2025-04-25 21:50:29 -07:00
parent 941b7a1f07
commit 893f7917ef
4 changed files with 67 additions and 7 deletions

Binary file not shown.

View File

@ -106,9 +106,52 @@ def _encode_binary(binary: Binary) -> bytes:
_write_u8(0) _write_u8(0)
_write_u32(len(binary.starting_state)) _write_u32(len(binary.starting_state))
# TODO: No RLE for now
for b in binary.starting_state: # == encode RLE ==
_write_u8(b) def _pull_repeats(start: int, data: bytes) -> int | None:
i = 0
first_byte = data[start + i]
while True:
if i >= 255:
break
if start + i >= len(data):
break
if data[start + i] != first_byte:
break
i += 1
if i >= 2:
_write_u8(i)
_write_u8(first_byte)
return start + i
return None
def _pull_non_repeats(start: int, data: bytes):
i = 0
while True:
if i >= 255:
break
if start + i >= len(data):
break
if i >= 1 and data[start + i] == data[start + i - 1]:
break
i += 1
_write_u8(0)
_write_u8(i)
for j in range(i):
_write_u8(data[start + j])
return start + i
i = 0
while i < len(binary.starting_state):
if new_i := _pull_repeats(i, binary.starting_state):
i = new_i
continue
i = _pull_non_repeats(i, binary.starting_state)
return out.getbuffer() return out.getbuffer()

Binary file not shown.

View File

@ -164,12 +164,29 @@ unsafe fn write_imports(
prelude.write(&[0xc9, 0xc3]); prelude.write(&[0xc9, 0xc3]);
} }
unsafe fn write_starting_state(binary: *mut u8, reader: &mut Reader) { unsafe fn write_starting_state(mut out: *mut u8, reader: &mut Reader) {
let length = reader.read::<u32>() as usize; let length = reader.read::<u32>() as usize;
let ptr = reader.ptr;
println!("length: {:?}", length);
binary.copy_from(ptr, length); let end = out.byte_add(length);
while out < end {
let code = reader.read::<u8>();
if code > 0 {
// RLE: repeat
let byte = reader.read::<u8>();
for i in 0..code {
*out = byte;
out = out.byte_add(1);
}
} else {
// N literal bytes
let count = reader.read::<u8>();
for _ in 0..count {
let byte = reader.read::<u8>();
*out = byte;
out = out.byte_add(1);
}
}
}
} }
unsafe fn _main_remote() { unsafe fn _main_remote() {