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}