code wiki / _hdl_build / nx_multilang_call_gate.nx
nx_multilang_call_gate.nx source
↩ module page · 126 lines · 6116 B
1// nx_multilang_call_gate.nx -- proves the EN-pivot multilingual translated call across EN/RU/BE/UK/PL, NO fake
2// green. Direct pairs (EN<->each) AND cross-pairs via the English pivot (RU->PL, PL->UK). Byte-exact asserts +
3// neg-controls (same-language verbatim, unknown passthrough). Renders BE/PL/UK captions to frames + eyeball ->
4// knowledge/nx_multilang_call.png. expect_exit: 0 license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_css_color_decode.nx"
7import "nx_paint_solid_rect.nx"
8import "nx_font8x8.nx"
9import "nx_font_cyrillic8.nx"
10import "nx_font_latinext8.nx"
11import "nx_font_cyrillic_ext8.nx"
12import "nx_utf8.nx"
13import "nx_caption_render_uni.nx"
14import "nx_mt_multi.nx"
15import "nx_png_write.nx"
16import "nx_gate_verdict.nx"
17
18func rg(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
19func rgn(v: i64) -> i64 {
20 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
21 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
22 let d: *u8 = sys_mmap(24); var k: i64 = 0
23 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
24 var j: i64 = k - 1
25 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
26 return 0
27}
28func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
29func bcmp(a: *u8, alen: i64, b: *u8) -> i64 {
30 var i: i64 = 0
31 while i < alen { if b[i]==(0 as u8) { return 0 } if a[i]!=b[i] { return 0 } i=i+1 }
32 if b[alen]!=(0 as u8) { return 0 }
33 return 1
34}
35func mkfb(w: i64, h: i64) -> *Framebuffer {
36 let px: *u8 = sys_mmap(w * h * 4)
37 let fb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer
38 nx_framebuffer_init(fb, px, w, h); nx_framebuffer_clear(fb)
39 return fb
40}
41// translate src (lang a -> lang b), print, and check byte-exact vs expected. returns the dst buffer.
42func tcheck(src: *u8, a: i64, b: i64, expect: *u8, lbl: *u8, pass: *i64, fail: *i64) -> *u8 {
43 let dst: *u8 = sys_mmap(256)
44 let dn: i64 = nx_multi_translate(src, slen(src), a, b, dst, 256)
45 rg(" " as *u8); rg(lbl); rg(" '" as *u8); sys_write(1, src, slen(src)); rg("' -> '" as *u8); sys_write(1, dst, dn); rg("'" as *u8)
46 if bcmp(dst, dn, expect) == 1 { *pass=*pass+1; rg(" GREEN\n" as *u8) } else { *fail=*fail+1; rg(" RED (want '" as *u8); rg(expect); rg("')\n" as *u8) }
47 return dst
48}
49
50func main() -> i64 {
51 rg("=== nx_multilang_call_gate: EN-pivot translated call over EN/RU/BE/UK/PL ===\n" as *u8)
52 var pass: i64 = 0
53 var fail: i64 = 0
54 let pp: *i64 = sys_mmap(8) as *i64
55 let ff: *i64 = sys_mmap(8) as *i64
56 pp[0]=0; ff[0]=0
57
58 // direct pairs (EN <-> each)
59 tcheck("hello friend" as *u8, MM_EN, MM_RU, "привет друг" as *u8, "EN->RU" as *u8, pp, ff)
60 let be: *u8 = tcheck("hello love" as *u8, MM_EN, MM_BE, "вітаю любоў" as *u8, "EN->BE" as *u8, pp, ff)
61 tcheck("thanks friend" as *u8, MM_EN, MM_UK, "дякую друг" as *u8, "EN->UK" as *u8, pp, ff)
62 let pl: *u8 = tcheck("hello thanks" as *u8, MM_EN, MM_PL, "cześć dziękuję" as *u8, "EN->PL" as *u8, pp, ff)
63 tcheck("спасибо любовь" as *u8, MM_RU, MM_EN, "thanks love" as *u8, "RU->EN" as *u8, pp, ff)
64 tcheck("cześć przyjaciel" as *u8, MM_PL, MM_EN, "hello friend" as *u8, "PL->EN" as *u8, pp, ff)
65 // cross-pairs via the English pivot
66 tcheck("привет друг" as *u8, MM_RU, MM_PL, "cześć przyjaciel" as *u8, "RU->PL(pivot)" as *u8, pp, ff)
67 let uk: *u8 = tcheck("cześć miłość" as *u8, MM_PL, MM_UK, "привіт любов" as *u8, "PL->UK(pivot)" as *u8, pp, ff)
68 // neg-controls
69 tcheck("hello" as *u8, MM_EN, MM_EN, "hello" as *u8, "same-lang" as *u8, pp, ff)
70 tcheck("hello xyzzy" as *u8, MM_EN, MM_RU, "привет xyzzy" as *u8, "passthrough" as *u8, pp, ff)
71 pass = pp[0]; fail = ff[0]
72
73 // render BE / PL / UK captions natively + eyeball
74 let w: i64 = 320
75 let h: i64 = 64
76 let bar: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
77 bar.r=0; bar.g=0; bar.b=0; bar.a=255
78 let fg: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
79 fg.r=255; fg.g=235; fg.b=60; fg.a=255
80 let vid: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
81 vid.r=30; vid.g=44; vid.b=64; vid.a=255
82
83 let fbs: *i64 = sys_mmap(3 * 8) as *i64
84 let caps: **u8 = sys_mmap(3 * 8) as **u8
85 caps[0]=be; caps[1]=pl; caps[2]=uk
86 var j: i64 = 0
87 while j < 3 {
88 let fb: *Framebuffer = mkfb(w, h)
89 nx_paint_solid_rect(fb, 0, 0, w, h, vid)
90 let set: i64 = nx_caption_render_uni(fb, caps[j], slen(caps[j]), 2, bar, fg)
91 if set > 0 { pass=pass+1 } else { fail=fail+1; rg(" render RED\n" as *u8) }
92 fbs[j] = fb as i64
93 j = j + 1
94 }
95 let H3: i64 = h * 3
96 let rgb: *u8 = sys_mmap(w * H3 * 3)
97 var p: i64 = 0
98 while p < 3 {
99 let fb: *Framebuffer = fbs[p] as *Framebuffer
100 var y: i64 = 0
101 while y < h {
102 var x: i64 = 0
103 while x < w {
104 let s: i64 = (y * w + x) * 4
105 let d: i64 = ((p * h + y) * w + x) * 3
106 rgb[d+0]=fb.pixels[s+0]; rgb[d+1]=fb.pixels[s+1]; rgb[d+2]=fb.pixels[s+2]
107 x = x + 1
108 }
109 y = y + 1
110 }
111 p = p + 1
112 }
113 nx_png_write_rgb("knowledge/nx_multilang_call.png" as *u8, rgb, w, H3)
114 rg(" eyeball -> knowledge/nx_multilang_call.png (BE / PL / UK)\n" as *u8)
115
116 rg("MULTILANG-CALL-GATE pass=" as *u8); rgn(pass); rg(" fail=" as *u8); rgn(fail)
117 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
118 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
119 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
120 let ctr__dry: *i64 = gv_ctr()
121 ctr__dry[0] = pass
122 ctr__dry[1] = pass + fail
123 let rc__dry: i64 = gv_verdict("MULTILANG-CALL-GATE" as *u8, ctr__dry, "EN-pivot translation across EN/RU/BE/UK/PL incl cross-pairs; native render; neg-controls hold" as *u8)
124 sys_exit(rc__dry)
125 return rc__dry
126}