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}