code wiki / _hdl_build / _cbz_list_authored.nx

_cbz_list_authored.nx source

↩ module page · 28 lines · 1629 B

1// AUTHORED BY THE NISHI BUILDER (cbz-list template) -- list ZIP/CBZ entries in order, bits-up 2import "nx_syscalls.nx" 3func cle16(b: *u8, o: i64) -> i64 { return (b[o] as i64)|((b[o+1] as i64)<<8) } 4func cle32(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 cbz_list(zip: *u8, ziplen: i64, out: *u8, outcount: *i64) -> i64 { 6 var pos: i64=0; var count: i64=0; var op: i64=0; var run: i64=1 7 while run==1 { 8 var sig: i64=0 9 if pos+30<=ziplen { if zip[pos]==0x50 as u8 { if zip[pos+1]==0x4b as u8 { if zip[pos+2]==0x03 as u8 { if zip[pos+3]==0x04 as u8 { sig=1 } } } } } 10 if sig==0 { run=0 } else { 11 let compsize: i64=cle32(zip,pos+18); let fnlen: i64=cle16(zip,pos+26); let extralen: i64=cle16(zip,pos+28) 12 var k: i64=0; while k<fnlen { out[op]=zip[pos+30+k]; op=op+1; k=k+1 } 13 out[op]=0x0a as u8; op=op+1; count=count+1 14 pos=pos+30+fnlen+extralen+compsize 15 } 16 } 17 outcount[0]=count; return op 18} 19func main() -> i64 { 20 let lz: *i64=sys_mmap(8) as *i64; let zip: *u8=sys_read_file("/tmp/test.cbz" as *u8, lz) 21 let le: *i64=sys_mmap(8) as *i64; let exp: *u8=sys_read_file("/tmp/cbz.expected" as *u8, le) 22 if (zip as i64)==0 { sys_exit(2) } if (exp as i64)==0 { sys_exit(2) } 23 let out: *u8=sys_mmap(4096); let cnt: *i64=sys_mmap(8) as *i64 24 let n: i64=cbz_list(zip, lz[0], out, cnt) 25 var ok: i64=1; if cnt[0]!=2 { ok=0 } if n!=le[0] { ok=0 } var i: i64=0; while i<le[0] { if out[i]!=exp[i] { ok=0 } i=i+1 } 26 if ok==1 { sys_exit(0) } sys_exit(1) 27 return 1 28}