code wiki / _hdl_build / nx_multilang_call_gate.nx
nx_multilang_call_gate.nx source
↩ module page · 118 lines · 5725 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"
16
17func rg(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
18func rgn(v: i64) -> i64 {
19 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
20 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
21 let d: *u8 = sys_mmap(24); var k: i64 = 0
22 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
23 var j: i64 = k - 1
24 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
25 return 0
26}
27func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
28func bcmp(a: *u8, alen: i64, b: *u8) -> i64 {
29 var i: i64 = 0
30 while i < alen { if b[i]==(0 as u8) { return 0 } if a[i]!=b[i] { return 0 } i=i+1 }
31 if b[alen]!=(0 as u8) { return 0 }
32 return 1
33}
34func mkfb(w: i64, h: i64) -> *Framebuffer {
35 let px: *u8 = sys_mmap(w * h * 4)
36 let fb: *Framebuffer = sys_mmap(NX_FRAMEBUFFER_BYTES) as *Framebuffer
37 nx_framebuffer_init(fb, px, w, h); nx_framebuffer_clear(fb)
38 return fb
39}
40// translate src (lang a -> lang b), print, and check byte-exact vs expected. returns the dst buffer.
41func tcheck(src: *u8, a: i64, b: i64, expect: *u8, lbl: *u8, pass: *i64, fail: *i64) -> *u8 {
42 let dst: *u8 = sys_mmap(256)
43 let dn: i64 = nx_multi_translate(src, slen(src), a, b, dst, 256)
44 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)
45 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) }
46 return dst
47}
48
49func main() -> i64 {
50 rg("=== nx_multilang_call_gate: EN-pivot translated call over EN/RU/BE/UK/PL ===\n" as *u8)
51 var pass: i64 = 0
52 var fail: i64 = 0
53 let pp: *i64 = sys_mmap(8) as *i64
54 let ff: *i64 = sys_mmap(8) as *i64
55 pp[0]=0; ff[0]=0
56
57 // direct pairs (EN <-> each)
58 tcheck("hello friend" as *u8, MM_EN, MM_RU, "привет друг" as *u8, "EN->RU" as *u8, pp, ff)
59 let be: *u8 = tcheck("hello love" as *u8, MM_EN, MM_BE, "вітаю любоў" as *u8, "EN->BE" as *u8, pp, ff)
60 tcheck("thanks friend" as *u8, MM_EN, MM_UK, "дякую друг" as *u8, "EN->UK" as *u8, pp, ff)
61 let pl: *u8 = tcheck("hello thanks" as *u8, MM_EN, MM_PL, "cześć dziękuję" as *u8, "EN->PL" as *u8, pp, ff)
62 tcheck("спасибо любовь" as *u8, MM_RU, MM_EN, "thanks love" as *u8, "RU->EN" as *u8, pp, ff)
63 tcheck("cześć przyjaciel" as *u8, MM_PL, MM_EN, "hello friend" as *u8, "PL->EN" as *u8, pp, ff)
64 // cross-pairs via the English pivot
65 tcheck("привет друг" as *u8, MM_RU, MM_PL, "cześć przyjaciel" as *u8, "RU->PL(pivot)" as *u8, pp, ff)
66 let uk: *u8 = tcheck("cześć miłość" as *u8, MM_PL, MM_UK, "привіт любов" as *u8, "PL->UK(pivot)" as *u8, pp, ff)
67 // neg-controls
68 tcheck("hello" as *u8, MM_EN, MM_EN, "hello" as *u8, "same-lang" as *u8, pp, ff)
69 tcheck("hello xyzzy" as *u8, MM_EN, MM_RU, "привет xyzzy" as *u8, "passthrough" as *u8, pp, ff)
70 pass = pp[0]; fail = ff[0]
71
72 // render BE / PL / UK captions natively + eyeball
73 let w: i64 = 320
74 let h: i64 = 64
75 let bar: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
76 bar.r=0; bar.g=0; bar.b=0; bar.a=255
77 let fg: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
78 fg.r=255; fg.g=235; fg.b=60; fg.a=255
79 let vid: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor
80 vid.r=30; vid.g=44; vid.b=64; vid.a=255
81
82 let fbs: *i64 = sys_mmap(3 * 8) as *i64
83 let caps: **u8 = sys_mmap(3 * 8) as **u8
84 caps[0]=be; caps[1]=pl; caps[2]=uk
85 var j: i64 = 0
86 while j < 3 {
87 let fb: *Framebuffer = mkfb(w, h)
88 nx_paint_solid_rect(fb, 0, 0, w, h, vid)
89 let set: i64 = nx_caption_render_uni(fb, caps[j], slen(caps[j]), 2, bar, fg)
90 if set > 0 { pass=pass+1 } else { fail=fail+1; rg(" render RED\n" as *u8) }
91 fbs[j] = fb as i64
92 j = j + 1
93 }
94 let H3: i64 = h * 3
95 let rgb: *u8 = sys_mmap(w * H3 * 3)
96 var p: i64 = 0
97 while p < 3 {
98 let fb: *Framebuffer = fbs[p] as *Framebuffer
99 var y: i64 = 0
100 while y < h {
101 var x: i64 = 0
102 while x < w {
103 let s: i64 = (y * w + x) * 4
104 let d: i64 = ((p * h + y) * w + x) * 3
105 rgb[d+0]=fb.pixels[s+0]; rgb[d+1]=fb.pixels[s+1]; rgb[d+2]=fb.pixels[s+2]
106 x = x + 1
107 }
108 y = y + 1
109 }
110 p = p + 1
111 }
112 nx_png_write_rgb("knowledge/nx_multilang_call.png" as *u8, rgb, w, H3)
113 rg(" eyeball -> knowledge/nx_multilang_call.png (BE / PL / UK)\n" as *u8)
114
115 rg("MULTILANG-CALL-GATE pass=" as *u8); rgn(pass); rg(" fail=" as *u8); rgn(fail)
116 if fail == 0 { rg(" verdict=GREEN -- EN-pivot translation across EN/RU/BE/UK/PL incl cross-pairs; native render; neg-controls hold\n" as *u8); sys_exit(0); return 0 }
117 rg(" verdict=RED\n" as *u8); sys_exit(1); return 1
118}