code wiki / _hdl_build / _pdf_stream_authored.nx
_pdf_stream_authored.nx source
↩ module page · 26 lines · 1411 B
1// AUTHORED BY THE NISHI BUILDER (pdf-stream template) -- extract + FlateDecode a PDF stream, bits-up
2import "_inflate_lib_authored.nx"
3func psub(buf: *u8, n: i64, from: i64, needle: *u8, nl: i64) -> i64 { var i: i64=from; while i+nl<=n { var ok: i64=1; var j: i64=0; while j<nl { if buf[i+j]!=needle[j] { ok=0; j=nl } else { j=j+1 } } if ok==1 { return i } i=i+1 } return 0-1 }
4func pdf_extract(pdf: *u8, pdflen: i64, out: *u8) -> i64 {
5 let s: i64=psub(pdf,pdflen,0,"stream" as *u8,6)
6 if s<0 { return 0-1 }
7 var ds: i64=s+6
8 if pdf[ds]==0x0d as u8 { ds=ds+1 }
9 if pdf[ds]==0x0a as u8 { ds=ds+1 }
10 let e: i64=psub(pdf,pdflen,ds,"endstream" as *u8,9)
11 if e<0 { return 0-1 }
12 var de: i64=e
13 if de>ds { if pdf[de-1]==0x0a as u8 { de=de-1 } }
14 if de>ds { if pdf[de-1]==0x0d as u8 { de=de-1 } }
15 return inflate(((pdf as i64)+ds+2) as *u8, de-ds-2, out)
16}
17func main() -> i64 {
18 let lp: *i64=sys_mmap(8) as *i64; let pdf: *u8=sys_read_file("/tmp/test.pdf" as *u8, lp)
19 let lo: *i64=sys_mmap(8) as *i64; let orig: *u8=sys_read_file("/tmp/pdfbody.orig" as *u8, lo)
20 if (pdf as i64)==0 { sys_exit(2) } if (orig as i64)==0 { sys_exit(2) }
21 let out: *u8=sys_mmap(65536)
22 let n: i64=pdf_extract(pdf, lp[0], out)
23 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 }
24 if ok==1 { sys_exit(0) } sys_exit(1)
25 return 1
26}