forked from lix-project/lix
sugar🍬🍭🏳️⚧️
447212fa65
This avoids C++'s standard library regexes, which aren't the same
across platforms, and have many other issues, like using stack
so much that they stack overflow when processing a lot of data.
To avoid backwards and forward compatibility issues, regexes are
processed using a function converting libstdc++ regexes into Boost
regexes, escaping characters that Boost needs to have escaped, and
rejecting features that Boost has and libstdc++ doesn't.
Related context:
- Original failed attempt to use `boost::regex` in CppNix, failed due to
boost icu dependency being large (disabling ICU is no longer necessary
because linking ICU requires using a different header file,
`boost/regex/icu.hpp`): https://github.com/NixOS/nix/pull/3826
- An attempt to use PCRE, rejected due to providing less backwards
compatibility with `std::regex` than `boost::regex`:
https://github.com/NixOS/nix/pull/7336
- Second attempt to use `boost::regex`, failed due to `}` regex failing
to compile (dealt with by writing a wrapper that parses a regular
expression and escapes `}` characters):
https://github.com/NixOS/nix/pull/7762
Closes #34. Closes #476.
Change-Id: Ieb0eb9e270a93e4c7eed412ba4f9f96cb00a5fa4
38 lines
1,004 B
Markdown
38 lines
1,004 B
Markdown
---
|
|
synopsis: Replace regex engine with boost::regex
|
|
issues: [fj#34, fj#476]
|
|
cls: [1821]
|
|
category: Fixes
|
|
credits: [sugar]
|
|
---
|
|
|
|
Previously, the C++ standard regex expression library was used, the
|
|
behaviour of which varied depending on the platform. This has been
|
|
replaced with the Boost regex library, which works identically across
|
|
platforms.
|
|
|
|
The visible behaviour of the regex functions doesn't change. While
|
|
the new library has more features, Lix will reject regular expressions
|
|
using them.
|
|
|
|
This also fixes regex matching reporting stack overflow when matching
|
|
on too much data.
|
|
|
|
Before:
|
|
|
|
nix-repl> builtins.match ".*" (
|
|
builtins.concatStringsSep "" (
|
|
builtins.genList (_: "a") 1000000
|
|
)
|
|
)
|
|
error: stack overflow (possible infinite recursion)
|
|
|
|
After:
|
|
|
|
nix-repl> builtins.match ".*" (
|
|
builtins.concatStringsSep "" (
|
|
builtins.genList (_: "a") 1000000
|
|
)
|
|
)
|
|
[ ]
|