code wiki / _hdl_build / nx_text_wrap_gate.nx

nx_text_wrap_gate.nx source

↩ module page · 64 lines · 3896 B

1// nx_text_wrap_gate.nx -- KAT verdict gate for the shared word-level line breaker tw_next_break. Proves 2// it breaks at SPACES (not mid-word), packs greedily, hard-breaks an over-long word, and returns len when 3// the rest fits. Also a property check over a real sentence: every non-final break lands right AFTER a 4// space (no word is split). LIAR-KILL: an obviously-wrong expected break is rejected. 100% sovereign. 5// license_tier: ORIGINAL 6import "nx_syscalls.nx" 7import "nx_text_wrap.nx" 8 9func g_w(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 } 10func pn(v0: i64) -> i64 { var v: i64=v0; if v<0 { let m: *u8=sys_mmap(8); m[0]=45 as u8; sys_write(1,m,1); v=0-v } let b: *u8=sys_mmap(24); var k: i64=0; if v==0 {b[0]=48;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 } 11func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 12func chkv(got: i64, want: i64, label: *u8, pass: *i64) -> i64 { 13 g_w(" " as *u8); g_w(label); g_w(": " as *u8) 14 if got==want { g_w("OK (" as *u8); pn(got); g_w(")\n" as *u8); pass[0]=pass[0]+1 } 15 else { g_w("FAIL got=" as *u8); pn(got); g_w(" want=" as *u8); pn(want); g_w("\n" as *u8) } 16 return 0 17} 18func chk(cond: i64, label: *u8, pass: *i64) -> i64 { 19 g_w(" " as *u8); g_w(label); g_w(": " as *u8) 20 if cond==1 { g_w("OK\n" as *u8); pass[0]=pass[0]+1 } else { g_w("FAIL\n" as *u8) } 21 return cond 22} 23 24func main() -> i64 { 25 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0 26 g_w("=== TEXT-WRAP GATE (word-level break KAT, sovereign nx_cc->nxasm) ===\n" as *u8) 27 28 // K1: "hello world" cpl=8 -> "hello world"=11 > 8, last space <=8 is index 5 -> break AFTER it = 6 29 let s1: *u8 = "hello world\x00" as *u8 30 chkv(tw_next_break(s1, 11, 8, 0), 6, "break 'hello world'@cpl8 -> 6 (after space)\x00" as *u8, pass) 31 // K2: continuing from 6, "world" (5 chars) fits in 8 -> returns len 11 32 chkv(tw_next_break(s1, 11, 8, 6), 11, "continue@6 -> 11 (rest fits)\x00" as *u8, pass) 33 // K3: a word longer than cpl has no space -> HARD break at start+cpl 34 let s3: *u8 = "abcdefghij\x00" as *u8 35 chkv(tw_next_break(s3, 10, 5, 0), 5, "long word no-space -> hard break at 5\x00" as *u8, pass) 36 // K4: short text (fits) -> returns len 37 let s4: *u8 = "hi there\x00" as *u8 38 chkv(tw_next_break(s4, 8, 20, 0), 8, "short text fits -> len 8\x00" as *u8, pass) 39 40 // K5 PROPERTY: wrap a real sentence at cpl=12; EVERY non-final break must land right after a space 41 // (text[e-1]==' '), i.e. NO word is split. (Words here are all <=12 chars so no hard breaks occur.) 42 let s5: *u8 = "the quick brown fox jumps over the lazy dog today\x00" as *u8 43 let n5: i64 = slen(s5) 44 var s: i64 = 0 45 var allword: i64 = 1 46 var nlines: i64 = 0 47 while s < n5 { 48 let e: i64 = tw_next_break(s5, n5, 12, s) 49 nlines = nlines + 1 50 if e < n5 { if (s5[e-1]&0xff) != (32 as i64) { allword = 0 } } // non-final break must follow a space 51 if e <= s { allword = 0 } // must make progress 52 s = e 53 } 54 g_w(" (sentence wrapped to " as *u8); pn(nlines); g_w(" lines @cpl12)\n" as *u8) 55 chk(allword, "every non-final break is AFTER a space (no mid-word split)\x00" as *u8, pass) 56 chk((nlines >= 4) as i64, "sentence wrapped to multiple lines\x00" as *u8, pass) 57 58 // LIAR-KILL: K1's break is 6, NOT 8 (a char-level break would give 8). Assert the breaker is NOT char-level. 59 chk((tw_next_break(s1, 11, 8, 0) != 8) as i64, "LIAR-KILL: break is word-level (6) not char-level (8)\x00" as *u8, pass) 60 61 g_w("TEXT-WRAP rows=7 pass=" as *u8); pn(pass[0]) 62 if pass[0]==7 { g_w(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 63 g_w(" verdict=RED\n" as *u8); sys_exit(1); return 1 64}