code wiki / _hdl_build / _inflate_stored_authored.nx
_inflate_stored_authored.nx source
↩ module page · 31 lines · 1587 B
1// AUTHORED BY THE NISHI BUILDER (nx_module_author inflate-stored template) -- DEFLATE block loop, bits-up
2import "nx_syscalls.nx"
3func ibr(buf: *u8, len: i64, cursor: *i64, n: i64) -> i64 { var val: i64=0; var got: i64=0; while got<n { let bp: i64=cursor[0]>>3; if bp>=len { return 0-1 } let bit: i64=((buf[bp] as i64)>>(cursor[0]&7))&1; val=val|(bit<<got); cursor[0]=cursor[0]+1; got=got+1 } return val }
4func inflate_stored(src: *u8, srclen: i64, out: *u8) -> i64 {
5 let cur: *i64 = sys_mmap(8) as *i64; cur[0] = 0
6 var outpos: i64 = 0; var fin: i64 = 0
7 while fin == 0 {
8 let bfinal: i64 = ibr(src, srclen, cur, 1)
9 let btype: i64 = ibr(src, srclen, cur, 2)
10 if bfinal == 1 { fin = 1 }
11 if btype == 0 {
12 cur[0] = ((cur[0] + 7) >> 3) << 3
13 let bytepos: i64 = cur[0] >> 3
14 let blen: i64 = (src[bytepos] as i64) | ((src[bytepos+1] as i64) << 8)
15 var p: i64 = bytepos + 4; var i: i64 = 0
16 while i < blen { out[outpos] = src[p]; outpos=outpos+1; p=p+1; i=i+1 }
17 cur[0] = p << 3
18 } else { fin = 1 }
19 }
20 return outpos
21}
22func main() -> i64 {
23 let src: *u8 = sys_mmap(16)
24 src[0]=0x01 as u8; src[1]=0x05 as u8; src[2]=0x00 as u8; src[3]=0xFA as u8; src[4]=0xFF as u8
25 src[5]=72 as u8; src[6]=101 as u8; src[7]=108 as u8; src[8]=108 as u8; src[9]=111 as u8
26 let out: *u8 = sys_mmap(64)
27 let n: i64 = inflate_stored(src, 10, out)
28 if n==5 { if out[0]==72 as u8 { if out[1]==101 as u8 { if out[4]==111 as u8 { sys_exit(0) } } } }
29 sys_exit(1)
30 return 1
31}