aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: a166273d76b7eec016720e5430c57757f32159cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# TECO Regular Expression Engine

This is a regular expression engine, derived from the standalone
[hsrex](https://github.com/garyhouston/hsrex) library, which
is based on Henry Spencer's implementation of advanced regular expressions
(ARE) in the Tcl language.
This library therefore also provides AREs
(see [re_syntax](https://www.tcl-lang.org/man/tcl/TclCmd/re_syntax.html)).
It is a hybrid NFA/DFA design.
In contrast to [PCRE](https://www.pcre.org/) terex' stack
use cannot grow arbitrarily and it has polynomial worst-case runtime.
terex is the regular expression engine used by the [SciTECO](https://sciteco.fmsbw.de)
editor and motivated by its needs.
It is still kept as a standalone library and may be useful to other projects as well.

Compared to hsrex, this library has the following changes:

* Renamed `re_comp()` to `tere_comp()`, `re_exec()` to `tere_exec()`,
  `re_free()` to `tere_free()` and `re_error()` to `tere_error()`
  to avoid collisions with BSD's functions from unistd.h.
* Native UTF-8 support - no need to convert UTF-8 to UTF-32 first.
  You no longer need to compile a special version of the library.
  It expects Unicode strings by default unless specifying the `REG_RAW`
  `tere_comp()` compilation flag.
* Support the `REG_ANCHORED` flag for `tere_exec()`.
* `tere_free()` ignores nullified `regex_t` objects.
* `tere_set_is_interrupted_cb()` allows configuring a repeatedly
  invoked callback. If it returns true (non-null) matching aborts
  immediately and `tere_exec()` will return `REG_EINTR`.

## TODO

* Expose enough API to swap out the regular expression lexer.
  Useful for custom DSLs like glob patterns or TECO patterns.
* Support splitting the subject string into two halves, so we can
  preserve the buffer gap when used in SciTECO.
* Check for useful changes in the Tcl codebase.
* Check against a proper regular expression test suite.
  At the very least, convert `regtest_terex.sh` into an Autotest
  suite - but then it will work only with Autoconf.

## Building

    make -f Makefile.linux

There is also an Automake file (Makefile.am) for integration into an existing
Autotools build system.