code wiki / (root) / nx_parse_lex.nx

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}