# C++ regex engine

This bridge executes patterns with the `std::wregex` implementation shipped in
Emscripten 6.0.4's libc++. The default grammar is the C++ standard library's
modified ECMAScript grammar; it is not presented as modern browser ECMAScript.

The fixed Embind entry points accept structured values only. User patterns,
subjects and replacement templates are passed as data and are never evaluated
as JavaScript or C++ source. The worker remains subject to Regex Tools' hard
timeout and result limits.

Replacement is streamed through the output byte limit with libc++
`match_results::format` default grammar. A load-time differential self-test
compares bounded fixture output with the native API; capture amplification
never materializes a whole per-match expansion.

Build with the pinned Emscripten checkout:

```sh
node scripts/cpp-engine-pack.mjs --empp /absolute/path/to/em++
node scripts/install-cpp-engine.mjs
```

The builder enables `wasm-ld --trace` and accepts only the reviewed archive
set. The generated `SOURCE-MANIFEST.json` records the exact Emscripten, emsdk
and LLVM identities; maps the selected Emscripten runtime, musl 1.2.6,
emmalloc, compiler-rt 22.1.8, libc++ 21.1.8 and libc++abi 21.1.8 sources to
their pinned legal files; and records that JavaScript exceptions select no
libunwind object. The libunwind legal text is retained so that exclusion stays
explicit and reviewable.

Native positions are Unicode code-point offsets because the bridge deliberately
uses 32-bit `wchar_t`; the TypeScript adapter preserves them and separately
normalizes editor ranges to UTF-16.
