nx_parse_lex.nx source
↩ module page · 116 lines · 4203 B
1// nx_parse_lex.nx -- WRITING arc support: parse operator-supplied DATA files into
2// the packed null-terminated form the engine's whole-word counter expects. This
3// is how the operator/lane plugs in their roster (character bible), descriptor
4// lexicon (setting/outfit/MPL/...), and register lexicon (term + intensity weight)
5// WITHOUT touching any organ -- the lexicons are pure DATA (rule 25).
6//
7// px_pack_lines(raw, n, out, out_cap) -> count
8// newline-separated terms -> packed "t1\0t2\0..."; skips blank lines,
9// strips trailing \r. (for roster + descriptors)
10// px_pack_weighted(raw, n, out, out_cap, weights) -> count
11// "term <ws> number" per line -> packed terms + weights[k]=number.
12// (for the register intensity lexicon)
13//
14// Pure integer, NO imports (operates on caller buffers only).
15//
16// license_tier: ORIGINAL
17// module: nishi-core.write.parselex
18// depends:
19// capability: WRITE_LEXICON_PARSE
20
21// pack newline-separated non-empty lines into out as null-terminated strings
22func px_pack_lines(raw: *u8, n: i64, out: *u8, out_cap: i64) -> i64 {
23 var count: i64 = 0
24 var oi: i64 = 0
25 var i: i64 = 0
26 while i < n {
27 // find end of this line (stop at \n or \r)
28 var le: i64 = i
29 var go: i64 = 1
30 while go == 1 {
31 if le < n {
32 if raw[le] == (10 as u8) { go = 0 }
33 else { if raw[le] == (13 as u8) { go = 0 } else { le = le + 1 } }
34 } else { go = 0 }
35 }
36 if le > i { // non-empty line
37 var p: i64 = i
38 while p < le {
39 if oi < out_cap - 1 { out[oi] = raw[p]; oi = oi + 1 }
40 p = p + 1
41 }
42 if oi < out_cap - 1 { out[oi] = 0 as u8; oi = oi + 1 }
43 count = count + 1
44 }
45 // skip line terminators
46 i = le
47 var g2: i64 = 1
48 while g2 == 1 {
49 if i < n {
50 if raw[i] == (10 as u8) { i = i + 1 }
51 else { if raw[i] == (13 as u8) { i = i + 1 } else { g2 = 0 } }
52 } else { g2 = 0 }
53 }
54 }
55 return count
56}
57
58// pack "term <ws> number" lines; out gets packed terms, weights[k] the numbers
59func px_pack_weighted(raw: *u8, n: i64, out: *u8, out_cap: i64, weights: *i64) -> i64 {
60 var count: i64 = 0
61 var oi: i64 = 0
62 var i: i64 = 0
63 while i < n {
64 var le: i64 = i
65 var go: i64 = 1
66 while go == 1 {
67 if le < n {
68 if raw[le] == (10 as u8) { go = 0 }
69 else { if raw[le] == (13 as u8) { go = 0 } else { le = le + 1 } }
70 } else { go = 0 }
71 }
72 if le > i {
73 // term = up to first space/tab
74 var te: i64 = i
75 var g: i64 = 1
76 while g == 1 {
77 if te < le {
78 if raw[te] == (32 as u8) { g = 0 }
79 else { if raw[te] == (9 as u8) { g = 0 } else { te = te + 1 } }
80 } else { g = 0 }
81 }
82 var p: i64 = i
83 while p < te {
84 if oi < out_cap - 1 { out[oi] = raw[p]; oi = oi + 1 }
85 p = p + 1
86 }
87 if oi < out_cap - 1 { out[oi] = 0 as u8; oi = oi + 1 }
88 // number = first integer after the term
89 var q: i64 = te
90 var gq: i64 = 1
91 while gq == 1 {
92 if q < le {
93 if raw[q] == (32 as u8) { q = q + 1 }
94 else { if raw[q] == (9 as u8) { q = q + 1 } else { gq = 0 } }
95 } else { gq = 0 }
96 }
97 var val: i64 = 0
98 while q < le {
99 let c: i64 = raw[q] as i64
100 if c >= 48 { if c <= 57 { val = val * 10 + (c - 48) } }
101 q = q + 1
102 }
103 weights[count] = val
104 count = count + 1
105 }
106 i = le
107 var g2: i64 = 1
108 while g2 == 1 {
109 if i < n {
110 if raw[i] == (10 as u8) { i = i + 1 }
111 else { if raw[i] == (13 as u8) { i = i + 1 } else { g2 = 0 } }
112 } else { g2 = 0 }
113 }
114 }
115 return count
116}