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}