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}