code wiki / _hdl_build / nx_eg.nx
nx_eg.nx source
↩ module page · 720 lines · 67591 B
1// nx_eg.nx -- EMITTER-OF-EMITTERS GENERALIZED (X-AUT-006e-GEN, the daemon-class rung).
2// nx_eoe.nx proved the keystone on a BOUNDED shape: it pretty-prints `depth` NESTED COUNTING loops
3// from a single integer -- the SHAPE is baked, only a COUNT is data-driven. THIS organ removes the
4// ceiling: it is the parser's full DUAL -- a GENERIC recursive tree->source pretty-printer that reads a
5// STRUCTURAL-SKELETON-as-DATA table (a flat *i64 node array, same flat-record discipline as
6// nx_http_router's NX_ROUTE_F_*) and emits the matching NishiLang construct for each typed node kind:
7// SEQ / FUNC / DECL / ASSIGN / WHILE / IF / RETURN / STMT_CALL / EMIT. The control-flow STRUCTURE (which
8// loops, which branches, which calls, in what nesting) is now entirely DATA -- so an emitter whose
9// control flow is ABSENT from every prior emitter (a socket bind/listen/`while accept`/fork/flat-if
10// dispatch daemon) can be ORGAN-pretty-printed from its spec, never hand-written. nx_cc then turns that
11// source into machine code (control-flow synthesis DELEGATED to the compiler the team owns).
12//
13// THE MECHANISM SEEDED (one-time, declared, exactly like the EOE keystone in nx_eoe.nx:3-9): ONLY this
14// generic recursive pretty-printer. The BODY of any specific emitter is pretty-printed FROM ITS SPEC
15// TABLE, never hand-written. Dialect rails the walker enforces by construction: flat-ifs only (LM-002 --
16// an IF node holds ONE comparison and a then-seq; there is NO else node, compound guards become a
17// SEQUENCE of flat IFs), no &&/|| in emitted conditions (LM-001 -- a condition is a verbatim ARG string
18// the spec author keeps single-comparison), and any fragment the typed kinds do not model (a struct-cast,
19// a mask-after-shift port byte) rides an NK_EMIT verbatim-line node (the escape hatch, LM-005-safe).
20//
21// USAGE (driven by an in-organ spec selector, no hand-written emitter body):
22// nx_eg <which> <outbase> -> writes runtime/_hdl_build/<outbase>.nx by WALKING spec <which>
23// which = 0 -> the EOE-equivalent spec (PROOF-1 regression: re-author nx_eoe's depth-2 output shape)
24// which = 1 -> the DAEMON spec (PROOF-2: socket/bind/listen/accept/fork/flat-if -> /health 200)
25// which = 1 tamper>0 -> same daemon spec with one F_ARG0_PTR field flipped (NO-FAKE-GREEN: output MUST
26// differ -> KAT RED, proving the control flow + literals are spec-synthesized)
27// Sovereign (nx_cc/nxasm, no gcc/.sh). Additive: nx_eoe.nx untouched. license_tier: ORIGINAL
28import "nx_syscalls.nx"
29const NK_MAGIC_262144: i64 = 262144
30
31// ---- flat *i64 node-record layout (mirrors nx_http_router's NX_ROUTE_F_* discipline) ----
32// One AST node = NK_FIELDS i64 slots. *_PTR fields are (*u8 cast to i64) literal-string fragments;
33// CHILD0/CHILD1/SIB are node indices into the same table (-1 = none).
34const NK_FIELDS: i64 = 7
35const F_KIND: i64 = 0
36const F_ARG0: i64 = 1 // *u8 string fragment (name / cond / lhs / callee / verbatim line)
37const F_ARG1: i64 = 2 // *u8 string fragment (type / rhs / arglist)
38const F_ARG2: i64 = 3 // *u8 string fragment (init expr)
39const F_CHILD0: i64 = 4 // node index (body-seq / then-seq) or -1
40const F_CHILD1: i64 = 5 // node index (reserved) or -1
41const F_SIB: i64 = 6 // next sibling node index or -1 (SEQ child-list link)
42
43// ---- sealed node-kind enum ----
44const NK_SEQ: i64 = 0 // CHILD0 = first child; siblings chained via F_SIB
45const NK_DECL: i64 = 1 // ARG0 keyword(let/var), ARG1 "name: type", ARG2 init-expr -> "<kw> <name: type> = <init>"
46const NK_ASSIGN: i64 = 2 // ARG0 lhs, ARG1 rhs -> "<lhs> = <rhs>"
47const NK_WHILE: i64 = 3 // ARG0 cond, CHILD0 body-seq -> "while <cond> {\n<body>\n}"
48const NK_IF: i64 = 4 // ARG0 cond, CHILD0 then-seq (FLAT, no else) -> "if <cond> {\n<then>\n}"
49const NK_IF_INLINE: i64 = 5 // ARG0 cond, ARG1 single-stmt -> "if <cond> { <stmt> }" (one-line flat-if)
50const NK_RETURN: i64 = 6 // ARG0 expr -> "return <expr>"
51const NK_STMT_CALL: i64 = 7 // ARG0 = a bare statement line (call / expr-stmt) emitted verbatim + newline
52const NK_EMIT: i64 = 8 // ARG0 = a verbatim source line (escape hatch for fragments the kinds don't model)
53const NK_FUNC: i64 = 9 // ARG0 = full signature head "name(params) -> ret", CHILD0 body-seq
54
55// ---- string-spine helpers (eo_cat / eo_catn idioms reused verbatim from nx_eoe.nx) ----
56func eg_atoi(s: *u8) -> i64 { var n: i64 = 0; var i: i64 = 0; while s[i] != (0 as u8) { if s[i] >= (48 as u8) { if s[i] <= (57 as u8) { n = n * 10 + ((s[i] as i64) - 48) } } i = i + 1 } return n }
57func eg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } return off + i }
58func eg_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
59
60// emit `indent` levels of 4 spaces.
61func eg_indent(buf: *u8, off: i64, indent: i64) -> i64 {
62 var o: i64 = off
63 var k: i64 = 0
64 while k < indent { o = eg_cat(buf, o, " " as *u8); k = k + 1 }
65 return o
66}
67
68// ---- the GENERIC recursive pretty-printer: tree node -> NishiLang source ----
69// Walks spec[idx], emits the matching construct at `indent`, recurses into CHILD0 body-seqs, and (when
70// called on a SEQ) chains F_SIB siblings. This single function IS the synthesizer -- the SHAPE comes
71// entirely from the spec table, not from any per-construct hand code path.
72func eg_emit_node(buf: *u8, off: i64, spec: *i64, idx: i64, indent: i64) -> i64 {
73 if idx < 0 { return off }
74 let base: i64 = idx * NK_FIELDS
75 let kind: i64 = spec[base + F_KIND]
76 var o: i64 = off
77
78 if kind == NK_SEQ {
79 // child-list: walk CHILD0, then follow F_SIB chain. Each child emits at THIS indent.
80 var c: i64 = spec[base + F_CHILD0]
81 while c >= 0 {
82 o = eg_emit_node(buf, o, spec, c, indent)
83 c = spec[c * NK_FIELDS + F_SIB]
84 }
85 return o
86 }
87 if kind == NK_FUNC {
88 o = eg_cat(buf, o, "func " as *u8)
89 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8)
90 o = eg_cat(buf, o, " {\n" as *u8)
91 o = eg_emit_node(buf, o, spec, spec[base + F_CHILD0], indent + 1)
92 o = eg_cat(buf, o, "}\n" as *u8)
93 return o
94 }
95 if kind == NK_DECL {
96 o = eg_indent(buf, o, indent)
97 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8) // let / var
98 o = eg_cat(buf, o, " " as *u8)
99 o = eg_cat(buf, o, spec[base + F_ARG1] as *u8) // "name: type"
100 o = eg_cat(buf, o, " = " as *u8)
101 o = eg_cat(buf, o, spec[base + F_ARG2] as *u8) // init
102 o = eg_cat(buf, o, "\n" as *u8)
103 return o
104 }
105 if kind == NK_ASSIGN {
106 o = eg_indent(buf, o, indent)
107 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8) // lhs
108 o = eg_cat(buf, o, " = " as *u8)
109 o = eg_cat(buf, o, spec[base + F_ARG1] as *u8) // rhs
110 o = eg_cat(buf, o, "\n" as *u8)
111 return o
112 }
113 if kind == NK_WHILE {
114 o = eg_indent(buf, o, indent)
115 o = eg_cat(buf, o, "while " as *u8)
116 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8) // cond (single comparison, no &&/||)
117 o = eg_cat(buf, o, " {\n" as *u8)
118 o = eg_emit_node(buf, o, spec, spec[base + F_CHILD0], indent + 1)
119 o = eg_indent(buf, o, indent)
120 o = eg_cat(buf, o, "}\n" as *u8)
121 return o
122 }
123 if kind == NK_IF {
124 o = eg_indent(buf, o, indent)
125 o = eg_cat(buf, o, "if " as *u8)
126 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8) // cond (FLAT, single comparison)
127 o = eg_cat(buf, o, " {\n" as *u8)
128 o = eg_emit_node(buf, o, spec, spec[base + F_CHILD0], indent + 1)
129 o = eg_indent(buf, o, indent)
130 o = eg_cat(buf, o, "}\n" as *u8)
131 return o
132 }
133 if kind == NK_IF_INLINE {
134 o = eg_indent(buf, o, indent)
135 o = eg_cat(buf, o, "if " as *u8)
136 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8) // cond
137 o = eg_cat(buf, o, " { " as *u8)
138 o = eg_cat(buf, o, spec[base + F_ARG1] as *u8) // single stmt
139 o = eg_cat(buf, o, " }\n" as *u8)
140 return o
141 }
142 if kind == NK_RETURN {
143 o = eg_indent(buf, o, indent)
144 o = eg_cat(buf, o, "return " as *u8)
145 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8)
146 o = eg_cat(buf, o, "\n" as *u8)
147 return o
148 }
149 if kind == NK_STMT_CALL {
150 o = eg_indent(buf, o, indent)
151 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8) // full call statement
152 o = eg_cat(buf, o, "\n" as *u8)
153 return o
154 }
155 if kind == NK_EMIT {
156 // verbatim line (escape hatch) -- ARG0 is the FULL line WITHOUT indentation; we add indent.
157 o = eg_indent(buf, o, indent)
158 o = eg_cat(buf, o, spec[base + F_ARG0] as *u8)
159 o = eg_cat(buf, o, "\n" as *u8)
160 return o
161 }
162 return o
163}
164
165// ---- spec table allocation helpers (<=6 params each -- the calling-convention rail LM-BIGARGS: a
166// func with >6 params miscompiles under nxasm, so the 7-field node setter is SPLIT into a structural
167// setter eg_n(kind/child0/sib) + an arg setter eg_a(a0/a1/a2); child1 stays -1) ----
168func eg_n(spec: *i64, idx: i64, kind: i64, c0: i64, sib: i64) -> i64 {
169 let b: i64 = idx * NK_FIELDS
170 spec[b + F_KIND] = kind
171 spec[b + F_CHILD0] = c0
172 spec[b + F_CHILD1] = 0 - 1
173 spec[b + F_SIB] = sib
174 return 0
175}
176// eg_s sets ONE arg slot. LANDMINE (caught live 2026-06-13 in this build): passing MULTIPLE
177// string-literal args through one function call corrupts the 2nd+ pointer (calling-convention bug,
178// sibling of LM-BIGARGS) -- so the arg setter takes exactly ONE string per call.
179func eg_s(spec: *i64, idx: i64, slot: i64, val: i64) -> i64 {
180 spec[idx * NK_FIELDS + slot] = val
181 return 0
182}
183
184// =====================================================================================
185// SPEC 0 -- the EOE-equivalent (PROOF-1 regression): a self-contained module whose body is a SEQ of
186// DECL + nested WHILE counting loops, demonstrating the walker reproduces nx_eoe's *kind* of output
187// (DECL acc, WHILE i0, WHILE i1 nested, ASSIGN acc, emit byte) from a TABLE -- the bounded shape nx_eoe
188// hardcodes is here ONE instance of WHILE-nesting expressed as DATA.
189// =====================================================================================
190func eg_build_spec0(spec: *i64) -> i64 {
191 // node layout (indices): 0 FUNC main, 1 body SEQ, then statements 2.. linked by SIB.
192 // header (import + comment) is emitted separately by the caller (it is module-frame, not a node).
193 // statements:
194 // 2 DECL let acc... -> sib 3
195 // 3 WHILE i0 <= 10 body=seq 4 -> sib 9 (the final emit/return wrapper)
196 // 4 SEQ: child 5 DECL i1, sib via 5->6
197 // 5 DECL var i1 -> sib 6
198 // 6 WHILE i1 <= 10 body=seq 7 -> sib (-1)
199 // 7 SEQ: child 8 ASSIGN acc
200 // 8 ASSIGN acc = acc + i0 * i1 -> sib -1
201 // 9 RETURN acc-as-byte placeholder (kept simple: return 0)
202 eg_n(spec, 0, NK_FUNC, 1, 0 - 1); eg_s(spec, 0, F_ARG0, "main() -> i64" as *u8 as i64)
203 eg_n(spec, 1, NK_SEQ, 2, 0 - 1)
204 eg_n(spec, 2, NK_DECL, 0 - 1, 3); eg_s(spec, 2, F_ARG0, "var" as *u8 as i64); eg_s(spec, 2, F_ARG1, "acc: i64" as *u8 as i64); eg_s(spec, 2, F_ARG2, "0" as *u8 as i64)
205 eg_n(spec, 3, NK_WHILE, 4, 9); eg_s(spec, 3, F_ARG0, "i0 <= 10" as *u8 as i64)
206 eg_n(spec, 4, NK_SEQ, 5, 0 - 1)
207 eg_n(spec, 5, NK_DECL, 0 - 1, 6); eg_s(spec, 5, F_ARG0, "var" as *u8 as i64); eg_s(spec, 5, F_ARG1, "i1: i64" as *u8 as i64); eg_s(spec, 5, F_ARG2, "1" as *u8 as i64)
208 eg_n(spec, 6, NK_WHILE, 7, 0 - 1); eg_s(spec, 6, F_ARG0, "i1 <= 10" as *u8 as i64)
209 eg_n(spec, 7, NK_SEQ, 8, 0 - 1)
210 eg_n(spec, 8, NK_ASSIGN, 0 - 1, 0 - 1); eg_s(spec, 8, F_ARG0, "acc" as *u8 as i64); eg_s(spec, 8, F_ARG1, "acc + i0 * i1" as *u8 as i64)
211 eg_n(spec, 9, NK_RETURN, 0 - 1, 0 - 1); eg_s(spec, 9, F_ARG0, "0" as *u8 as i64)
212 return 0
213}
214
215// =====================================================================================
216// SPEC 1 -- the DAEMON (PROOF-2). Its control flow (socket->setsockopt->bind->listen->`while accept`->
217// `if cfd<0 continue`->fork->flat-if /health dispatch->send) is the byte-target of _eg_httpd_ref.nx.
218// The two helper functions (eh_find, main) and EVERY statement are NODES; the port literal and route
219// string ride F_ARG0 fields so a tamper flips the output (NO-FAKE-GREEN). `tamper`>0 flips the /health
220// route literal in node carrying the route -> the emitted GET pattern changes -> the daemon no longer
221// answers /health -> KAT RED, proving the route + control flow are spec-synthesized, not baked.
222// =====================================================================================
223func eg_build_spec1(spec: *i64, tamper: i64) -> i64 {
224 // ---- eh_find(buf, n, pat, plen) : the substring matcher (its own FUNC) ----
225 // body = SEQ[ DECL i, WHILE(i+plen<=n, SEQ[DECL j, DECL ok, WHILE(j<plen, inline-if), IF(ok==1,return), ASSIGN i]), RETURN 0 ]
226 eg_n(spec, 0, NK_FUNC, 1, 0 - 1); eg_s(spec, 0, F_ARG0, "eh_find(buf: *u8, n: i64, pat: *u8, plen: i64) -> i64" as *u8 as i64)
227 eg_n(spec, 1, NK_SEQ, 2, 0 - 1)
228 eg_n(spec, 2, NK_DECL, 0 - 1, 3); eg_s(spec, 2, F_ARG0, "var" as *u8 as i64); eg_s(spec, 2, F_ARG1, "i: i64" as *u8 as i64); eg_s(spec, 2, F_ARG2, "0" as *u8 as i64)
229 eg_n(spec, 3, NK_WHILE, 4, 14); eg_s(spec, 3, F_ARG0, "i + plen <= n" as *u8 as i64)
230 eg_n(spec, 4, NK_SEQ, 5, 0 - 1)
231 eg_n(spec, 5, NK_DECL, 0 - 1, 6); eg_s(spec, 5, F_ARG0, "var" as *u8 as i64); eg_s(spec, 5, F_ARG1, "j: i64" as *u8 as i64); eg_s(spec, 5, F_ARG2, "0" as *u8 as i64)
232 eg_n(spec, 6, NK_DECL, 0 - 1, 7); eg_s(spec, 6, F_ARG0, "var" as *u8 as i64); eg_s(spec, 6, F_ARG1, "ok: i64" as *u8 as i64); eg_s(spec, 6, F_ARG2, "1" as *u8 as i64)
233 eg_n(spec, 7, NK_WHILE, 8, 11); eg_s(spec, 7, F_ARG0, "j < plen" as *u8 as i64)
234 eg_n(spec, 8, NK_SEQ, 9, 0 - 1)
235 eg_n(spec, 9, NK_IF_INLINE, 0 - 1, 10); eg_s(spec, 9, F_ARG0, "buf[i+j] != pat[j]" as *u8 as i64); eg_s(spec, 9, F_ARG1, "ok = 0" as *u8 as i64)
236 eg_n(spec, 10, NK_ASSIGN, 0 - 1, 0 - 1); eg_s(spec, 10, F_ARG0, "j" as *u8 as i64); eg_s(spec, 10, F_ARG1, "j + 1" as *u8 as i64)
237 eg_n(spec, 11, NK_IF_INLINE, 0 - 1, 12); eg_s(spec, 11, F_ARG0, "ok == 1" as *u8 as i64); eg_s(spec, 11, F_ARG1, "return 1" as *u8 as i64)
238 eg_n(spec, 12, NK_ASSIGN, 0 - 1, 0 - 1); eg_s(spec, 12, F_ARG0, "i" as *u8 as i64); eg_s(spec, 12, F_ARG1, "i + 1" as *u8 as i64)
239 eg_n(spec, 14, NK_RETURN, 0 - 1, 0 - 1); eg_s(spec, 14, F_ARG0, "0" as *u8 as i64)
240
241 // ---- main() -> i64 : the daemon ----
242 // The route literal lives in a single F_ARG0; tamper flips it so the emitted matcher changes.
243 let route_lit: i64 = "GET /health" as *u8 as i64
244 var route_use: i64 = route_lit
245 if tamper > 0 { route_use = "GET /XXXXXXX" as *u8 as i64 }
246
247 eg_n(spec, 20, NK_FUNC, 21, 0 - 1); eg_s(spec, 20, F_ARG0, "main() -> i64" as *u8 as i64)
248 eg_n(spec, 21, NK_SEQ, 22, 0 - 1)
249 // statement chain via SIB starting at 22:
250 eg_n(spec, 22, NK_DECL, 0 - 1, 23); eg_s(spec, 22, F_ARG0, "let" as *u8 as i64); eg_s(spec, 22, F_ARG1, "port: i64" as *u8 as i64); eg_s(spec, 22, F_ARG2, "18080" as *u8 as i64)
251 eg_n(spec, 23, NK_DECL, 0 - 1, 24); eg_s(spec, 23, F_ARG0, "let" as *u8 as i64); eg_s(spec, 23, F_ARG1, "addr: *u8" as *u8 as i64); eg_s(spec, 23, F_ARG2, "sys_mmap(16)" as *u8 as i64)
252 // 16 addr byte writes as EMIT verbatim lines (mask-after-shift for port -- LM-005 in the literal text)
253 eg_n(spec, 24, NK_EMIT, 0 - 1, 25); eg_s(spec, 24, F_ARG0, "addr[0] = 2 as u8" as *u8 as i64)
254 eg_n(spec, 25, NK_EMIT, 0 - 1, 26); eg_s(spec, 25, F_ARG0, "addr[1] = 0 as u8" as *u8 as i64)
255 eg_n(spec, 26, NK_EMIT, 0 - 1, 27); eg_s(spec, 26, F_ARG0, "addr[2] = ((port >> 8) & 0xff) as u8" as *u8 as i64)
256 eg_n(spec, 27, NK_EMIT, 0 - 1, 28); eg_s(spec, 27, F_ARG0, "addr[3] = (port & 0xff) as u8" as *u8 as i64)
257 eg_n(spec, 28, NK_EMIT, 0 - 1, 29); eg_s(spec, 28, F_ARG0, "addr[4] = 127 as u8" as *u8 as i64)
258 eg_n(spec, 29, NK_EMIT, 0 - 1, 30); eg_s(spec, 29, F_ARG0, "addr[5] = 0 as u8" as *u8 as i64)
259 eg_n(spec, 30, NK_EMIT, 0 - 1, 31); eg_s(spec, 30, F_ARG0, "addr[6] = 0 as u8" as *u8 as i64)
260 eg_n(spec, 31, NK_EMIT, 0 - 1, 32); eg_s(spec, 31, F_ARG0, "addr[7] = 1 as u8" as *u8 as i64)
261 eg_n(spec, 32, NK_EMIT, 0 - 1, 33); eg_s(spec, 32, F_ARG0, "addr[8] = 0 as u8" as *u8 as i64)
262 eg_n(spec, 33, NK_EMIT, 0 - 1, 34); eg_s(spec, 33, F_ARG0, "addr[9] = 0 as u8" as *u8 as i64)
263 eg_n(spec, 34, NK_EMIT, 0 - 1, 35); eg_s(spec, 34, F_ARG0, "addr[10] = 0 as u8" as *u8 as i64)
264 eg_n(spec, 35, NK_EMIT, 0 - 1, 36); eg_s(spec, 35, F_ARG0, "addr[11] = 0 as u8" as *u8 as i64)
265 eg_n(spec, 36, NK_EMIT, 0 - 1, 37); eg_s(spec, 36, F_ARG0, "addr[12] = 0 as u8" as *u8 as i64)
266 eg_n(spec, 37, NK_EMIT, 0 - 1, 38); eg_s(spec, 37, F_ARG0, "addr[13] = 0 as u8" as *u8 as i64)
267 eg_n(spec, 38, NK_EMIT, 0 - 1, 39); eg_s(spec, 38, F_ARG0, "addr[14] = 0 as u8" as *u8 as i64)
268 eg_n(spec, 39, NK_EMIT, 0 - 1, 40); eg_s(spec, 39, F_ARG0, "addr[15] = 0 as u8" as *u8 as i64)
269 eg_n(spec, 40, NK_DECL, 0 - 1, 41); eg_s(spec, 40, F_ARG0, "let" as *u8 as i64); eg_s(spec, 40, F_ARG1, "lfd: i64" as *u8 as i64); eg_s(spec, 40, F_ARG2, "sys_socket(2, 1, 0)" as *u8 as i64)
270 eg_n(spec, 41, NK_IF_INLINE, 0 - 1, 42); eg_s(spec, 41, F_ARG0, "lfd < 0" as *u8 as i64); eg_s(spec, 41, F_ARG1, "return 10" as *u8 as i64)
271 eg_n(spec, 42, NK_DECL, 0 - 1, 43); eg_s(spec, 42, F_ARG0, "let" as *u8 as i64); eg_s(spec, 42, F_ARG1, "optval: *u8" as *u8 as i64); eg_s(spec, 42, F_ARG2, "sys_mmap(4)" as *u8 as i64)
272 eg_n(spec, 43, NK_EMIT, 0 - 1, 44); eg_s(spec, 43, F_ARG0, "optval[0] = 1 as u8" as *u8 as i64)
273 eg_n(spec, 44, NK_EMIT, 0 - 1, 45); eg_s(spec, 44, F_ARG0, "optval[1] = 0 as u8" as *u8 as i64)
274 eg_n(spec, 45, NK_EMIT, 0 - 1, 46); eg_s(spec, 45, F_ARG0, "optval[2] = 0 as u8" as *u8 as i64)
275 eg_n(spec, 46, NK_EMIT, 0 - 1, 47); eg_s(spec, 46, F_ARG0, "optval[3] = 0 as u8" as *u8 as i64)
276 eg_n(spec, 47, NK_STMT_CALL, 0 - 1, 48); eg_s(spec, 47, F_ARG0, "sys_setsockopt(lfd, 1, 2, optval, 4)" as *u8 as i64)
277 eg_n(spec, 48, NK_DECL, 0 - 1, 49); eg_s(spec, 48, F_ARG0, "let" as *u8 as i64); eg_s(spec, 48, F_ARG1, "brc: i64" as *u8 as i64); eg_s(spec, 48, F_ARG2, "sys_bind(lfd, addr, 16)" as *u8 as i64)
278 eg_n(spec, 49, NK_IF_INLINE, 0 - 1, 50); eg_s(spec, 49, F_ARG0, "brc < 0" as *u8 as i64); eg_s(spec, 49, F_ARG1, "return 20" as *u8 as i64)
279 eg_n(spec, 50, NK_DECL, 0 - 1, 51); eg_s(spec, 50, F_ARG0, "let" as *u8 as i64); eg_s(spec, 50, F_ARG1, "lrc: i64" as *u8 as i64); eg_s(spec, 50, F_ARG2, "sys_listen(lfd, 16)" as *u8 as i64)
280 eg_n(spec, 51, NK_IF_INLINE, 0 - 1, 52); eg_s(spec, 51, F_ARG0, "lrc < 0" as *u8 as i64); eg_s(spec, 51, F_ARG1, "return 30" as *u8 as i64)
281 eg_n(spec, 52, NK_DECL, 0 - 1, 53); eg_s(spec, 52, F_ARG0, "let" as *u8 as i64); eg_s(spec, 52, F_ARG1, "req: *u8" as *u8 as i64); eg_s(spec, 52, F_ARG2, "sys_mmap(4096)" as *u8 as i64)
282 eg_n(spec, 53, NK_DECL, 0 - 1, 54); eg_s(spec, 53, F_ARG0, "let" as *u8 as i64); eg_s(spec, 53, F_ARG1, "ok200: *u8" as *u8 as i64); eg_s(spec, 53, F_ARG2, "\"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nContent-Length: 2\\r\\nConnection: close\\r\\n\\r\\nok\" as *u8" as *u8 as i64)
283 eg_n(spec, 54, NK_DECL, 0 - 1, 55); eg_s(spec, 54, F_ARG0, "let" as *u8 as i64); eg_s(spec, 54, F_ARG1, "nf404: *u8" as *u8 as i64); eg_s(spec, 54, F_ARG2, "\"HTTP/1.1 404 Not Found\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nnot found\" as *u8" as *u8 as i64)
284 eg_n(spec, 55, NK_DECL, 0 - 1, 56); eg_s(spec, 55, F_ARG0, "var" as *u8 as i64); eg_s(spec, 55, F_ARG1, "served: i64" as *u8 as i64); eg_s(spec, 55, F_ARG2, "0" as *u8 as i64)
285 // the accept-loop (the control flow ABSENT from every prior emitter): WHILE served<64 { ... }
286 eg_n(spec, 56, NK_WHILE, 57, 75); eg_s(spec, 56, F_ARG0, "served < 64" as *u8 as i64)
287 eg_n(spec, 57, NK_SEQ, 58, 0 - 1)
288 eg_n(spec, 58, NK_DECL, 0 - 1, 59); eg_s(spec, 58, F_ARG0, "let" as *u8 as i64); eg_s(spec, 58, F_ARG1, "cfd: i64" as *u8 as i64); eg_s(spec, 58, F_ARG2, "sys_accept(lfd)" as *u8 as i64)
289 eg_n(spec, 59, NK_IF_INLINE, 0 - 1, 60); eg_s(spec, 59, F_ARG0, "cfd < 0" as *u8 as i64); eg_s(spec, 59, F_ARG1, "continue" as *u8 as i64)
290 eg_n(spec, 60, NK_DECL, 0 - 1, 61); eg_s(spec, 60, F_ARG0, "let" as *u8 as i64); eg_s(spec, 60, F_ARG1, "pid: i64" as *u8 as i64); eg_s(spec, 60, F_ARG2, "sys_fork()" as *u8 as i64)
291 // the CHILD branch: IF pid==0 { ...handle conn... }
292 eg_n(spec, 61, NK_IF, 62, 73); eg_s(spec, 61, F_ARG0, "pid == 0" as *u8 as i64)
293 eg_n(spec, 62, NK_SEQ, 63, 0 - 1)
294 eg_n(spec, 63, NK_STMT_CALL, 0 - 1, 64); eg_s(spec, 63, F_ARG0, "sys_close(lfd)" as *u8 as i64)
295 eg_n(spec, 64, NK_DECL, 0 - 1, 65); eg_s(spec, 64, F_ARG0, "let" as *u8 as i64); eg_s(spec, 64, F_ARG1, "rn: i64" as *u8 as i64); eg_s(spec, 64, F_ARG2, "sys_read(cfd, req, 4096)" as *u8 as i64)
296 eg_n(spec, 65, NK_DECL, 0 - 1, 66); eg_s(spec, 65, F_ARG0, "var" as *u8 as i64); eg_s(spec, 65, F_ARG1, "resp: *u8" as *u8 as i64); eg_s(spec, 65, F_ARG2, "nf404" as *u8 as i64)
297 eg_n(spec, 66, NK_DECL, 0 - 1, 67); eg_s(spec, 66, F_ARG0, "var" as *u8 as i64); eg_s(spec, 66, F_ARG1, "rlen: i64" as *u8 as i64); eg_s(spec, 66, F_ARG2, "99" as *u8 as i64)
298 // the route dispatch (flat-ifs, LM-002): is_health = eh_find(...,"GET /health",11); if is_health==1 {resp=ok200}; if is_health==1 {rlen=85}
299 eg_n(spec, 67, NK_EMIT, 0 - 1, 68) // ARG0 set below to carry the tamperable route literal
300 eg_n(spec, 68, NK_IF_INLINE, 0 - 1, 69); eg_s(spec, 68, F_ARG0, "is_health == 1" as *u8 as i64); eg_s(spec, 68, F_ARG1, "resp = ok200" as *u8 as i64)
301 eg_n(spec, 69, NK_IF_INLINE, 0 - 1, 70); eg_s(spec, 69, F_ARG0, "is_health == 1" as *u8 as i64); eg_s(spec, 69, F_ARG1, "rlen = 85" as *u8 as i64)
302 eg_n(spec, 70, NK_STMT_CALL, 0 - 1, 71); eg_s(spec, 70, F_ARG0, "sys_write(cfd, resp, rlen)" as *u8 as i64)
303 eg_n(spec, 71, NK_STMT_CALL, 0 - 1, 72); eg_s(spec, 71, F_ARG0, "sys_close(cfd)" as *u8 as i64)
304 eg_n(spec, 72, NK_STMT_CALL, 0 - 1, 0 - 1); eg_s(spec, 72, F_ARG0, "sys_exit(0)" as *u8 as i64)
305 // after the IF pid==0 block (node 61 sib 73): parent path
306 eg_n(spec, 73, NK_STMT_CALL, 0 - 1, 74); eg_s(spec, 73, F_ARG0, "sys_close(cfd)" as *u8 as i64)
307 eg_n(spec, 74, NK_ASSIGN, 0 - 1, 0 - 1); eg_s(spec, 74, F_ARG0, "served" as *u8 as i64); eg_s(spec, 74, F_ARG1, "served + 1" as *u8 as i64)
308 // after the accept WHILE (node 56 sib 75): close + return
309 eg_n(spec, 75, NK_STMT_CALL, 0 - 1, 76); eg_s(spec, 75, F_ARG0, "sys_close(lfd)" as *u8 as i64)
310 eg_n(spec, 76, NK_RETURN, 0 - 1, 0 - 1); eg_s(spec, 76, F_ARG0, "0" as *u8 as i64)
311
312 // node 67 carries the (tamperable) route line. Build it from route_use so tamper flips the bytes.
313 // emitted line: `let is_health: i64 = eh_find(req, rn, "GET /health" as *u8, 11)`
314 let rl: *u8 = sys_mmap(256)
315 var ro: i64 = 0
316 ro = eg_cat(rl, ro, "let is_health: i64 = eh_find(req, rn, \"" as *u8)
317 ro = eg_cat(rl, ro, route_use as *u8)
318 ro = eg_cat(rl, ro, "\" as *u8, 11)" as *u8)
319 rl[ro] = 0 as u8
320 spec[67 * NK_FIELDS + F_ARG0] = rl as i64
321 return 0
322}
323
324
325// =====================================================================================
326// SPEC 2 -- the GALLERY DAEMON (nx_gallery_serve). Authored hands-off by nx_eg from this structural
327// route-spec table: a 3-ROUTE flat-if dispatch (GET / browse grid -> gs_grid; GET /img/<CID> real
328// PNG bytes -> gs_serve_png; POST /rate same-origin EVAL O-line -> gs_rate). The route literals ride
329// tamperable F_ARG0 fields (built from route_use) so `tamper`>0 flips a matched route -> the daemon
330// no longer answers that route -> behavioral RED. Helper FUNC bodies ride NK_EMIT verbatim lines
331// (the LM-005-safe escape hatch, exactly as spec1 carries the addr[] byte writes). GENERATED FROM
332// _gallery_serve_ref.nx by the off-band _gen_spec2.py transcriber (the spec DATA is authored, the
333// daemon BODY is pretty-printed by eg_emit_node). license_tier: ORIGINAL
334// =====================================================================================
335// total nodes used: 291
336func eg_build_spec2(spec: *i64, tamper: i64) -> i64 {
337 var rl_root_use: i64 = "GET / " as *u8 as i64
338 if tamper > 0 { rl_root_use = "XXXXXX" as *u8 as i64 }
339 var rl_img_use: i64 = "GET /img/" as *u8 as i64
340 if tamper > 0 { rl_img_use = "XXXXXXXXX" as *u8 as i64 }
341 var rl_rate_use: i64 = "POST /rate" as *u8 as i64
342 if tamper > 0 { rl_rate_use = "XXXXXXXXXX" as *u8 as i64 }
343 eg_n(spec, 0, NK_FUNC, 1, 0 - 1); eg_s(spec, 0, F_ARG0, "eh_find(buf: *u8, n: i64, pat: *u8, plen: i64) -> i64" as *u8 as i64)
344 eg_n(spec, 1, NK_SEQ, 2, 0 - 1)
345 eg_n(spec, 2, NK_EMIT, 0 - 1, 3); eg_s(spec, 2, F_ARG0, "var i: i64 = 0" as *u8 as i64)
346 eg_n(spec, 3, NK_EMIT, 0 - 1, 4); eg_s(spec, 3, F_ARG0, "while i + plen <= n {" as *u8 as i64)
347 eg_n(spec, 4, NK_EMIT, 0 - 1, 5); eg_s(spec, 4, F_ARG0, " var j: i64 = 0" as *u8 as i64)
348 eg_n(spec, 5, NK_EMIT, 0 - 1, 6); eg_s(spec, 5, F_ARG0, " var ok: i64 = 1" as *u8 as i64)
349 eg_n(spec, 6, NK_EMIT, 0 - 1, 7); eg_s(spec, 6, F_ARG0, " while j < plen {" as *u8 as i64)
350 eg_n(spec, 7, NK_EMIT, 0 - 1, 8); eg_s(spec, 7, F_ARG0, " if buf[i+j] != pat[j] { ok = 0 }" as *u8 as i64)
351 eg_n(spec, 8, NK_EMIT, 0 - 1, 9); eg_s(spec, 8, F_ARG0, " j = j + 1" as *u8 as i64)
352 eg_n(spec, 9, NK_EMIT, 0 - 1, 10); eg_s(spec, 9, F_ARG0, " }" as *u8 as i64)
353 eg_n(spec, 10, NK_EMIT, 0 - 1, 11); eg_s(spec, 10, F_ARG0, " if ok == 1 { return 1 }" as *u8 as i64)
354 eg_n(spec, 11, NK_EMIT, 0 - 1, 12); eg_s(spec, 11, F_ARG0, " i = i + 1" as *u8 as i64)
355 eg_n(spec, 12, NK_EMIT, 0 - 1, 13); eg_s(spec, 12, F_ARG0, "}" as *u8 as i64)
356 eg_n(spec, 13, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 13, F_ARG0, "return 0" as *u8 as i64)
357 eg_n(spec, 14, NK_FUNC, 15, 0 - 1); eg_s(spec, 14, F_ARG0, "gs_cat(dst: *u8, off: i64, s: *u8) -> i64" as *u8 as i64)
358 eg_n(spec, 15, NK_SEQ, 16, 0 - 1)
359 eg_n(spec, 16, NK_EMIT, 0 - 1, 17); eg_s(spec, 16, F_ARG0, "var i: i64 = 0" as *u8 as i64)
360 eg_n(spec, 17, NK_EMIT, 0 - 1, 18); eg_s(spec, 17, F_ARG0, "while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 }" as *u8 as i64)
361 eg_n(spec, 18, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 18, F_ARG0, "return off + i" as *u8 as i64)
362 eg_n(spec, 19, NK_FUNC, 20, 0 - 1); eg_s(spec, 19, F_ARG0, "gs_u(dst: *u8, off: i64, v: i64) -> i64" as *u8 as i64)
363 eg_n(spec, 20, NK_SEQ, 21, 0 - 1)
364 eg_n(spec, 21, NK_EMIT, 0 - 1, 22); eg_s(spec, 21, F_ARG0, "var m: i64 = v" as *u8 as i64)
365 eg_n(spec, 22, NK_EMIT, 0 - 1, 23); eg_s(spec, 22, F_ARG0, "let t: *u8 = sys_mmap(28)" as *u8 as i64)
366 eg_n(spec, 23, NK_EMIT, 0 - 1, 24); eg_s(spec, 23, F_ARG0, "var k: i64 = 0" as *u8 as i64)
367 eg_n(spec, 24, NK_EMIT, 0 - 1, 25); eg_s(spec, 24, F_ARG0, "if m == 0 { t[0] = 48 as u8; k = 1 }" as *u8 as i64)
368 eg_n(spec, 25, NK_EMIT, 0 - 1, 26); eg_s(spec, 25, F_ARG0, "while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }" as *u8 as i64)
369 eg_n(spec, 26, NK_EMIT, 0 - 1, 27); eg_s(spec, 26, F_ARG0, "var o: i64 = off" as *u8 as i64)
370 eg_n(spec, 27, NK_EMIT, 0 - 1, 28); eg_s(spec, 27, F_ARG0, "var i: i64 = 0" as *u8 as i64)
371 eg_n(spec, 28, NK_EMIT, 0 - 1, 29); eg_s(spec, 28, F_ARG0, "while i < k { dst[o] = t[k-1-i]; o = o + 1; i = i + 1 }" as *u8 as i64)
372 eg_n(spec, 29, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 29, F_ARG0, "return o" as *u8 as i64)
373 eg_n(spec, 30, NK_FUNC, 31, 0 - 1); eg_s(spec, 30, F_ARG0, "gs_grid_body(body: *u8, off: i64, prefix: *u8) -> i64" as *u8 as i64)
374 eg_n(spec, 31, NK_SEQ, 32, 0 - 1)
375 eg_n(spec, 32, NK_EMIT, 0 - 1, 33); eg_s(spec, 32, F_ARG0, "var o: i64 = off" as *u8 as i64)
376 eg_n(spec, 33, NK_EMIT, 0 - 1, 34); eg_s(spec, 33, F_ARG0, "let segs: *i64 = sys_mmap(8 * 8192) as *i64" as *u8 as i64)
377 eg_n(spec, 34, NK_EMIT, 0 - 1, 35); eg_s(spec, 34, F_ARG0, "let ns: i64 = ss_manifest_cap(prefix, segs, 8192)" as *u8 as i64)
378 eg_n(spec, 35, NK_EMIT, 0 - 1, 36); eg_s(spec, 35, F_ARG0, "var s: i64 = 0" as *u8 as i64)
379 eg_n(spec, 36, NK_EMIT, 0 - 1, 37); eg_s(spec, 36, F_ARG0, "while s < ns {" as *u8 as i64)
380 eg_n(spec, 37, NK_EMIT, 0 - 1, 38); eg_s(spec, 37, F_ARG0, " let path: *u8 = sys_mmap(512)" as *u8 as i64)
381 eg_n(spec, 38, NK_EMIT, 0 - 1, 39); eg_s(spec, 38, F_ARG0, " var po: i64 = 0" as *u8 as i64)
382 eg_n(spec, 39, NK_EMIT, 0 - 1, 40); eg_s(spec, 39, F_ARG0, " po = gs_cat(path, po, prefix)" as *u8 as i64)
383 eg_n(spec, 40, NK_EMIT, 0 - 1, 41); eg_s(spec, 40, F_ARG0, " po = gs_cat(path, po, segs[s] as *u8)" as *u8 as i64)
384 eg_n(spec, 41, NK_EMIT, 0 - 1, 42); eg_s(spec, 41, F_ARG0, " po = gs_cat(path, po, \".docs\" as *u8)" as *u8 as i64)
385 eg_n(spec, 42, NK_EMIT, 0 - 1, 43); eg_s(spec, 42, F_ARG0, " path[po] = 0 as u8" as *u8 as i64)
386 eg_n(spec, 43, NK_EMIT, 0 - 1, 44); eg_s(spec, 43, F_ARG0, " let szp: *i64 = sys_mmap(16) as *i64" as *u8 as i64)
387 eg_n(spec, 44, NK_EMIT, 0 - 1, 45); eg_s(spec, 44, F_ARG0, " let b: *u8 = sys_read_file(path, szp)" as *u8 as i64)
388 eg_n(spec, 45, NK_EMIT, 0 - 1, 46); eg_s(spec, 45, F_ARG0, " let sz: i64 = szp[0]" as *u8 as i64)
389 eg_n(spec, 46, NK_EMIT, 0 - 1, 47); eg_s(spec, 46, F_ARG0, " var i: i64 = 0" as *u8 as i64)
390 eg_n(spec, 47, NK_EMIT, 0 - 1, 48); eg_s(spec, 47, F_ARG0, " while i + 9 <= sz {" as *u8 as i64)
391 eg_n(spec, 48, NK_EMIT, 0 - 1, 49); eg_s(spec, 48, F_ARG0, " let kl: i64 = ss_r32(b, i + 1)" as *u8 as i64)
392 eg_n(spec, 49, NK_EMIT, 0 - 1, 50); eg_s(spec, 49, F_ARG0, " let koff: i64 = i + 5" as *u8 as i64)
393 eg_n(spec, 50, NK_EMIT, 0 - 1, 51); eg_s(spec, 50, F_ARG0, " let vl: i64 = ss_r32(b, koff + kl)" as *u8 as i64)
394 eg_n(spec, 51, NK_EMIT, 0 - 1, 52); eg_s(spec, 51, F_ARG0, " let voff: i64 = koff + kl + 4" as *u8 as i64)
395 eg_n(spec, 52, NK_EMIT, 0 - 1, 53); eg_s(spec, 52, F_ARG0, " var isimg: i64 = 0" as *u8 as i64)
396 eg_n(spec, 53, NK_EMIT, 0 - 1, 54); eg_s(spec, 53, F_ARG0, " if kl == 73 {" as *u8 as i64)
397 eg_n(spec, 54, NK_EMIT, 0 - 1, 55); eg_s(spec, 54, F_ARG0, " isimg = 1" as *u8 as i64)
398 eg_n(spec, 55, NK_EMIT, 0 - 1, 56); eg_s(spec, 55, F_ARG0, " if b[koff] != (105 as u8) { isimg = 0 }" as *u8 as i64)
399 eg_n(spec, 56, NK_EMIT, 0 - 1, 57); eg_s(spec, 56, F_ARG0, " if b[koff+1] != (109 as u8) { isimg = 0 }" as *u8 as i64)
400 eg_n(spec, 57, NK_EMIT, 0 - 1, 58); eg_s(spec, 57, F_ARG0, " if b[koff+2] != (103 as u8) { isimg = 0 }" as *u8 as i64)
401 eg_n(spec, 58, NK_EMIT, 0 - 1, 59); eg_s(spec, 58, F_ARG0, " if b[koff+3] != (58 as u8) { isimg = 0 }" as *u8 as i64)
402 eg_n(spec, 59, NK_EMIT, 0 - 1, 60); eg_s(spec, 59, F_ARG0, " }" as *u8 as i64)
403 eg_n(spec, 60, NK_EMIT, 0 - 1, 61); eg_s(spec, 60, F_ARG0, " if isimg == 1 {" as *u8 as i64)
404 eg_n(spec, 61, NK_EMIT, 0 - 1, 62); eg_s(spec, 61, F_ARG0, " o = gs_cat(body, o, \"<a class=\\\"cell\\\" href=\\\"/img/\" as *u8)" as *u8 as i64)
405 eg_n(spec, 62, NK_EMIT, 0 - 1, 63); eg_s(spec, 62, F_ARG0, " var c: i64 = 0" as *u8 as i64)
406 eg_n(spec, 63, NK_EMIT, 0 - 1, 64); eg_s(spec, 63, F_ARG0, " while c < 69 { body[o] = b[koff + 4 + c]; o = o + 1; c = c + 1 }" as *u8 as i64)
407 eg_n(spec, 64, NK_EMIT, 0 - 1, 65); eg_s(spec, 64, F_ARG0, " o = gs_cat(body, o, \"\\\"><img loading=lazy src=\\\"/img/\" as *u8)" as *u8 as i64)
408 eg_n(spec, 65, NK_EMIT, 0 - 1, 66); eg_s(spec, 65, F_ARG0, " c = 0" as *u8 as i64)
409 eg_n(spec, 66, NK_EMIT, 0 - 1, 67); eg_s(spec, 66, F_ARG0, " while c < 69 { body[o] = b[koff + 4 + c]; o = o + 1; c = c + 1 }" as *u8 as i64)
410 eg_n(spec, 67, NK_EMIT, 0 - 1, 68); eg_s(spec, 67, F_ARG0, " o = gs_cat(body, o, \"\\\" width=\\\"160\\\"><div>\" as *u8)" as *u8 as i64)
411 eg_n(spec, 68, NK_EMIT, 0 - 1, 69); eg_s(spec, 68, F_ARG0, " c = 0" as *u8 as i64)
412 eg_n(spec, 69, NK_EMIT, 0 - 1, 70); eg_s(spec, 69, F_ARG0, " while c < 69 { body[o] = b[koff + 4 + c]; o = o + 1; c = c + 1 }" as *u8 as i64)
413 eg_n(spec, 70, NK_EMIT, 0 - 1, 71); eg_s(spec, 70, F_ARG0, " o = gs_cat(body, o, \"</div></a>\\n\" as *u8)" as *u8 as i64)
414 eg_n(spec, 71, NK_EMIT, 0 - 1, 72); eg_s(spec, 71, F_ARG0, " }" as *u8 as i64)
415 eg_n(spec, 72, NK_EMIT, 0 - 1, 73); eg_s(spec, 72, F_ARG0, " i = voff + vl" as *u8 as i64)
416 eg_n(spec, 73, NK_EMIT, 0 - 1, 74); eg_s(spec, 73, F_ARG0, " }" as *u8 as i64)
417 eg_n(spec, 74, NK_EMIT, 0 - 1, 75); eg_s(spec, 74, F_ARG0, " s = s + 1" as *u8 as i64)
418 eg_n(spec, 75, NK_EMIT, 0 - 1, 76); eg_s(spec, 75, F_ARG0, "}" as *u8 as i64)
419 eg_n(spec, 76, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 76, F_ARG0, "return o" as *u8 as i64)
420 eg_n(spec, 77, NK_FUNC, 78, 0 - 1); eg_s(spec, 77, F_ARG0, "gs_grid(rbuf: *u8, prefix: *u8) -> i64" as *u8 as i64)
421 eg_n(spec, 78, NK_SEQ, 79, 0 - 1)
422 eg_n(spec, 79, NK_EMIT, 0 - 1, 80); eg_s(spec, 79, F_ARG0, "let body: *u8 = sys_mmap(4194304)" as *u8 as i64)
423 eg_n(spec, 80, NK_EMIT, 0 - 1, 81); eg_s(spec, 80, F_ARG0, "var bo: i64 = 0" as *u8 as i64)
424 eg_n(spec, 81, NK_EMIT, 0 - 1, 82); eg_s(spec, 81, F_ARG0, "bo = gs_cat(body, bo, \"<!doctype html><meta charset=utf-8><title>Nishi Gallery</title><style>:root{--bg:#0b0d10;--fg:#e6e8eb;--mut:#8b929c;--card:#15181d;--acc:#5b9dff;--bd:#222831}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--fg);font:14px/1.5 Inter,system-ui,sans-serif}h1{font-size:18px;font-weight:600;padding:14px 20px;margin:0;position:sticky;top:0;background:rgba(11,13,16,.92);border-bottom:1px solid var(--bd);z-index:5}h1 .count{font-size:12px;color:var(--mut);font-weight:400;margin-left:12px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;padding:16px}.cell{position:relative;display:block;border-radius:10px;overflow:hidden;background:var(--card);border:1px solid var(--bd);cursor:pointer;aspect-ratio:1;transition:transform .12s,border-color .12s}.cell:hover{transform:translateY(-2px);border-color:var(--acc)}.cell img{width:100%;height:100%;object-fit:cover;display:block}.cell>div{display:none}#lb{position:fixed;inset:0;background:rgba(0,0,0,.93);display:none;z-index:50}#lb.on{display:grid;grid-template-columns:1fr 340px}#lbimg{display:flex;align-items:center;justify-content:center;padding:24px;overflow:hidden}#lbimg img{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px}#lbside{background:var(--card);border-left:1px solid var(--bd);padding:22px;overflow:auto}#lbside h2{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--mut);margin:18px 0 8px}#lbside h2:first-child{margin-top:0}.fac{font-size:12px;display:flex;justify-content:space-between;gap:12px;padding:5px 0;border-bottom:1px solid var(--bd)}.fac b{color:var(--mut);font-weight:500;white-space:nowrap}.fac span{text-align:right;word-break:break-word}#rng{width:100%;margin:6px 0}#rval{font-size:26px;font-weight:700;color:var(--acc)}#rbtn{width:100%;background:var(--acc);color:#06101f;border:0;border-radius:8px;padding:11px;font-weight:600;cursor:pointer;margin-top:8px}#rmsg{font-size:12px;color:#5ad08a;min-height:16px;margin-top:6px}#lbx{position:absolute;top:12px;right:16px;color:#fff;font-size:30px;cursor:pointer;opacity:.7;z-index:60}#lbx:hover{opacity:1}.nav{position:absolute;top:50%;transform:translateY(-50%);font-size:44px;color:#fff;opacity:.45;cursor:pointer;padding:16px;user-select:none;z-index:60}.nav:hover{opacity:1}#pv{left:6px}#nx{right:348px}</style><body><h1>Nishi Gallery</h1><div class=grid>\\n\" as *u8)" as *u8 as i64)
425 eg_n(spec, 82, NK_EMIT, 0 - 1, 83); eg_s(spec, 82, F_ARG0, "bo = gs_grid_body(body, bo, prefix)" as *u8 as i64)
426 eg_n(spec, 83, NK_EMIT, 0 - 1, 84); eg_s(spec, 83, F_ARG0, "bo = gs_cat(body, bo, \"</div><script>(function(){var g=document.querySelector('.grid');if(!g)return;var cells=[].slice.call(g.querySelectorAll('.cell'));var cids=cells.map(function(c){return c.getAttribute('href').replace('/img/','')});var i=-1;var lb=document.createElement('div');lb.id='lb';lb.innerHTML='<div id=lbimg><img id=lbi></div><span id=lbx>×</span><span class=nav id=pv>‹</span><span class=nav id=nx>›</span><div id=lbside><h2>Generation factors</h2><div id=fac></div><h2>Rate this image</h2><div id=rval>500</div><input type=range min=0 max=1000 value=500 id=rng><button id=rbtn>Submit rating</button><div id=rmsg></div></div>';document.body.appendChild(lb);var lbi=document.getElementById('lbi'),fac=document.getElementById('fac'),rng=document.getElementById('rng'),rval=document.getElementById('rval'),rmsg=document.getElementById('rmsg');function esc(s){return String(s).replace(/[<]/g,'<')}function show(n){i=n;var cid=cids[i];lbi.src='/img/'+cid;lb.classList.add('on');rmsg.textContent='';rng.value=500;rval.textContent='500';fac.innerHTML='<div class=fac><b>loading</b></div>';fetch('/meta/'+cid).then(function(r){return r.json()}).then(function(m){var k=Object.keys(m);fac.innerHTML=k.length?k.map(function(x){return '<div class=fac><b>'+esc(x)+'</b><span>'+esc(m[x])+'</span></div>'}).join(''):'<div class=fac><b>no factors</b></div>'}).catch(function(){fac.innerHTML='<div class=fac><b>factors unavailable</b></div>'})}function hide(){lb.classList.remove('on');i=-1}g.addEventListener('click',function(e){var a=e.target.closest('.cell');if(a){e.preventDefault();show(cells.indexOf(a))}});document.getElementById('lbx').onclick=hide;document.getElementById('pv').onclick=function(){if(i>0)show(i-1)};document.getElementById('nx').onclick=function(){if(i<cids.length-1)show(i+1)};rng.oninput=function(){rval.textContent=rng.value};document.getElementById('rbtn').onclick=function(){var cid=cids[i];fetch('/rate',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'img='+cid+'&score='+rng.value}).then(function(r){rmsg.textContent=r.ok?'Saved - score '+rng.value:'Error '+r.status}).catch(function(){rmsg.textContent='Network error'})};document.addEventListener('keydown',function(e){if(i<0)return;if(e.key==='Escape')hide();else if(e.key==='ArrowLeft'&&i>0)show(i-1);else if(e.key==='ArrowRight'&&i<cids.length-1)show(i+1)});var h=document.querySelector('h1');if(h){var s=document.createElement('span');s.className='count';s.textContent=cids.length+' images';h.appendChild(s)}})();</script></body>\" as *u8)" as *u8 as i64)
427 eg_n(spec, 84, NK_EMIT, 0 - 1, 85); eg_s(spec, 84, F_ARG0, "var o: i64 = 0" as *u8 as i64)
428 eg_n(spec, 85, NK_EMIT, 0 - 1, 86); eg_s(spec, 85, F_ARG0, "o = gs_cat(rbuf, o, \"HTTP/1.1 200 OK\\r\\nContent-Type: text/html\\r\\nContent-Length: \" as *u8)" as *u8 as i64)
429 eg_n(spec, 86, NK_EMIT, 0 - 1, 87); eg_s(spec, 86, F_ARG0, "o = gs_u(rbuf, o, bo)" as *u8 as i64)
430 eg_n(spec, 87, NK_EMIT, 0 - 1, 88); eg_s(spec, 87, F_ARG0, "o = gs_cat(rbuf, o, \"\\r\\nConnection: close\\r\\n\\r\\n\" as *u8)" as *u8 as i64)
431 eg_n(spec, 88, NK_EMIT, 0 - 1, 89); eg_s(spec, 88, F_ARG0, "var i: i64 = 0" as *u8 as i64)
432 eg_n(spec, 89, NK_EMIT, 0 - 1, 90); eg_s(spec, 89, F_ARG0, "while i < bo { rbuf[o] = body[i]; o = o + 1; i = i + 1 }" as *u8 as i64)
433 eg_n(spec, 90, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 90, F_ARG0, "return o" as *u8 as i64)
434 eg_n(spec, 91, NK_FUNC, 92, 0 - 1); eg_s(spec, 91, F_ARG0, "gs_peel_cid(req: *u8, rn: i64, cidout: *u8) -> i64" as *u8 as i64)
435 eg_n(spec, 92, NK_SEQ, 93, 0 - 1)
436 eg_n(spec, 93, NK_EMIT, 0 - 1, 94); eg_s(spec, 93, F_ARG0, "let pat: *u8 = \"GET /img/\" as *u8" as *u8 as i64)
437 eg_n(spec, 94, NK_EMIT, 0 - 1, 95); eg_s(spec, 94, F_ARG0, "var i: i64 = 0" as *u8 as i64)
438 eg_n(spec, 95, NK_EMIT, 0 - 1, 96); eg_s(spec, 95, F_ARG0, "var at: i64 = 0 - 1" as *u8 as i64)
439 eg_n(spec, 96, NK_EMIT, 0 - 1, 97); eg_s(spec, 96, F_ARG0, "while i + 9 <= rn {" as *u8 as i64)
440 eg_n(spec, 97, NK_EMIT, 0 - 1, 98); eg_s(spec, 97, F_ARG0, " var j: i64 = 0" as *u8 as i64)
441 eg_n(spec, 98, NK_EMIT, 0 - 1, 99); eg_s(spec, 98, F_ARG0, " var ok: i64 = 1" as *u8 as i64)
442 eg_n(spec, 99, NK_EMIT, 0 - 1, 100); eg_s(spec, 99, F_ARG0, " while j < 9 { if req[i+j] != pat[j] { ok = 0 } j = j + 1 }" as *u8 as i64)
443 eg_n(spec, 100, NK_EMIT, 0 - 1, 101); eg_s(spec, 100, F_ARG0, " if ok == 1 { if at < 0 { at = i + 9 } }" as *u8 as i64)
444 eg_n(spec, 101, NK_EMIT, 0 - 1, 102); eg_s(spec, 101, F_ARG0, " i = i + 1" as *u8 as i64)
445 eg_n(spec, 102, NK_EMIT, 0 - 1, 103); eg_s(spec, 102, F_ARG0, "}" as *u8 as i64)
446 eg_n(spec, 103, NK_EMIT, 0 - 1, 104); eg_s(spec, 103, F_ARG0, "if at < 0 { return 0 }" as *u8 as i64)
447 eg_n(spec, 104, NK_EMIT, 0 - 1, 105); eg_s(spec, 104, F_ARG0, "var c: i64 = 0" as *u8 as i64)
448 eg_n(spec, 105, NK_EMIT, 0 - 1, 106); eg_s(spec, 105, F_ARG0, "while c < 69 { cidout[c] = req[at + c]; c = c + 1 }" as *u8 as i64)
449 eg_n(spec, 106, NK_EMIT, 0 - 1, 107); eg_s(spec, 106, F_ARG0, "cidout[69] = 0 as u8" as *u8 as i64)
450 eg_n(spec, 107, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 107, F_ARG0, "return 1" as *u8 as i64)
451 eg_n(spec, 108, NK_FUNC, 109, 0 - 1); eg_s(spec, 108, F_ARG0, "gs_sidecar(cid: *u8, pathout: *u8) -> i64" as *u8 as i64)
452 eg_n(spec, 109, NK_SEQ, 110, 0 - 1)
453 eg_n(spec, 110, NK_EMIT, 0 - 1, 111); eg_s(spec, 110, F_ARG0, "let szp: *i64 = sys_mmap(16) as *i64" as *u8 as i64)
454 eg_n(spec, 111, NK_EMIT, 0 - 1, 112); eg_s(spec, 111, F_ARG0, "let b: *u8 = sys_read_file(\"knowledge/status/galx_cid_paths.tsv\" as *u8, szp)" as *u8 as i64)
455 eg_n(spec, 112, NK_EMIT, 0 - 1, 113); eg_s(spec, 112, F_ARG0, "let sz: i64 = szp[0]" as *u8 as i64)
456 eg_n(spec, 113, NK_EMIT, 0 - 1, 114); eg_s(spec, 113, F_ARG0, "if (b as i64) == 0 { return 0 }" as *u8 as i64)
457 eg_n(spec, 114, NK_EMIT, 0 - 1, 115); eg_s(spec, 114, F_ARG0, "var i: i64 = 0" as *u8 as i64)
458 eg_n(spec, 115, NK_EMIT, 0 - 1, 116); eg_s(spec, 115, F_ARG0, "var ls: i64 = 0" as *u8 as i64)
459 eg_n(spec, 116, NK_EMIT, 0 - 1, 117); eg_s(spec, 116, F_ARG0, "while i < sz {" as *u8 as i64)
460 eg_n(spec, 117, NK_EMIT, 0 - 1, 118); eg_s(spec, 117, F_ARG0, " if b[i] == (10 as u8) {" as *u8 as i64)
461 eg_n(spec, 118, NK_EMIT, 0 - 1, 119); eg_s(spec, 118, F_ARG0, " var eq: i64 = 1" as *u8 as i64)
462 eg_n(spec, 119, NK_EMIT, 0 - 1, 120); eg_s(spec, 119, F_ARG0, " var k: i64 = 0" as *u8 as i64)
463 eg_n(spec, 120, NK_EMIT, 0 - 1, 121); eg_s(spec, 120, F_ARG0, " while k < 69 { if b[ls + k] != cid[k] { eq = 0 } k = k + 1 }" as *u8 as i64)
464 eg_n(spec, 121, NK_EMIT, 0 - 1, 122); eg_s(spec, 121, F_ARG0, " if b[ls + 69] != (9 as u8) { eq = 0 }" as *u8 as i64)
465 eg_n(spec, 122, NK_EMIT, 0 - 1, 123); eg_s(spec, 122, F_ARG0, " if eq == 1 {" as *u8 as i64)
466 eg_n(spec, 123, NK_EMIT, 0 - 1, 124); eg_s(spec, 123, F_ARG0, " var po: i64 = 0" as *u8 as i64)
467 eg_n(spec, 124, NK_EMIT, 0 - 1, 125); eg_s(spec, 124, F_ARG0, " var p: i64 = ls + 70" as *u8 as i64)
468 eg_n(spec, 125, NK_EMIT, 0 - 1, 126); eg_s(spec, 125, F_ARG0, " while p < i { pathout[po] = b[p]; po = po + 1; p = p + 1 }" as *u8 as i64)
469 eg_n(spec, 126, NK_EMIT, 0 - 1, 127); eg_s(spec, 126, F_ARG0, " pathout[po] = 0 as u8" as *u8 as i64)
470 eg_n(spec, 127, NK_EMIT, 0 - 1, 128); eg_s(spec, 127, F_ARG0, " return 1" as *u8 as i64)
471 eg_n(spec, 128, NK_EMIT, 0 - 1, 129); eg_s(spec, 128, F_ARG0, " }" as *u8 as i64)
472 eg_n(spec, 129, NK_EMIT, 0 - 1, 130); eg_s(spec, 129, F_ARG0, " ls = i + 1" as *u8 as i64)
473 eg_n(spec, 130, NK_EMIT, 0 - 1, 131); eg_s(spec, 130, F_ARG0, " }" as *u8 as i64)
474 eg_n(spec, 131, NK_EMIT, 0 - 1, 132); eg_s(spec, 131, F_ARG0, " i = i + 1" as *u8 as i64)
475 eg_n(spec, 132, NK_EMIT, 0 - 1, 133); eg_s(spec, 132, F_ARG0, "}" as *u8 as i64)
476 eg_n(spec, 133, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 133, F_ARG0, "return 0" as *u8 as i64)
477 eg_n(spec, 134, NK_FUNC, 135, 0 - 1); eg_s(spec, 134, F_ARG0, "gs_serve_png(rbuf: *u8, req: *u8, rn: i64, root: *u8) -> i64" as *u8 as i64)
478 eg_n(spec, 135, NK_SEQ, 136, 0 - 1)
479 eg_n(spec, 136, NK_EMIT, 0 - 1, 137); eg_s(spec, 136, F_ARG0, "let cid: *u8 = sys_mmap(96)" as *u8 as i64)
480 eg_n(spec, 137, NK_EMIT, 0 - 1, 138); eg_s(spec, 137, F_ARG0, "let havec: i64 = gs_peel_cid(req, rn, cid)" as *u8 as i64)
481 eg_n(spec, 138, NK_EMIT, 0 - 1, 139); eg_s(spec, 138, F_ARG0, "if havec == 0 { return gs_cat(rbuf, 0, \"HTTP/1.1 404 Not Found\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nnot found\" as *u8) }" as *u8 as i64)
482 eg_n(spec, 139, NK_EMIT, 0 - 1, 140); eg_s(spec, 139, F_ARG0, "let path: *u8 = sys_mmap(512)" as *u8 as i64)
483 eg_n(spec, 140, NK_EMIT, 0 - 1, 141); eg_s(spec, 140, F_ARG0, "let havep: i64 = gs_sidecar(cid, path)" as *u8 as i64)
484 eg_n(spec, 141, NK_EMIT, 0 - 1, 142); eg_s(spec, 141, F_ARG0, "if havep == 0 { return gs_cat(rbuf, 0, \"HTTP/1.1 404 Not Found\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nnot found\" as *u8) }" as *u8 as i64)
485 eg_n(spec, 142, NK_EMIT, 0 - 1, 143); eg_s(spec, 142, F_ARG0, "let szp: *i64 = sys_mmap(16) as *i64" as *u8 as i64)
486 eg_n(spec, 143, NK_EMIT, 0 - 1, 144); eg_s(spec, 143, F_ARG0, "let png: *u8 = sys_read_file(path, szp)" as *u8 as i64)
487 eg_n(spec, 144, NK_EMIT, 0 - 1, 145); eg_s(spec, 144, F_ARG0, "let plen: i64 = szp[0]" as *u8 as i64)
488 eg_n(spec, 145, NK_EMIT, 0 - 1, 146); eg_s(spec, 145, F_ARG0, "if (png as i64) == 0 { return gs_cat(rbuf, 0, \"HTTP/1.1 404 Not Found\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nnot found\" as *u8) }" as *u8 as i64)
489 eg_n(spec, 146, NK_EMIT, 0 - 1, 147); eg_s(spec, 146, F_ARG0, "var o: i64 = 0" as *u8 as i64)
490 eg_n(spec, 147, NK_EMIT, 0 - 1, 148); eg_s(spec, 147, F_ARG0, "o = gs_cat(rbuf, o, \"HTTP/1.1 200 OK\\r\\nContent-Type: image/png\\r\\nContent-Length: \" as *u8)" as *u8 as i64)
491 eg_n(spec, 148, NK_EMIT, 0 - 1, 149); eg_s(spec, 148, F_ARG0, "o = gs_u(rbuf, o, plen)" as *u8 as i64)
492 eg_n(spec, 149, NK_EMIT, 0 - 1, 150); eg_s(spec, 149, F_ARG0, "o = gs_cat(rbuf, o, \"\\r\\nConnection: close\\r\\n\\r\\n\" as *u8)" as *u8 as i64)
493 eg_n(spec, 150, NK_EMIT, 0 - 1, 151); eg_s(spec, 150, F_ARG0, "var i: i64 = 0" as *u8 as i64)
494 eg_n(spec, 151, NK_EMIT, 0 - 1, 152); eg_s(spec, 151, F_ARG0, "while i < plen { rbuf[o] = png[i]; o = o + 1; i = i + 1 }" as *u8 as i64)
495 eg_n(spec, 152, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 152, F_ARG0, "return o" as *u8 as i64)
496 eg_n(spec, 153, NK_FUNC, 154, 0 - 1); eg_s(spec, 153, F_ARG0, "gs_rate(rbuf: *u8, req: *u8, rn: i64) -> i64" as *u8 as i64)
497 eg_n(spec, 154, NK_SEQ, 155, 0 - 1)
498 eg_n(spec, 155, NK_EMIT, 0 - 1, 156); eg_s(spec, 155, F_ARG0, "// same-origin: must carry our own Host. A cross-site form post carries a foreign Origin: header." as *u8 as i64)
499 eg_n(spec, 156, NK_EMIT, 0 - 1, 157); eg_s(spec, 156, F_ARG0, "let okhost: i64 = eh_find(req, rn, \"Host: 127.0.0.1:18090\" as *u8, 21)" as *u8 as i64)
500 eg_n(spec, 157, NK_EMIT, 0 - 1, 158); eg_s(spec, 157, F_ARG0, "if okhost != 1 { return gs_cat(rbuf, 0, \"HTTP/1.1 403 Forbidden\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nforbidden\" as *u8) }" as *u8 as i64)
501 eg_n(spec, 158, NK_EMIT, 0 - 1, 159); eg_s(spec, 158, F_ARG0, "// reject any foreign Origin (cross-origin attacker sets Origin to their site). Only our own Origin or none is allowed." as *u8 as i64)
502 eg_n(spec, 159, NK_EMIT, 0 - 1, 160); eg_s(spec, 159, F_ARG0, "let hasorigin: i64 = eh_find(req, rn, \"Origin: \" as *u8, 8)" as *u8 as i64)
503 eg_n(spec, 160, NK_EMIT, 0 - 1, 161); eg_s(spec, 160, F_ARG0, "let okorigin: i64 = eh_find(req, rn, \"Origin: http://127.0.0.1:18090\" as *u8, 30)" as *u8 as i64)
504 eg_n(spec, 161, NK_EMIT, 0 - 1, 162); eg_s(spec, 161, F_ARG0, "var crossorigin: i64 = 0" as *u8 as i64)
505 eg_n(spec, 162, NK_EMIT, 0 - 1, 163); eg_s(spec, 162, F_ARG0, "if hasorigin == 1 { crossorigin = 1 }" as *u8 as i64)
506 eg_n(spec, 163, NK_EMIT, 0 - 1, 164); eg_s(spec, 163, F_ARG0, "if okorigin == 1 { crossorigin = 0 }" as *u8 as i64)
507 eg_n(spec, 164, NK_EMIT, 0 - 1, 165); eg_s(spec, 164, F_ARG0, "if crossorigin == 1 { return gs_cat(rbuf, 0, \"HTTP/1.1 403 Forbidden\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nforbidden\" as *u8) }" as *u8 as i64)
508 eg_n(spec, 165, NK_EMIT, 0 - 1, 166); eg_s(spec, 165, F_ARG0, "// locate the body (after the blank line CRLFCRLF)" as *u8 as i64)
509 eg_n(spec, 166, NK_EMIT, 0 - 1, 167); eg_s(spec, 166, F_ARG0, "var i: i64 = 0" as *u8 as i64)
510 eg_n(spec, 167, NK_EMIT, 0 - 1, 168); eg_s(spec, 167, F_ARG0, "var bodyat: i64 = 0 - 1" as *u8 as i64)
511 eg_n(spec, 168, NK_EMIT, 0 - 1, 169); eg_s(spec, 168, F_ARG0, "while i + 4 <= rn {" as *u8 as i64)
512 eg_n(spec, 169, NK_EMIT, 0 - 1, 170); eg_s(spec, 169, F_ARG0, " var ok: i64 = 1" as *u8 as i64)
513 eg_n(spec, 170, NK_EMIT, 0 - 1, 171); eg_s(spec, 170, F_ARG0, " if req[i] != (13 as u8) { ok = 0 }" as *u8 as i64)
514 eg_n(spec, 171, NK_EMIT, 0 - 1, 172); eg_s(spec, 171, F_ARG0, " if req[i+1] != (10 as u8) { ok = 0 }" as *u8 as i64)
515 eg_n(spec, 172, NK_EMIT, 0 - 1, 173); eg_s(spec, 172, F_ARG0, " if req[i+2] != (13 as u8) { ok = 0 }" as *u8 as i64)
516 eg_n(spec, 173, NK_EMIT, 0 - 1, 174); eg_s(spec, 173, F_ARG0, " if req[i+3] != (10 as u8) { ok = 0 }" as *u8 as i64)
517 eg_n(spec, 174, NK_EMIT, 0 - 1, 175); eg_s(spec, 174, F_ARG0, " if ok == 1 { if bodyat < 0 { bodyat = i + 4 } }" as *u8 as i64)
518 eg_n(spec, 175, NK_EMIT, 0 - 1, 176); eg_s(spec, 175, F_ARG0, " i = i + 1" as *u8 as i64)
519 eg_n(spec, 176, NK_EMIT, 0 - 1, 177); eg_s(spec, 176, F_ARG0, "}" as *u8 as i64)
520 eg_n(spec, 177, NK_EMIT, 0 - 1, 178); eg_s(spec, 177, F_ARG0, "if bodyat < 0 { return gs_cat(rbuf, 0, \"HTTP/1.1 400 Bad Request\\r\\nContent-Type: text/plain\\r\\nContent-Length: 3\\r\\nConnection: close\\r\\n\\r\\nbad\" as *u8) }" as *u8 as i64)
521 eg_n(spec, 178, NK_EMIT, 0 - 1, 179); eg_s(spec, 178, F_ARG0, "// locate \"img=\" in the body, then copy the value up to '&' or end." as *u8 as i64)
522 eg_n(spec, 179, NK_EMIT, 0 - 1, 180); eg_s(spec, 179, F_ARG0, "let img: *u8 = sys_mmap(128)" as *u8 as i64)
523 eg_n(spec, 180, NK_EMIT, 0 - 1, 181); eg_s(spec, 180, F_ARG0, "var im: i64 = 0" as *u8 as i64)
524 eg_n(spec, 181, NK_EMIT, 0 - 1, 182); eg_s(spec, 181, F_ARG0, "var iat: i64 = 0 - 1" as *u8 as i64)
525 eg_n(spec, 182, NK_EMIT, 0 - 1, 183); eg_s(spec, 182, F_ARG0, "var pi: i64 = bodyat" as *u8 as i64)
526 eg_n(spec, 183, NK_EMIT, 0 - 1, 184); eg_s(spec, 183, F_ARG0, "while pi + 4 <= rn {" as *u8 as i64)
527 eg_n(spec, 184, NK_EMIT, 0 - 1, 185); eg_s(spec, 184, F_ARG0, " var oki: i64 = 1" as *u8 as i64)
528 eg_n(spec, 185, NK_EMIT, 0 - 1, 186); eg_s(spec, 185, F_ARG0, " if req[pi] != (105 as u8) { oki = 0 }" as *u8 as i64)
529 eg_n(spec, 186, NK_EMIT, 0 - 1, 187); eg_s(spec, 186, F_ARG0, " if req[pi+1] != (109 as u8) { oki = 0 }" as *u8 as i64)
530 eg_n(spec, 187, NK_EMIT, 0 - 1, 188); eg_s(spec, 187, F_ARG0, " if req[pi+2] != (103 as u8) { oki = 0 }" as *u8 as i64)
531 eg_n(spec, 188, NK_EMIT, 0 - 1, 189); eg_s(spec, 188, F_ARG0, " if req[pi+3] != (61 as u8) { oki = 0 }" as *u8 as i64)
532 eg_n(spec, 189, NK_EMIT, 0 - 1, 190); eg_s(spec, 189, F_ARG0, " if oki == 1 { if iat < 0 { iat = pi + 4 } }" as *u8 as i64)
533 eg_n(spec, 190, NK_EMIT, 0 - 1, 191); eg_s(spec, 190, F_ARG0, " pi = pi + 1" as *u8 as i64)
534 eg_n(spec, 191, NK_EMIT, 0 - 1, 192); eg_s(spec, 191, F_ARG0, "}" as *u8 as i64)
535 eg_n(spec, 192, NK_EMIT, 0 - 1, 193); eg_s(spec, 192, F_ARG0, "if iat >= 0 {" as *u8 as i64)
536 eg_n(spec, 193, NK_EMIT, 0 - 1, 194); eg_s(spec, 193, F_ARG0, " var p: i64 = iat" as *u8 as i64)
537 eg_n(spec, 194, NK_EMIT, 0 - 1, 195); eg_s(spec, 194, F_ARG0, " var go: i64 = 1" as *u8 as i64)
538 eg_n(spec, 195, NK_EMIT, 0 - 1, 196); eg_s(spec, 195, F_ARG0, " while p < rn { if go == 1 { if req[p] == (38 as u8) { go = 0 } else { img[im] = req[p]; im = im + 1 } } p = p + 1 }" as *u8 as i64)
539 eg_n(spec, 196, NK_EMIT, 0 - 1, 197); eg_s(spec, 196, F_ARG0, "}" as *u8 as i64)
540 eg_n(spec, 197, NK_EMIT, 0 - 1, 198); eg_s(spec, 197, F_ARG0, "img[im] = 0 as u8" as *u8 as i64)
541 eg_n(spec, 198, NK_EMIT, 0 - 1, 199); eg_s(spec, 198, F_ARG0, "// locate \"score=\" in the body, then copy the digits." as *u8 as i64)
542 eg_n(spec, 199, NK_EMIT, 0 - 1, 200); eg_s(spec, 199, F_ARG0, "let score: *u8 = sys_mmap(32)" as *u8 as i64)
543 eg_n(spec, 200, NK_EMIT, 0 - 1, 201); eg_s(spec, 200, F_ARG0, "var sm: i64 = 0" as *u8 as i64)
544 eg_n(spec, 201, NK_EMIT, 0 - 1, 202); eg_s(spec, 201, F_ARG0, "var sat: i64 = 0 - 1" as *u8 as i64)
545 eg_n(spec, 202, NK_EMIT, 0 - 1, 203); eg_s(spec, 202, F_ARG0, "var ps: i64 = bodyat" as *u8 as i64)
546 eg_n(spec, 203, NK_EMIT, 0 - 1, 204); eg_s(spec, 203, F_ARG0, "while ps + 6 <= rn {" as *u8 as i64)
547 eg_n(spec, 204, NK_EMIT, 0 - 1, 205); eg_s(spec, 204, F_ARG0, " var oks: i64 = 1" as *u8 as i64)
548 eg_n(spec, 205, NK_EMIT, 0 - 1, 206); eg_s(spec, 205, F_ARG0, " let sp: *u8 = \"score=\" as *u8" as *u8 as i64)
549 eg_n(spec, 206, NK_EMIT, 0 - 1, 207); eg_s(spec, 206, F_ARG0, " var jj: i64 = 0" as *u8 as i64)
550 eg_n(spec, 207, NK_EMIT, 0 - 1, 208); eg_s(spec, 207, F_ARG0, " while jj < 6 { if req[ps+jj] != sp[jj] { oks = 0 } jj = jj + 1 }" as *u8 as i64)
551 eg_n(spec, 208, NK_EMIT, 0 - 1, 209); eg_s(spec, 208, F_ARG0, " if oks == 1 { if sat < 0 { sat = ps + 6 } }" as *u8 as i64)
552 eg_n(spec, 209, NK_EMIT, 0 - 1, 210); eg_s(spec, 209, F_ARG0, " ps = ps + 1" as *u8 as i64)
553 eg_n(spec, 210, NK_EMIT, 0 - 1, 211); eg_s(spec, 210, F_ARG0, "}" as *u8 as i64)
554 eg_n(spec, 211, NK_EMIT, 0 - 1, 212); eg_s(spec, 211, F_ARG0, "if sat >= 0 {" as *u8 as i64)
555 eg_n(spec, 212, NK_EMIT, 0 - 1, 213); eg_s(spec, 212, F_ARG0, " var q: i64 = sat" as *u8 as i64)
556 eg_n(spec, 213, NK_EMIT, 0 - 1, 214); eg_s(spec, 213, F_ARG0, " var god: i64 = 1" as *u8 as i64)
557 eg_n(spec, 214, NK_EMIT, 0 - 1, 215); eg_s(spec, 214, F_ARG0, " while q < rn { if god == 1 { if req[q] >= (48 as u8) { if req[q] <= (57 as u8) { score[sm] = req[q]; sm = sm + 1 } else { god = 0 } } else { god = 0 } } q = q + 1 }" as *u8 as i64)
558 eg_n(spec, 215, NK_EMIT, 0 - 1, 216); eg_s(spec, 215, F_ARG0, "}" as *u8 as i64)
559 eg_n(spec, 216, NK_EMIT, 0 - 1, 217); eg_s(spec, 216, F_ARG0, "score[sm] = 0 as u8" as *u8 as i64)
560 eg_n(spec, 217, NK_EMIT, 0 - 1, 218); eg_s(spec, 217, F_ARG0, "// append EXACTLY one EVAL O-line" as *u8 as i64)
561 eg_n(spec, 218, NK_EMIT, 0 - 1, 219); eg_s(spec, 218, F_ARG0, "let logfd: i64 = sys_openat_append(\"knowledge/status/eval_lanes.log\" as *u8, 0x1a4)" as *u8 as i64)
562 eg_n(spec, 219, NK_EMIT, 0 - 1, 220); eg_s(spec, 219, F_ARG0, "if logfd >= 0 {" as *u8 as i64)
563 eg_n(spec, 220, NK_EMIT, 0 - 1, 221); eg_s(spec, 220, F_ARG0, " let line: *u8 = sys_mmap(256)" as *u8 as i64)
564 eg_n(spec, 221, NK_EMIT, 0 - 1, 222); eg_s(spec, 221, F_ARG0, " var lo: i64 = 0" as *u8 as i64)
565 eg_n(spec, 222, NK_EMIT, 0 - 1, 223); eg_s(spec, 222, F_ARG0, " lo = gs_cat(line, lo, \"EVAL img=\" as *u8)" as *u8 as i64)
566 eg_n(spec, 223, NK_EMIT, 0 - 1, 224); eg_s(spec, 223, F_ARG0, " lo = gs_cat(line, lo, img)" as *u8 as i64)
567 eg_n(spec, 224, NK_EMIT, 0 - 1, 225); eg_s(spec, 224, F_ARG0, " lo = gs_cat(line, lo, \" lane=O score=\" as *u8)" as *u8 as i64)
568 eg_n(spec, 225, NK_EMIT, 0 - 1, 226); eg_s(spec, 225, F_ARG0, " lo = gs_cat(line, lo, score)" as *u8 as i64)
569 eg_n(spec, 226, NK_EMIT, 0 - 1, 227); eg_s(spec, 226, F_ARG0, " lo = gs_cat(line, lo, \"\\n\" as *u8)" as *u8 as i64)
570 eg_n(spec, 227, NK_EMIT, 0 - 1, 228); eg_s(spec, 227, F_ARG0, " sys_write(logfd, line, lo)" as *u8 as i64)
571 eg_n(spec, 228, NK_EMIT, 0 - 1, 229); eg_s(spec, 228, F_ARG0, " sys_close(logfd)" as *u8 as i64)
572 eg_n(spec, 229, NK_EMIT, 0 - 1, 230); eg_s(spec, 229, F_ARG0, "}" as *u8 as i64)
573 eg_n(spec, 230, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 230, F_ARG0, "return gs_cat(rbuf, 0, \"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nContent-Length: 5\\r\\nConnection: close\\r\\n\\r\\nrated\" as *u8)" as *u8 as i64)
574 eg_n(spec, 231, NK_FUNC, 232, 0 - 1); eg_s(spec, 231, F_ARG0, "main() -> i64" as *u8 as i64)
575 eg_n(spec, 232, NK_SEQ, 233, 0 - 1)
576 eg_n(spec, 233, NK_EMIT, 0 - 1, 234); eg_s(spec, 233, F_ARG0, "let port: i64 = 18090" as *u8 as i64)
577 eg_n(spec, 234, NK_EMIT, 0 - 1, 235); eg_s(spec, 234, F_ARG0, "let addr: *u8 = sys_mmap(16)" as *u8 as i64)
578 eg_n(spec, 235, NK_EMIT, 0 - 1, 236); eg_s(spec, 235, F_ARG0, "addr[0] = 2 as u8" as *u8 as i64)
579 eg_n(spec, 236, NK_EMIT, 0 - 1, 237); eg_s(spec, 236, F_ARG0, "addr[1] = 0 as u8" as *u8 as i64)
580 eg_n(spec, 237, NK_EMIT, 0 - 1, 238); eg_s(spec, 237, F_ARG0, "addr[2] = ((port >> 8) & 0xff) as u8" as *u8 as i64)
581 eg_n(spec, 238, NK_EMIT, 0 - 1, 239); eg_s(spec, 238, F_ARG0, "addr[3] = (port & 0xff) as u8" as *u8 as i64)
582 eg_n(spec, 239, NK_EMIT, 0 - 1, 240); eg_s(spec, 239, F_ARG0, "addr[4] = 127 as u8" as *u8 as i64)
583 eg_n(spec, 240, NK_EMIT, 0 - 1, 241); eg_s(spec, 240, F_ARG0, "addr[5] = 0 as u8" as *u8 as i64)
584 eg_n(spec, 241, NK_EMIT, 0 - 1, 242); eg_s(spec, 241, F_ARG0, "addr[6] = 0 as u8" as *u8 as i64)
585 eg_n(spec, 242, NK_EMIT, 0 - 1, 243); eg_s(spec, 242, F_ARG0, "addr[7] = 1 as u8" as *u8 as i64)
586 eg_n(spec, 243, NK_EMIT, 0 - 1, 244); eg_s(spec, 243, F_ARG0, "addr[8] = 0 as u8" as *u8 as i64)
587 eg_n(spec, 244, NK_EMIT, 0 - 1, 245); eg_s(spec, 244, F_ARG0, "addr[9] = 0 as u8" as *u8 as i64)
588 eg_n(spec, 245, NK_EMIT, 0 - 1, 246); eg_s(spec, 245, F_ARG0, "addr[10] = 0 as u8" as *u8 as i64)
589 eg_n(spec, 246, NK_EMIT, 0 - 1, 247); eg_s(spec, 246, F_ARG0, "addr[11] = 0 as u8" as *u8 as i64)
590 eg_n(spec, 247, NK_EMIT, 0 - 1, 248); eg_s(spec, 247, F_ARG0, "addr[12] = 0 as u8" as *u8 as i64)
591 eg_n(spec, 248, NK_EMIT, 0 - 1, 249); eg_s(spec, 248, F_ARG0, "addr[13] = 0 as u8" as *u8 as i64)
592 eg_n(spec, 249, NK_EMIT, 0 - 1, 250); eg_s(spec, 249, F_ARG0, "addr[14] = 0 as u8" as *u8 as i64)
593 eg_n(spec, 250, NK_EMIT, 0 - 1, 251); eg_s(spec, 250, F_ARG0, "addr[15] = 0 as u8" as *u8 as i64)
594 eg_n(spec, 251, NK_EMIT, 0 - 1, 252); eg_s(spec, 251, F_ARG0, "let lfd: i64 = sys_socket(2, 1, 0)" as *u8 as i64)
595 eg_n(spec, 252, NK_EMIT, 0 - 1, 253); eg_s(spec, 252, F_ARG0, "if lfd < 0 { return 10 }" as *u8 as i64)
596 eg_n(spec, 253, NK_EMIT, 0 - 1, 254); eg_s(spec, 253, F_ARG0, "let optval: *u8 = sys_mmap(4)" as *u8 as i64)
597 eg_n(spec, 254, NK_EMIT, 0 - 1, 255); eg_s(spec, 254, F_ARG0, "optval[0] = 1 as u8" as *u8 as i64)
598 eg_n(spec, 255, NK_EMIT, 0 - 1, 256); eg_s(spec, 255, F_ARG0, "optval[1] = 0 as u8" as *u8 as i64)
599 eg_n(spec, 256, NK_EMIT, 0 - 1, 257); eg_s(spec, 256, F_ARG0, "optval[2] = 0 as u8" as *u8 as i64)
600 eg_n(spec, 257, NK_EMIT, 0 - 1, 258); eg_s(spec, 257, F_ARG0, "optval[3] = 0 as u8" as *u8 as i64)
601 eg_n(spec, 258, NK_EMIT, 0 - 1, 259); eg_s(spec, 258, F_ARG0, "sys_setsockopt(lfd, 1, 2, optval, 4)" as *u8 as i64)
602 eg_n(spec, 259, NK_EMIT, 0 - 1, 260); eg_s(spec, 259, F_ARG0, "let brc: i64 = sys_bind(lfd, addr, 16)" as *u8 as i64)
603 eg_n(spec, 260, NK_EMIT, 0 - 1, 261); eg_s(spec, 260, F_ARG0, "if brc < 0 { return 20 }" as *u8 as i64)
604 eg_n(spec, 261, NK_EMIT, 0 - 1, 262); eg_s(spec, 261, F_ARG0, "let lrc: i64 = sys_listen(lfd, 16)" as *u8 as i64)
605 eg_n(spec, 262, NK_EMIT, 0 - 1, 263); eg_s(spec, 262, F_ARG0, "if lrc < 0 { return 30 }" as *u8 as i64)
606 eg_n(spec, 263, NK_EMIT, 0 - 1, 264); eg_s(spec, 263, F_ARG0, "let req: *u8 = sys_mmap(8192)" as *u8 as i64)
607 eg_n(spec, 264, NK_EMIT, 0 - 1, 265); eg_s(spec, 264, F_ARG0, "let nf404: *u8 = \"HTTP/1.1 404 Not Found\\r\\nContent-Type: text/plain\\r\\nContent-Length: 9\\r\\nConnection: close\\r\\n\\r\\nnot found\" as *u8" as *u8 as i64)
608 eg_n(spec, 265, NK_EMIT, 0 - 1, 266); eg_s(spec, 265, F_ARG0, "var served: i64 = 0" as *u8 as i64)
609 eg_n(spec, 266, NK_EMIT, 0 - 1, 267); eg_s(spec, 266, F_ARG0, "while 1 == 1 {" as *u8 as i64)
610 eg_n(spec, 267, NK_EMIT, 0 - 1, 268); eg_s(spec, 267, F_ARG0, " let cfd: i64 = sys_accept(lfd)" as *u8 as i64)
611 eg_n(spec, 268, NK_EMIT, 0 - 1, 269); eg_s(spec, 268, F_ARG0, " if cfd < 0 { continue }" as *u8 as i64)
612 eg_n(spec, 269, NK_EMIT, 0 - 1, 270); eg_s(spec, 269, F_ARG0, " let pid: i64 = sys_fork()" as *u8 as i64)
613 eg_n(spec, 270, NK_EMIT, 0 - 1, 271); eg_s(spec, 270, F_ARG0, " if pid == 0 {" as *u8 as i64)
614 eg_n(spec, 271, NK_EMIT, 0 - 1, 272); eg_s(spec, 271, F_ARG0, " sys_close(lfd)" as *u8 as i64)
615 eg_n(spec, 272, NK_EMIT, 0 - 1, 273); eg_s(spec, 272, F_ARG0, " let rn: i64 = sys_read(cfd, req, 8192)" as *u8 as i64)
616 eg_n(spec, 273, NK_EMIT, 0 - 1, 274); eg_s(spec, 273, F_ARG0, " var rbuf: *u8 = sys_mmap(4194304)" as *u8 as i64)
617 eg_n(spec, 274, NK_EMIT, 0 - 1, 275); eg_s(spec, 274, F_ARG0, " var rlen: i64 = 0" as *u8 as i64)
618 eg_n(spec, 275, NK_EMIT, 0 - 1, 276) // tamperable route line (rl_root)
619 eg_n(spec, 276, NK_EMIT, 0 - 1, 277); eg_s(spec, 276, F_ARG0, " if is_root == 1 { rlen = gs_grid(rbuf, \"knowledge/store/galx-prod-\" as *u8) }" as *u8 as i64)
620 eg_n(spec, 277, NK_EMIT, 0 - 1, 278) // tamperable route line (rl_img)
621 eg_n(spec, 278, NK_EMIT, 0 - 1, 279); eg_s(spec, 278, F_ARG0, " if is_img == 1 { rlen = gs_serve_png(rbuf, req, rn, \"knowledge/store/galx-prod-\" as *u8) }" as *u8 as i64)
622 eg_n(spec, 279, NK_EMIT, 0 - 1, 280) // tamperable route line (rl_rate)
623 eg_n(spec, 280, NK_EMIT, 0 - 1, 281); eg_s(spec, 280, F_ARG0, " if is_rate == 1 { rlen = gs_rate(rbuf, req, rn) }" as *u8 as i64)
624 eg_n(spec, 281, NK_EMIT, 0 - 1, 282); eg_s(spec, 281, F_ARG0, " if rlen == 0 { rlen = gs_cat(rbuf, 0, nf404) }" as *u8 as i64)
625 eg_n(spec, 282, NK_EMIT, 0 - 1, 283); eg_s(spec, 282, F_ARG0, " sys_write(cfd, rbuf, rlen)" as *u8 as i64)
626 eg_n(spec, 283, NK_EMIT, 0 - 1, 284); eg_s(spec, 283, F_ARG0, " sys_close(cfd)" as *u8 as i64)
627 eg_n(spec, 284, NK_EMIT, 0 - 1, 285); eg_s(spec, 284, F_ARG0, " sys_exit(0)" as *u8 as i64)
628 eg_n(spec, 285, NK_EMIT, 0 - 1, 286); eg_s(spec, 285, F_ARG0, " }" as *u8 as i64)
629 eg_n(spec, 286, NK_EMIT, 0 - 1, 287); eg_s(spec, 286, F_ARG0, " sys_close(cfd)" as *u8 as i64)
630 eg_n(spec, 287, NK_EMIT, 0 - 1, 288); eg_s(spec, 287, F_ARG0, " served = served + 1" as *u8 as i64)
631 eg_n(spec, 288, NK_EMIT, 0 - 1, 289); eg_s(spec, 288, F_ARG0, "}" as *u8 as i64)
632 eg_n(spec, 289, NK_EMIT, 0 - 1, 290); eg_s(spec, 289, F_ARG0, "sys_close(lfd)" as *u8 as i64)
633 eg_n(spec, 290, NK_EMIT, 0 - 1, 0 - 1); eg_s(spec, 290, F_ARG0, "return 0" as *u8 as i64)
634 // tamperable route lines: built from route_use so `tamper` flips the matched bytes -> behavioral RED
635 let rl_root: *u8 = sys_mmap(256)
636 var rl_rooto: i64 = 0
637 rl_rooto = eg_cat(rl_root, rl_rooto, " let is_root: i64 = eh_find(req, rn, \"" as *u8)
638 rl_rooto = eg_cat(rl_root, rl_rooto, rl_root_use as *u8)
639 rl_rooto = eg_cat(rl_root, rl_rooto, "\" as *u8, 6)" as *u8)
640 rl_root[rl_rooto] = 0 as u8
641 spec[275 * NK_FIELDS + F_ARG0] = rl_root as i64
642 let rl_img: *u8 = sys_mmap(256)
643 var rl_imgo: i64 = 0
644 rl_imgo = eg_cat(rl_img, rl_imgo, " let is_img: i64 = eh_find(req, rn, \"" as *u8)
645 rl_imgo = eg_cat(rl_img, rl_imgo, rl_img_use as *u8)
646 rl_imgo = eg_cat(rl_img, rl_imgo, "\" as *u8, 9)" as *u8)
647 rl_img[rl_imgo] = 0 as u8
648 spec[277 * NK_FIELDS + F_ARG0] = rl_img as i64
649 let rl_rate: *u8 = sys_mmap(256)
650 var rl_rateo: i64 = 0
651 rl_rateo = eg_cat(rl_rate, rl_rateo, " let is_rate: i64 = eh_find(req, rn, \"" as *u8)
652 rl_rateo = eg_cat(rl_rate, rl_rateo, rl_rate_use as *u8)
653 rl_rateo = eg_cat(rl_rate, rl_rateo, "\" as *u8, 10)" as *u8)
654 rl_rate[rl_rateo] = 0 as u8
655 spec[279 * NK_FIELDS + F_ARG0] = rl_rate as i64
656 return 0
657}
658
659
660func main(argc: i64, argv: *i64) -> i64 {
661 if argc < 3 { eg_p("usage: nx_eg <which> <outbase> [tamper]\n" as *u8); return 2 }
662 let which: i64 = eg_atoi(argv[1] as *u8)
663 let outbase: *u8 = argv[2] as *u8
664 var tamper: i64 = 0
665 if argc >= 4 { tamper = eg_atoi(argv[3] as *u8) }
666
667 // spec table: 512 nodes max, NK_FIELDS i64 each (spec2's gallery daemon uses 291 nodes).
668 let spec: *i64 = sys_mmap(512 * NK_FIELDS * 8) as *i64
669 var n: i64 = 0
670 while n < 512 * NK_FIELDS { spec[n] = 0 - 1; n = n + 1 }
671
672 let buf: *u8 = sys_mmap(NK_MAGIC_262144)
673 var o: i64 = 0
674 o = eg_cat(buf, o, "// GENERATED BY nx_eg (generalized emitter-of-emitters) -- control flow synthesized from a structural DATA spec, compiled by nx_cc. license_tier: ORIGINAL\n" as *u8)
675 o = eg_cat(buf, o, "import \"nx_syscalls.nx\"\n" as *u8)
676 // which==2 imports the substrate the gallery daemon dispatches into (module-frame, like the caller's
677 // header writer): the seg-store (ss_manifest/ss_get/ss_r32) + canon-cid. Additive header branch.
678 if which == 2 {
679 o = eg_cat(buf, o, "import \"nx_seg_store.nx\"\n" as *u8)
680 o = eg_cat(buf, o, "import \"nx_canon_cid.nx\"\n" as *u8)
681 }
682
683 if which == 0 {
684 eg_build_spec0(spec)
685 o = eg_emit_node(buf, o, spec, 0, 0) // FUNC main
686 }
687 if which == 1 {
688 eg_build_spec1(spec, tamper)
689 o = eg_emit_node(buf, o, spec, 0, 0) // FUNC eh_find
690 o = eg_emit_node(buf, o, spec, 20, 0) // FUNC main
691 }
692 if which == 2 {
693 eg_build_spec2(spec, tamper)
694 // walk every FUNC root in file order: the WHOLE daemon (helpers + main) is pretty-printed here.
695 o = eg_emit_node(buf, o, spec, 0, 0) // FUNC eh_find
696 o = eg_emit_node(buf, o, spec, 14, 0) // FUNC gs_cat
697 o = eg_emit_node(buf, o, spec, 19, 0) // FUNC gs_u
698 o = eg_emit_node(buf, o, spec, 30, 0) // FUNC gs_grid_body
699 o = eg_emit_node(buf, o, spec, 77, 0) // FUNC gs_grid
700 o = eg_emit_node(buf, o, spec, 91, 0) // FUNC gs_peel_cid
701 o = eg_emit_node(buf, o, spec, 108, 0) // FUNC gs_sidecar
702 o = eg_emit_node(buf, o, spec, 134, 0) // FUNC gs_serve_png
703 o = eg_emit_node(buf, o, spec, 153, 0) // FUNC gs_rate
704 o = eg_emit_node(buf, o, spec, 231, 0) // FUNC main
705 }
706
707 // write runtime/_hdl_build/<outbase>.nx
708 let path: *u8 = sys_mmap(512)
709 var po: i64 = 0
710 po = eg_cat(path, po, "runtime/_hdl_build/" as *u8)
711 po = eg_cat(path, po, outbase)
712 po = eg_cat(path, po, ".nx" as *u8)
713 path[po] = 0 as u8
714 let fd: i64 = sys_openat_wr(path, 420)
715 if fd < 0 { eg_p("EGGEN verdict=RED reason=out-unwritable\n" as *u8); return 1 }
716 sys_write(fd, buf, o)
717 sys_close(fd)
718 eg_p("EGGEN name=" as *u8); eg_p(path); eg_p(" which=" as *u8); let wb: *u8 = sys_mmap(8); wb[0]=(48+which) as u8; sys_write(1, wb, 1); eg_p(" tamper=" as *u8); let tb: *u8 = sys_mmap(8); tb[0]=(48+tamper) as u8; sys_write(1, tb, 1); eg_p(" verdict=EMITTED\n" as *u8)
719 return 0
720}