code wiki / _hdl_build / nx_mt_multi.nx
nx_mt_multi.nx source
↩ module page · 144 lines · 6963 B
1// nx_mt_multi.nx -- sovereign MULTILINGUAL phrase translator over EN/RU/BE/UK/PL, ENGLISH-PIVOT (the standard
2// MT design: any pair X->Y routes X->EN->Y, so N languages need only 2N tables, not N^2). Token-level, Cyrillic-
3// & Polish-aware tokenizer (bytes >=0x80 are token chars), NO float, deterministic. Unknown tokens pass through
4// (Cardinal 25). Lexicon is edit-here R1 (R2 -> seg_store per language-pair, Cardinal 11). license_tier: ORIGINAL
5import "nx_syscalls.nx"
6
7const MM_EN: i64 = 0
8const MM_RU: i64 = 1
9const MM_BE: i64 = 2
10const MM_UK: i64 = 3
11const MM_PL: i64 = 4
12
13func mm_lc(c: i64) -> i64 { if c >= 65 { if c <= 90 { return c + 32 } } return c }
14func mm_is_tok(c: i64) -> i64 {
15 if c >= 48 { if c <= 57 { return 1 } }
16 if c >= 65 { if c <= 90 { return 1 } }
17 if c >= 97 { if c <= 122 { return 1 } }
18 if c >= 128 { return 1 }
19 return 0
20}
21// byte-exact nul-terminated compare
22func mm_streq(a: *u8, b: *u8) -> i64 {
23 var i: i64 = 0
24 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 }
25 if b[i] != (0 as u8) { return 0 }
26 return 1
27}
28// extract src[s..e) into buf, lowercasing ASCII; nul-terminate
29func mm_extract(src: *u8, s: i64, e: i64, buf: *u8) -> i64 {
30 var k: i64 = 0
31 var i: i64 = s
32 while i < e { buf[k] = mm_lc(src[i] as i64) as u8; k = k + 1; i = i + 1 }
33 buf[k] = 0 as u8
34 return k
35}
36// English token -> language `lang`
37func mm_en_to(lang: i64, tok: *u8) -> *u8 {
38 if lang == MM_RU {
39 if mm_streq(tok,"hello" as *u8)==1 { return "привет" as *u8 }
40 if mm_streq(tok,"friend" as *u8)==1 { return "друг" as *u8 }
41 if mm_streq(tok,"thanks" as *u8)==1 { return "спасибо" as *u8 }
42 if mm_streq(tok,"love" as *u8)==1 { return "любовь" as *u8 }
43 if mm_streq(tok,"yes" as *u8)==1 { return "да" as *u8 }
44 if mm_streq(tok,"no" as *u8)==1 { return "нет" as *u8 }
45 }
46 if lang == MM_BE {
47 if mm_streq(tok,"hello" as *u8)==1 { return "вітаю" as *u8 }
48 if mm_streq(tok,"friend" as *u8)==1 { return "сябар" as *u8 }
49 if mm_streq(tok,"thanks" as *u8)==1 { return "дзякуй" as *u8 }
50 if mm_streq(tok,"love" as *u8)==1 { return "любоў" as *u8 }
51 if mm_streq(tok,"yes" as *u8)==1 { return "так" as *u8 }
52 if mm_streq(tok,"no" as *u8)==1 { return "не" as *u8 }
53 }
54 if lang == MM_UK {
55 if mm_streq(tok,"hello" as *u8)==1 { return "привіт" as *u8 }
56 if mm_streq(tok,"friend" as *u8)==1 { return "друг" as *u8 }
57 if mm_streq(tok,"thanks" as *u8)==1 { return "дякую" as *u8 }
58 if mm_streq(tok,"love" as *u8)==1 { return "любов" as *u8 }
59 if mm_streq(tok,"yes" as *u8)==1 { return "так" as *u8 }
60 if mm_streq(tok,"no" as *u8)==1 { return "ні" as *u8 }
61 }
62 if lang == MM_PL {
63 if mm_streq(tok,"hello" as *u8)==1 { return "cześć" as *u8 }
64 if mm_streq(tok,"friend" as *u8)==1 { return "przyjaciel" as *u8 }
65 if mm_streq(tok,"thanks" as *u8)==1 { return "dziękuję" as *u8 }
66 if mm_streq(tok,"love" as *u8)==1 { return "miłość" as *u8 }
67 if mm_streq(tok,"yes" as *u8)==1 { return "tak" as *u8 }
68 if mm_streq(tok,"no" as *u8)==1 { return "nie" as *u8 }
69 }
70 return 0 as *u8
71}
72// language `lang` token -> English
73func mm_to_en(lang: i64, tok: *u8) -> *u8 {
74 if lang == MM_RU {
75 if mm_streq(tok,"привет" as *u8)==1 { return "hello" as *u8 }
76 if mm_streq(tok,"друг" as *u8)==1 { return "friend" as *u8 }
77 if mm_streq(tok,"спасибо" as *u8)==1 { return "thanks" as *u8 }
78 if mm_streq(tok,"любовь" as *u8)==1 { return "love" as *u8 }
79 if mm_streq(tok,"да" as *u8)==1 { return "yes" as *u8 }
80 if mm_streq(tok,"нет" as *u8)==1 { return "no" as *u8 }
81 }
82 if lang == MM_BE {
83 if mm_streq(tok,"вітаю" as *u8)==1 { return "hello" as *u8 }
84 if mm_streq(tok,"сябар" as *u8)==1 { return "friend" as *u8 }
85 if mm_streq(tok,"дзякуй" as *u8)==1 { return "thanks" as *u8 }
86 if mm_streq(tok,"любоў" as *u8)==1 { return "love" as *u8 }
87 if mm_streq(tok,"так" as *u8)==1 { return "yes" as *u8 }
88 if mm_streq(tok,"не" as *u8)==1 { return "no" as *u8 }
89 }
90 if lang == MM_UK {
91 if mm_streq(tok,"привіт" as *u8)==1 { return "hello" as *u8 }
92 if mm_streq(tok,"друг" as *u8)==1 { return "friend" as *u8 }
93 if mm_streq(tok,"дякую" as *u8)==1 { return "thanks" as *u8 }
94 if mm_streq(tok,"любов" as *u8)==1 { return "love" as *u8 }
95 if mm_streq(tok,"так" as *u8)==1 { return "yes" as *u8 }
96 if mm_streq(tok,"ні" as *u8)==1 { return "no" as *u8 }
97 }
98 if lang == MM_PL {
99 if mm_streq(tok,"cześć" as *u8)==1 { return "hello" as *u8 }
100 if mm_streq(tok,"przyjaciel" as *u8)==1 { return "friend" as *u8 }
101 if mm_streq(tok,"dziękuję" as *u8)==1 { return "thanks" as *u8 }
102 if mm_streq(tok,"miłość" as *u8)==1 { return "love" as *u8 }
103 if mm_streq(tok,"tak" as *u8)==1 { return "yes" as *u8 }
104 if mm_streq(tok,"nie" as *u8)==1 { return "no" as *u8 }
105 }
106 return 0 as *u8
107}
108// translate one already-extracted token from srcLang to dstLang (EN pivot). 0 if no mapping.
109func mm_xlate_token(tok: *u8, srcLang: i64, dstLang: i64) -> *u8 {
110 if srcLang == dstLang { return tok }
111 if srcLang == MM_EN { return mm_en_to(dstLang, tok) }
112 if dstLang == MM_EN { return mm_to_en(srcLang, tok) }
113 let piv: *u8 = mm_to_en(srcLang, tok)
114 if (piv as i64) == 0 { return 0 as *u8 }
115 return mm_en_to(dstLang, piv)
116}
117func mm_app(dst: *u8, pos: *i64, cap: i64, s: *u8) -> i64 {
118 var i: i64 = 0
119 while s[i] != (0 as u8) { let p: i64 = *pos; if p < cap { dst[p]=s[i]; *pos=p+1 } i=i+1 }
120 return 0
121}
122func mm_appb(dst: *u8, pos: *i64, cap: i64, b: i64) -> i64 { let p: i64 = *pos; if p < cap { dst[p]=b as u8; *pos=p+1 } return 0 }
123
124// translate src (n bytes) from srcLang to dstLang -> dst. returns dst length.
125func nx_multi_translate(src: *u8, n: i64, srcLang: i64, dstLang: i64, dst: *u8, cap: i64) -> i64 {
126 let pos: *i64 = sys_mmap(8) as *i64
127 *pos = 0
128 let tok: *u8 = sys_mmap(128)
129 var i: i64 = 0
130 var first: i64 = 1
131 while i < n {
132 while i < n { if mm_is_tok(src[i] as i64) == 1 { break } i = i + 1 }
133 if i >= n { break }
134 let s: i64 = i
135 while i < n { if mm_is_tok(src[i] as i64) == 1 { i = i + 1 } else { break } }
136 let e: i64 = i
137 mm_extract(src, s, e, tok)
138 if first == 0 { mm_appb(dst, pos, cap, 32) }
139 first = 0
140 let tr: *u8 = mm_xlate_token(tok, srcLang, dstLang)
141 if (tr as i64) != 0 { mm_app(dst, pos, cap, tr) } else { mm_app(dst, pos, cap, tok) }
142 }
143 return *pos
144}