code wiki / _hdl_build / nx_live_xlate_call_gate.nx

nx_live_xlate_call_gate.nx source

↩ module page · 111 lines · 5929 B

1// nx_live_xlate_call_gate.nx -- proves the live-translated call for "a girl in Belarus (RU) talking to a boy in 2// Texas (EN)", NO fake green. (1) the boy says "hello friend" -> the GIRL's screen shows it in RUSSIAN 3// "привет друг" (byte-exact) rendered in NATIVE Cyrillic; (2) the girl says "спасибо любовь" -> the BOY's screen 4// shows "thanks love" in Latin; (3) neg-control: same-locale = NO translation (verbatim). Eyeball -> 5// knowledge/nx_live_xlate_call.png (girl's screen top, boy's screen bottom). expect_exit: 0 license_tier: ORIGINAL 6import "nx_syscalls.nx" 7import "nx_css_color_decode.nx" 8import "nx_paint_solid_rect.nx" 9import "nx_font8x8.nx" 10import "nx_font_cyrillic8.nx" 11import "nx_utf8.nx" 12import "nx_caption_render_uni.nx" 13import "nx_mt_ruen.nx" 14import "nx_live_xlate_call.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 } 28// a (alen bytes) equals nul-terminated expected b ? 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) 39 nx_framebuffer_clear(fb) 40 return fb 41} 42 43func main() -> i64 { 44 rg("=== nx_live_xlate_call_gate: Belarus girl (RU) <-> Texas boy (EN) live-translated call ===\n" as *u8) 45 let w: i64 = 320 46 let h: i64 = 120 47 var pass: i64 = 0 48 var fail: i64 = 0 49 50 let bar: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor 51 bar.r=0; bar.g=0; bar.b=0; bar.a=255 52 let fg: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor 53 fg.r=255; fg.g=235; fg.b=60; fg.a=255 54 let vidG: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor 55 vidG.r=64; vidG.g=40; vidG.b=44; vidG.a=255 56 let vidB: *CssColor = sys_mmap(NX_CSS_COLOR_BYTES) as *CssColor 57 vidB.r=28; vidB.g=44; vidB.b=70; vidB.a=255 58 59 // (1) boy (EN) -> girl (RU): "hello friend" -> "привет друг" 60 let boy_utt: *u8 = "hello friend" as *u8 61 let gcap: *u8 = sys_mmap(256) 62 let gn: i64 = lx_caption_for_listener(boy_utt, slen(boy_utt), LX_EN, LX_RU, gcap, 256) 63 rg(" boy(EN) '" as *u8); sys_write(1, boy_utt, slen(boy_utt)); rg("' -> girl(RU) '" as *u8); sys_write(1, gcap, gn); rg("'\n" as *u8) 64 if bcmp(gcap, gn, "привет друг" as *u8) == 1 { pass=pass+1; rg(" ROW EN->RU correct: GREEN\n" as *u8) } else { fail=fail+1; rg(" ROW EN->RU correct: RED\n" as *u8) } 65 66 // (2) girl (RU) -> boy (EN): "спасибо любовь" -> "thanks love" 67 let girl_utt: *u8 = "спасибо любовь" as *u8 68 let bcap: *u8 = sys_mmap(256) 69 let bn: i64 = lx_caption_for_listener(girl_utt, slen(girl_utt), LX_RU, LX_EN, bcap, 256) 70 rg(" girl(RU) '" as *u8); sys_write(1, girl_utt, slen(girl_utt)); rg("' -> boy(EN) '" as *u8); sys_write(1, bcap, bn); rg("'\n" as *u8) 71 if bcmp(bcap, bn, "thanks love" as *u8) == 1 { pass=pass+1; rg(" ROW RU->EN correct: GREEN\n" as *u8) } else { fail=fail+1; rg(" ROW RU->EN correct: RED\n" as *u8) } 72 73 // (3) neg-control: same locale -> NO translation (verbatim) 74 let same: *u8 = sys_mmap(64) 75 let sn: i64 = lx_caption_for_listener("hello" as *u8, 5, LX_EN, LX_EN, same, 64) 76 if bcmp(same, sn, "hello" as *u8) == 1 { pass=pass+1; rg(" ROW same-locale-no-translate: GREEN\n" as *u8) } else { fail=fail+1; rg(" ROW same-locale-no-translate: RED\n" as *u8) } 77 78 // render the GIRL's screen (native Cyrillic) and the BOY's screen (Latin) 79 let fbG: *Framebuffer = mkfb(w, h) 80 nx_paint_solid_rect(fbG, 0, 0, w, h, vidG) 81 let setG: i64 = nx_caption_render_uni(fbG, gcap, gn, 2, bar, fg) 82 if setG > 0 { pass=pass+1; rg(" ROW girl-screen-cyrillic-renders: GREEN (" as *u8); rgn(setG); rg("px)\n" as *u8) } else { fail=fail+1; rg(" ROW girl-screen: RED\n" as *u8) } 83 84 let fbB: *Framebuffer = mkfb(w, h) 85 nx_paint_solid_rect(fbB, 0, 0, w, h, vidB) 86 let setB: i64 = nx_caption_render_uni(fbB, bcap, bn, 2, bar, fg) 87 if setB > 0 { pass=pass+1; rg(" ROW boy-screen-latin-renders: GREEN (" as *u8); rgn(setB); rg("px)\n" as *u8) } else { fail=fail+1; rg(" ROW boy-screen: RED\n" as *u8) } 88 89 // eyeball: girl's screen (top) + boy's screen (bottom) 90 let H2: i64 = h * 2 91 let rgb: *u8 = sys_mmap(w * H2 * 3) 92 var y: i64 = 0 93 while y < h { 94 var x: i64 = 0 95 while x < w { 96 let s: i64 = (y * w + x) * 4 97 let d1: i64 = (y * w + x) * 3 98 rgb[d1+0]=fbG.pixels[s+0]; rgb[d1+1]=fbG.pixels[s+1]; rgb[d1+2]=fbG.pixels[s+2] 99 let d2: i64 = ((h + y) * w + x) * 3 100 rgb[d2+0]=fbB.pixels[s+0]; rgb[d2+1]=fbB.pixels[s+1]; rgb[d2+2]=fbB.pixels[s+2] 101 x = x + 1 102 } 103 y = y + 1 104 } 105 nx_png_write_rgb("knowledge/nx_live_xlate_call.png" as *u8, rgb, w, H2) 106 rg(" eyeball -> knowledge/nx_live_xlate_call.png (girl's screen top, boy's screen bottom)\n" as *u8) 107 108 rg("LIVE-XLATE-CALL-GATE pass=" as *u8); rgn(pass); rg(" fail=" as *u8); rgn(fail) 109 if fail == 0 { rg(" verdict=GREEN -- bidirectional RU<->EN translated call; girl reads native Cyrillic, boy reads Latin; same-locale verbatim\n" as *u8); sys_exit(0); return 0 } 110 rg(" verdict=RED\n" as *u8); sys_exit(1); return 1 111}