code wiki / _hdl_build / nx_huffcdic_gate.nx

nx_huffcdic_gate.nx source

↩ module page · 98 lines · 6738 B

1// nx_huffcdic_gate.nx -- liar-kill gate for the sovereign HUFF/CDIC decompressor (MOBI compression 17480). 2// Builds a MINIMAL but spec-exact fixture in memory: a HUFF record whose 256 dict1 entries all encode (codelen=1, 3// term, maxcode-raw=1) -> a 1-bit Huffman code where bit '1' selects dictionary phrase 0 and bit '0' selects 4// phrase 1; a CDIC record carrying phrase0="Alice" + phrase1=" " (both terminal); and a 1-byte stream 0x80 = 5// '10000000'. Decoding MUST yield "Alice" + 7 spaces (the '1' then seven '0' bits). Asserts the HUFF table parse 6// (codelen/term/maxcode formula), the CDIC phrase parse (len/flag/bytes), AND the decoded output byte-exact. 7// This proves the core decode plumbing + record formats; the multi-codelen mincode-walk + recursive (non-terminal) 8// phrase paths get a richer encoder-fixture in the next rung. expect_exit: 0 license_tier: ORIGINAL 9import "nx_syscalls.nx" 10import "nx_huffcdic.nx" 11 12func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 13func gnum(v0: i64) -> i64 { var v: i64=v0; if v<0 { sys_write(1,"-" as *u8,1); v=0-v } let b: *u8=sys_mmap(24); var k: i64=0; if v==0 {b[0]=48 as u8;k=1} while v>0 {b[k]=(48+(v%10)) as u8; v=v/10; k=k+1} let o: *u8=sys_mmap(24); var j: i64=0; while j<k {o[j]=b[k-1-j];j=j+1} sys_write(1,o,k); return 0 } 14 15func put32(b: *u8, o: i64, v: i64) -> i64 { b[o]=((v>>24)&0xff) as u8; b[o+1]=((v>>16)&0xff) as u8; b[o+2]=((v>>8)&0xff) as u8; b[o+3]=(v&0xff) as u8; return 0 } 16func put16(b: *u8, o: i64, v: i64) -> i64 { b[o]=((v>>8)&0xff) as u8; b[o+1]=(v&0xff) as u8; return 0 } 17 18func main() -> i64 { 19 gp("=== nx_huffcdic_gate: sovereign HUFF/CDIC decompressor (MOBI 17480) -- minimal spec-exact fixture ===\n" as *u8) 20 21 // --- build the HUFF record --- 22 let huff: *u8 = sys_mmap(2048) 23 huff[0]=0x48 as u8; huff[1]=0x55 as u8; huff[2]=0x46 as u8; huff[3]=0x46 as u8 24 huff[4]=0 as u8; huff[5]=0 as u8; huff[6]=0 as u8; huff[7]=0x18 as u8 25 put32(huff, 8, 16) // off1 = 0x10 26 put32(huff, 12, 16 + 256*4) // off2 = 0x410 = 1040 27 var i: i64 = 0 28 while i < 256 { put32(huff, 16 + i*4, 0x181); i = i + 1 } // codelen=1, term=0x80, maxcode-raw=1 29 i = 0 30 while i < 64 { put32(huff, 1040 + i*4, 0); i = i + 1 } // dict2 all zero (term path unused here) 31 let hlen: i64 = 1040 + 64*4 32 33 // --- build the CDIC record (30 bytes) --- 34 let cdic: *u8 = sys_mmap(64) 35 cdic[0]=0x43 as u8; cdic[1]=0x44 as u8; cdic[2]=0x49 as u8; cdic[3]=0x43 as u8 36 cdic[4]=0 as u8; cdic[5]=0 as u8; cdic[6]=0 as u8; cdic[7]=0x10 as u8 37 put32(cdic, 8, 2) // phrases = 2 38 put32(cdic, 12, 1) // bits = 1 -> n = 2 39 put16(cdic, 16, 4) // off[0] = 4 -> phrase0 header at cdic offset 20 40 put16(cdic, 18, 11) // off[1] = 11 -> phrase1 header at cdic offset 27 41 put16(cdic, 20, 0x8005) // blen0 = terminal | len 5 42 cdic[22]=0x41 as u8; cdic[23]=0x6c as u8; cdic[24]=0x69 as u8; cdic[25]=0x63 as u8; cdic[26]=0x65 as u8 // "Alice" 43 put16(cdic, 27, 0x8001) // blen1 = terminal | len 1 44 cdic[29]=0x20 as u8 // " " 45 let clen: i64 = 30 46 47 // --- the compressed stream: 1 byte 0x80 = '1 0000000' --- 48 let data: *u8 = sys_mmap(8); data[0]=0x80 as u8 49 50 // --- load tables --- 51 let d1cl: *i64 = sys_mmap(256*8) as *i64 52 let d1tm: *i64 = sys_mmap(256*8) as *i64 53 let d1mx: *i64 = sys_mmap(256*8) as *i64 54 let mincode: *i64 = sys_mmap(64*8) as *i64 55 let maxcode: *i64 = sys_mmap(64*8) as *i64 56 let dptr: *i64 = sys_mmap(64*8) as *i64 57 let dlen: *i64 = sys_mmap(64*8) as *i64 58 let dflag: *i64 = sys_mmap(64*8) as *i64 59 let dcount: *i64 = sys_mmap(8) as *i64; dcount[0]=0 60 61 let rh: i64 = huff_load(huff, hlen, d1cl, d1tm, d1mx, mincode, maxcode) 62 let rc: i64 = cdic_load(cdic, clen, dptr, dlen, dflag, dcount) 63 64 let out: *u8 = sys_mmap(4096) 65 let ol: i64 = hc_unpack(data, 1, out, 4096, d1cl, d1tm, d1mx, mincode, maxcode, dptr, dlen, dflag, dcount[0]) 66 67 gp(" huff_load=" as *u8); gnum(rh); gp(" d1cl[0x80]=" as *u8); gnum(d1cl[0x80]); gp(" d1tm[0x80]=" as *u8); gnum(d1tm[0x80]); gp(" d1mx[0x80]=" as *u8); gnum(d1mx[0x80]); gp("\n" as *u8) 68 gp(" cdic_load=" as *u8); gnum(rc); gp(" dcount=" as *u8); gnum(dcount[0]); gp(" dlen[0]=" as *u8); gnum(dlen[0]); gp(" dflag[0]=" as *u8); gnum(dflag[0]); gp(" dlen[1]=" as *u8); gnum(dlen[1]); gp("\n" as *u8) 69 gp(" decoded len=" as *u8); gnum(ol); gp(" out=\"" as *u8); sys_write(1, out, ol); gp("\"\n" as *u8) 70 71 var pass: i64 = 0; var fail: i64 = 0 72 if rh == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL huff_load-nonzero\n" as *u8) } 73 if d1cl[0x80] == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL d1cl!=1\n" as *u8) } 74 if d1tm[0x80] != 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL d1tm-not-set\n" as *u8) } 75 if d1mx[0x80] == 0xffffffff { pass=pass+1 } else { fail=fail+1; gp(" FAIL d1mx!=0xffffffff\n" as *u8) } 76 if rc == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL cdic_load-nonzero\n" as *u8) } 77 if dcount[0] == 2 { pass=pass+1 } else { fail=fail+1; gp(" FAIL dcount!=2\n" as *u8) } 78 if dlen[0] == 5 { pass=pass+1 } else { fail=fail+1; gp(" FAIL phrase0-len!=5\n" as *u8) } 79 if dflag[0] == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL phrase0-not-terminal\n" as *u8) } 80 if dlen[1] == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL phrase1-len!=1\n" as *u8) } 81 // phrase0 bytes referenced in place == "Alice" 82 let p0: *u8 = dptr[0] as *u8 83 if p0[0]==(0x41 as u8) { if p0[4]==(0x65 as u8) { pass=pass+1 } else { fail=fail+1; gp(" FAIL phrase0-bytes-e\n" as *u8) } } else { fail=fail+1; gp(" FAIL phrase0-bytes-A\n" as *u8) } 84 // decoded output: "Alice" + 7 spaces, len 12 85 if ol == 12 { pass=pass+1 } else { fail=fail+1; gp(" FAIL decoded-len!=12\n" as *u8) } 86 var okA: i64 = 1 87 if out[0]!=(0x41 as u8) { okA=0 } 88 if out[1]!=(0x6c as u8) { okA=0 } 89 if out[2]!=(0x69 as u8) { okA=0 } 90 if out[3]!=(0x63 as u8) { okA=0 } 91 if out[4]!=(0x65 as u8) { okA=0 } 92 if okA == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL decoded-prefix!=Alice\n" as *u8) } 93 if ol >= 12 { if out[5]==(0x20 as u8) { if out[11]==(0x20 as u8) { pass=pass+1 } else { fail=fail+1; gp(" FAIL tail-space11\n" as *u8) } } else { fail=fail+1; gp(" FAIL tail-space5\n" as *u8) } } else { fail=fail+1; gp(" FAIL too-short\n" as *u8) } 94 95 gp("HUFFCDIC-GATE pass=" as *u8); gnum(pass); gp(" fail=" as *u8); gnum(fail) 96 if fail == 0 { gp(" verdict=GREEN (sovereign HUFF/CDIC: HUFF+CDIC record parse + 32-bit Huffman decode -> byte-exact output)\n" as *u8); sys_exit(0); return 0 } 97 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1 98}