code wiki / _hdl_build / nx_browser_forms.nx
nx_browser_forms.nx
buildroot/runtime/_hdl_build/nx_browser_forms.nx
about
nx_browser_forms.nx -- the SOVEREIGN Nishi-browser FORM model: parse <form>/<input>/<textarea> from a
rendered page, hold each field's EDITABLE value, and on submit produce the exact HTTP request
(method + action + application/x-www-form-urlencoded body). This is the load-bearing browser-core rung
that makes the nishi-first no-JS portals (docportal/mail/siteedit login + editor) ACTUALLY OPERABLE in
the Nishi browser (operator 2026-07-05 doctrine: nishi os/browser FIRST). PURE bytes-in/values-out --
no X11, no paint -- so it is fully gate-provable (nx_browser_forms_gate); the render (draw input boxes +
caret) and the live keyboard/click wiring COMPOSE this core. Reuses the shipped HTML tokenizer + DOM
attr finder (rule 15 DRY, same as br_extract). license_tier: ORIGINAL
dependencies 3 imports · 4 importers
imports: nx_syscalls.nxnx_html_tokenizer.nxnx_dom_query.nx
imported by: nx_browser_forms_e2e_gate.nxnx_browser_forms_focus_gate.nxnx_browser_forms_gate.nxnx_browser_forms_paint.nx
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| 21 | struct BrField |
| 35 | struct BrForm |
consts
| 12 | const BF_MAGIC_65536: i64 = 65536 |
| 13 | const BF_MAGIC_4096: i64 = 4096 |
| 14 | const BF_MAGIC_131072: i64 = 131072 |
| 16 | const BF_K_TEXT: i64 = 0 // <input> text/other |
| 17 | const BF_K_HIDDEN: i64 = 1 // <input type=hidden> |
| 18 | const BF_K_TEXTAREA: i64 = 2 // <textarea> |
| 19 | const BF_K_PASSWORD: i64 = 3 // <input type=password> |
| 33 | const NX_BRFIELD_BYTES: i64 = 80 |
| 46 | const NX_BRFORM_BYTES: i64 = 72 |
functions
| 48 | func bf_field(fields: *BrField, i: i64) -> *BrField { return ((fields as i64) + i * NX_BRFIELD_BYTES) as *BrField } |
| 49 | func bf_form(forms: *BrForm, i: i64) -> *BrForm { return ((forms as i64) + i * NX_BRFORM_BYTES) as *BrForm } |
| 52 | func bf_copy(html: *u8, off: i64, len: i64) -> *u8 |
| 60 | func bf_ci_eq(html: *u8, off: i64, len: i64, lit: *u8) -> i64 called by 1: bf_parse |
| 76 | func bf_parse(html: *u8, hlen: i64, forms: *BrForm, maxf: i64, fields: *BrField, maxfld: i64) -> i64 |
| 177 | func bf_layout_fields(forms: *BrForm, fi: i64, fields: *BrField, x0: i64, y0: i64, fw: i64, rh: i64) -> i64 |
| 204 | func br_hit_submit(forms: *BrForm, fi: i64, dx: i64, dy: i64) -> i64 |
| 212 | func br_hit_input(forms: *BrForm, fi: i64, fields: *BrField, dx: i64, dy: i64) -> i64 |
| 227 | func bf_type(fld: *BrField, ch: i64) -> i64 { if fld.val_len < fld.val_cap - 1 { fld.val[fld.val_len] = ch as u8; fld.val_len = fld.val_len + 1 } return 0 } called by 1: bf_set |
| 228 | func bf_backspace(fld: *BrField) -> i64 { if fld.val_len > 0 { fld.val_len = fld.val_len - 1 } return 0 } |
| 230 | func bf_set(fld: *BrField, s: *u8) -> i64 { fld.val_len = 0; var i: i64 = 0; while s[i] != (0 as u8) { bf_type(fld, s[i] as i64); i = i + 1 } return 0 } |
| 234 | func bf_urlenc(src: *u8, n: i64, out: *u8, o: i64) -> i64 called by 1: bf_submit_body |
| 263 | func bf_submit_body(forms: *BrForm, fi: i64, fields: *BrField, out: *u8) -> i64 |
| 279 | func bf_cats(out: *u8, o: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){out[o+i]=s[i];i=i+1} return o+i } called by 1: bf_submit_request |
| 280 | func bf_catn(out: *u8, o: i64, v: i64) -> i64 { if v==0 {out[o]=48 as u8; return o+1} let t: *u8=sys_mmap(24); var m: i64=v; var k: i64=0; while m>0 {t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k {out[o+i]=t[k-1-i];i=i+1} return o+k } |
| 286 | func bf_submit_request(host: *u8, hostlen: i64, forms: *BrForm, fi: i64, fields: *BrField, out: *u8) -> i64 |
| 310 | func main() -> i64 |