code wiki / _hdl_build / _zip_extract_authored.nx

_zip_extract_authored.nx source

↩ module page · 22 lines · 1429 B

1// AUTHORED BY THE NISHI BUILDER (zip-extract template) -- ZIP local header + inflate entry, bits-up 2import "_inflate_lib_authored.nx" 3func zle16(b: *u8, o: i64) -> i64 { return (b[o] as i64)|((b[o+1] as i64)<<8) } 4func zle32(b: *u8, o: i64) -> i64 { return (b[o] as i64)|((b[o+1] as i64)<<8)|((b[o+2] as i64)<<16)|((b[o+3] as i64)<<24) } 5func zip_extract(zip: *u8, ziplen: i64, out: *u8) -> i64 { 6 if zip[0]!=0x50 as u8 { return 0-1 } if zip[1]!=0x4b as u8 { return 0-1 } if zip[2]!=0x03 as u8 { return 0-1 } if zip[3]!=0x04 as u8 { return 0-1 } 7 let method: i64=zle16(zip,8); let compsize: i64=zle32(zip,18); let fnlen: i64=zle16(zip,26); let extralen: i64=zle16(zip,28) 8 let ds: i64=30+fnlen+extralen 9 if method==8 { return inflate(((zip as i64)+ds) as *u8, compsize, out) } 10 if method==0 { var i: i64=0; while i<compsize { out[i]=zip[ds+i]; i=i+1 } return compsize } 11 return 0-2 12} 13func main() -> i64 { 14 let lz: *i64=sys_mmap(8) as *i64; let zip: *u8=sys_read_file("/tmp/test.zip" as *u8, lz) 15 let lo: *i64=sys_mmap(8) as *i64; let orig: *u8=sys_read_file("/tmp/zipbody.orig" as *u8, lo) 16 if (zip as i64)==0 { sys_exit(2) } if (orig as i64)==0 { sys_exit(2) } 17 let out: *u8=sys_mmap(65536) 18 let n: i64=zip_extract(zip, lz[0], out) 19 var ok: i64=1; if n!=lo[0] { ok=0 } var i: i64=0; while i<lo[0] { if out[i]!=orig[i] { ok=0 } i=i+1 } 20 if ok==1 { sys_exit(0) } sys_exit(1) 21 return 1 22}