Initial Commit
This commit is contained in:
commit
406de00b82
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Arsen Musayelyan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
94
LICENSE-PCRE2
Normal file
94
LICENSE-PCRE2
Normal file
@ -0,0 +1,94 @@
|
||||
PCRE2 LICENCE
|
||||
-------------
|
||||
|
||||
PCRE2 is a library of functions to support regular expressions whose syntax
|
||||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Releases 10.00 and above of PCRE2 are distributed under the terms of the "BSD"
|
||||
licence, as specified below, with one exemption for certain binary
|
||||
redistributions. The documentation for PCRE2, supplied in the "doc" directory,
|
||||
is distributed under the same terms as the software itself. The data in the
|
||||
testdata directory is not copyrighted and is in the public domain.
|
||||
|
||||
The basic library functions are written in C and are freestanding. Also
|
||||
included in the distribution is a just-in-time compiler that can be used to
|
||||
optimize pattern matching. This is an optional feature that can be omitted when
|
||||
the library is built.
|
||||
|
||||
|
||||
THE BASIC LIBRARY FUNCTIONS
|
||||
---------------------------
|
||||
|
||||
Written by: Philip Hazel
|
||||
Email local part: Philip.Hazel
|
||||
Email domain: gmail.com
|
||||
|
||||
Retired from University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2022 University of Cambridge
|
||||
All rights reserved.
|
||||
|
||||
|
||||
PCRE2 JUST-IN-TIME COMPILATION SUPPORT
|
||||
--------------------------------------
|
||||
|
||||
Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Email domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2022 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
STACK-LESS JUST-IN-TIME COMPILER
|
||||
--------------------------------
|
||||
|
||||
Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Email domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2022 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
THE "BSD" LICENCE
|
||||
-----------------
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notices,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notices, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the University of Cambridge nor the names of any
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
EXEMPTION FOR BINARY LIBRARY-LIKE PACKAGES
|
||||
------------------------------------------
|
||||
|
||||
The second condition in the BSD licence (covering binary redistributions) does
|
||||
not apply all the way down a chain of software. If binary package A includes
|
||||
PCRE2, it must respect the condition, but if package B is software that
|
||||
includes package A, the condition is not imposed on package B unless it uses
|
||||
PCRE2 independently.
|
||||
|
||||
End
|
42
README.md
Normal file
42
README.md
Normal file
@ -0,0 +1,42 @@
|
||||
# pcre
|
||||
This package provides a CGo-free port of the PCRE2 regular expression library. The [lib](lib) directory contains source code automatically translated from PCRE2's C source. This package wraps that code and provides an interface as close as possible to Go's stdlib [regexp](https://pkg.go.dev/regexp) package
|
||||
|
||||
---
|
||||
|
||||
## Supported GOOS/GOARCH:
|
||||
|
||||
- linux/amd64
|
||||
- linux/386
|
||||
- linux/arm64
|
||||
- linux/arm
|
||||
- linux/riscv64
|
||||
|
||||
More OS support is planned.
|
||||
|
||||
---
|
||||
|
||||
## How to transpile pcre2
|
||||
|
||||
In order to transpile pcre2, a Go and C compiler (preferably GCC) will be needed.
|
||||
|
||||
- First, install [ccgo](https://pkg.go.dev/modernc.org/ccgo/v3)
|
||||
|
||||
- Then, download the pcre source code. It can be found here: https://github.com/PCRE2Project/pcre2.
|
||||
|
||||
- Once downloaded, `cd` into the source directory
|
||||
|
||||
- Run `./configure`. If cross-compiling, provide the path to the cross-compiler in the `CC` variable, and set `--target` to the target architecture.
|
||||
|
||||
- When it completes, there should be a `Makefile` in the directory.
|
||||
|
||||
- Run `ccgo -compiledb pcre.json make`. Do not add `-j` arguments to the make command.
|
||||
|
||||
- Run the following command (replace items in triangle brackets):
|
||||
|
||||
```shell
|
||||
CC=/usr/bin/gcc ccgo -o pcre2_<os>_<arch>.go -pkgname lib -trace-translation-units -export-externs X -export-defines D -export-fields F -export-structs S -export-typedefs T pcre.json .libs/libpcre2-8.a
|
||||
```
|
||||
|
||||
- If cross-compiling, set the `CCGO_CC` variable to to path of the cross-compiler, and the `CCGO_AR` variable to the path of the cross-compiler's `ar` binary. Also, set `TARGET_GOARCH` to the GOARCH you're targeting and `TARGET_GOOS` to the OS you're targeting.
|
||||
|
||||
- Once the command completes, two go files will be created. One will start with `pcre2`, the other with `capi`. Copy both of these to the `lib` directory in this repo.
|
82
error.go
Normal file
82
error.go
Normal file
@ -0,0 +1,82 @@
|
||||
package pcre
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"unsafe"
|
||||
|
||||
"go.arsenm.dev/pcre/lib"
|
||||
|
||||
"modernc.org/libc"
|
||||
"modernc.org/libc/sys/types"
|
||||
)
|
||||
|
||||
var pce pcreError
|
||||
|
||||
// pcreError is meant to be manually allocated
|
||||
// for when pcre requires a pointer to store an error
|
||||
// such as for Xpcre2_compile_8().
|
||||
type pcreError struct {
|
||||
errCode int32
|
||||
errOffset lib.Tsize_t
|
||||
}
|
||||
|
||||
// allocError manually allocates memory for the
|
||||
// pcreError struct.
|
||||
//
|
||||
// libc.Xfree() should be called on the returned
|
||||
// pointer once it is no longer needed.
|
||||
func allocError(tls *libc.TLS) uintptr {
|
||||
return libc.Xmalloc(tls, types.Size_t(unsafe.Sizeof(pce)))
|
||||
}
|
||||
|
||||
// addErrCodeOffset adds the offset of the error code
|
||||
// within the pcreError struct to a given pointer
|
||||
func addErrCodeOffset(p uintptr) uintptr {
|
||||
ptrOffset := unsafe.Offsetof(pce.errCode)
|
||||
return p + ptrOffset
|
||||
}
|
||||
|
||||
// addErrOffsetOffset adds the offset of the error
|
||||
// offset within the pcreError struct to a given pointer
|
||||
func addErrOffsetOffset(p uintptr) uintptr {
|
||||
offsetOffset := unsafe.Offsetof(pce.errOffset)
|
||||
return p + offsetOffset
|
||||
}
|
||||
|
||||
// ptrToError converts the given pointer to a Go error
|
||||
func ptrToError(tls *libc.TLS, pe uintptr) *PcreError {
|
||||
eo := *(*pcreError)(unsafe.Pointer(pe))
|
||||
|
||||
err := codeToError(tls, eo.errCode)
|
||||
err.offset = eo.errOffset
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// codeToError converts the given error code into a Go error
|
||||
func codeToError(tls *libc.TLS, code int32) *PcreError {
|
||||
errBuf := make([]byte, 256)
|
||||
cErrBuf := uintptr(unsafe.Pointer(&errBuf[0]))
|
||||
|
||||
// Get the textual error message associated with the code,
|
||||
// and store it in errBuf.
|
||||
msgLen := lib.Xpcre2_get_error_message_8(tls, code, cErrBuf, 256)
|
||||
|
||||
return &PcreError{0, string(errBuf[:msgLen])}
|
||||
}
|
||||
|
||||
// PcreError represents errors returned
|
||||
// by underlying pcre2 functions.
|
||||
type PcreError struct {
|
||||
offset lib.Tsize_t
|
||||
errStr string
|
||||
}
|
||||
|
||||
// Error returns the string within the error,
|
||||
// prepending the offset if it exists.
|
||||
func (pe *PcreError) Error() string {
|
||||
if pe.offset == 0 {
|
||||
return pe.errStr
|
||||
}
|
||||
return fmt.Sprintf("offset %d: %s", pe.offset, pe.errStr)
|
||||
}
|
14
go.mod
Normal file
14
go.mod
Normal file
@ -0,0 +1,14 @@
|
||||
module go.arsenm.dev/pcre
|
||||
|
||||
go 1.18
|
||||
|
||||
require modernc.org/libc v1.16.8
|
||||
|
||||
require (
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
github.com/mattn/go-isatty v0.0.12 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac // indirect
|
||||
modernc.org/mathutil v1.4.1 // indirect
|
||||
modernc.org/memory v1.1.1 // indirect
|
||||
)
|
55
go.sum
Normal file
55
go.sum
Normal file
@ -0,0 +1,55 @@
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw=
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
|
||||
modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
|
||||
modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
|
||||
modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
|
||||
modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
|
||||
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
|
||||
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
|
||||
modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
|
||||
modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A=
|
||||
modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
|
||||
modernc.org/libc v1.16.8 h1:Ux98PaOMvolgoFX/YwusFOHBnanXdGRmWgI8ciI2z4o=
|
||||
modernc.org/libc v1.16.8/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
|
||||
modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
||||
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
|
||||
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
|
||||
modernc.org/memory v1.1.1 h1:bDOL0DIDLQv7bWhP3gMvIrnoFw+Eo6F7a2QK9HPDiFU=
|
||||
modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
|
||||
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
|
||||
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
|
||||
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
128
lib/capi_linux_386.go
Normal file
128
lib/capi_linux_386.go
Normal file
@ -0,0 +1,128 @@
|
||||
// Code generated by 'ccgo -o pcre2_linux_386.go -pkgname lib -trace-translation-units -export-externs X -export-defines D -export-fields F -export-structs S -export-typedefs T pcre.json .libs/libpcre2-8.a', DO NOT EDIT.
|
||||
|
||||
package lib
|
||||
|
||||
var CAPI = map[string]struct{}{
|
||||
"_pcre2_OP_lengths_8": {},
|
||||
"_pcre2_auto_possessify_8": {},
|
||||
"_pcre2_callout_end_delims_8": {},
|
||||
"_pcre2_callout_start_delims_8": {},
|
||||
"_pcre2_check_escape_8": {},
|
||||
"_pcre2_default_compile_context_8": {},
|
||||
"_pcre2_default_convert_context_8": {},
|
||||
"_pcre2_default_match_context_8": {},
|
||||
"_pcre2_default_tables_8": {},
|
||||
"_pcre2_extuni_8": {},
|
||||
"_pcre2_find_bracket_8": {},
|
||||
"_pcre2_hspace_list_8": {},
|
||||
"_pcre2_is_newline_8": {},
|
||||
"_pcre2_jit_free_8": {},
|
||||
"_pcre2_jit_free_rodata_8": {},
|
||||
"_pcre2_jit_get_size_8": {},
|
||||
"_pcre2_jit_get_target_8": {},
|
||||
"_pcre2_memctl_malloc_8": {},
|
||||
"_pcre2_ord2utf_8": {},
|
||||
"_pcre2_script_run_8": {},
|
||||
"_pcre2_strcmp_8": {},
|
||||
"_pcre2_strcmp_c8_8": {},
|
||||
"_pcre2_strcpy_c8_8": {},
|
||||
"_pcre2_strlen_8": {},
|
||||
"_pcre2_strncmp_8": {},
|
||||
"_pcre2_strncmp_c8_8": {},
|
||||
"_pcre2_study_8": {},
|
||||
"_pcre2_ucd_boolprop_sets_8": {},
|
||||
"_pcre2_ucd_caseless_sets_8": {},
|
||||
"_pcre2_ucd_digit_sets_8": {},
|
||||
"_pcre2_ucd_records_8": {},
|
||||
"_pcre2_ucd_script_sets_8": {},
|
||||
"_pcre2_ucd_stage1_8": {},
|
||||
"_pcre2_ucd_stage2_8": {},
|
||||
"_pcre2_ucp_gbtable_8": {},
|
||||
"_pcre2_ucp_gentype_8": {},
|
||||
"_pcre2_unicode_version_8": {},
|
||||
"_pcre2_utf8_table1": {},
|
||||
"_pcre2_utf8_table1_size": {},
|
||||
"_pcre2_utf8_table2": {},
|
||||
"_pcre2_utf8_table3": {},
|
||||
"_pcre2_utf8_table4": {},
|
||||
"_pcre2_utt_8": {},
|
||||
"_pcre2_utt_names_8": {},
|
||||
"_pcre2_utt_size_8": {},
|
||||
"_pcre2_valid_utf_8": {},
|
||||
"_pcre2_vspace_list_8": {},
|
||||
"_pcre2_was_newline_8": {},
|
||||
"_pcre2_xclass_8": {},
|
||||
"pcre2_callout_enumerate_8": {},
|
||||
"pcre2_code_copy_8": {},
|
||||
"pcre2_code_copy_with_tables_8": {},
|
||||
"pcre2_code_free_8": {},
|
||||
"pcre2_compile_8": {},
|
||||
"pcre2_compile_context_copy_8": {},
|
||||
"pcre2_compile_context_create_8": {},
|
||||
"pcre2_compile_context_free_8": {},
|
||||
"pcre2_config_8": {},
|
||||
"pcre2_convert_context_copy_8": {},
|
||||
"pcre2_convert_context_create_8": {},
|
||||
"pcre2_convert_context_free_8": {},
|
||||
"pcre2_converted_pattern_free_8": {},
|
||||
"pcre2_dfa_match_8": {},
|
||||
"pcre2_general_context_copy_8": {},
|
||||
"pcre2_general_context_create_8": {},
|
||||
"pcre2_general_context_free_8": {},
|
||||
"pcre2_get_error_message_8": {},
|
||||
"pcre2_get_mark_8": {},
|
||||
"pcre2_get_match_data_size_8": {},
|
||||
"pcre2_get_ovector_count_8": {},
|
||||
"pcre2_get_ovector_pointer_8": {},
|
||||
"pcre2_get_startchar_8": {},
|
||||
"pcre2_jit_compile_8": {},
|
||||
"pcre2_jit_free_unused_memory_8": {},
|
||||
"pcre2_jit_match_8": {},
|
||||
"pcre2_jit_stack_assign_8": {},
|
||||
"pcre2_jit_stack_create_8": {},
|
||||
"pcre2_jit_stack_free_8": {},
|
||||
"pcre2_maketables_8": {},
|
||||
"pcre2_maketables_free_8": {},
|
||||
"pcre2_match_8": {},
|
||||
"pcre2_match_context_copy_8": {},
|
||||
"pcre2_match_context_create_8": {},
|
||||
"pcre2_match_context_free_8": {},
|
||||
"pcre2_match_data_create_8": {},
|
||||
"pcre2_match_data_create_from_pattern_8": {},
|
||||
"pcre2_match_data_free_8": {},
|
||||
"pcre2_pattern_convert_8": {},
|
||||
"pcre2_pattern_info_8": {},
|
||||
"pcre2_serialize_decode_8": {},
|
||||
"pcre2_serialize_encode_8": {},
|
||||
"pcre2_serialize_free_8": {},
|
||||
"pcre2_serialize_get_number_of_codes_8": {},
|
||||
"pcre2_set_bsr_8": {},
|
||||
"pcre2_set_callout_8": {},
|
||||
"pcre2_set_character_tables_8": {},
|
||||
"pcre2_set_compile_extra_options_8": {},
|
||||
"pcre2_set_compile_recursion_guard_8": {},
|
||||
"pcre2_set_depth_limit_8": {},
|
||||
"pcre2_set_glob_escape_8": {},
|
||||
"pcre2_set_glob_separator_8": {},
|
||||
"pcre2_set_heap_limit_8": {},
|
||||
"pcre2_set_match_limit_8": {},
|
||||
"pcre2_set_max_pattern_length_8": {},
|
||||
"pcre2_set_newline_8": {},
|
||||
"pcre2_set_offset_limit_8": {},
|
||||
"pcre2_set_parens_nest_limit_8": {},
|
||||
"pcre2_set_recursion_limit_8": {},
|
||||
"pcre2_set_recursion_memory_management_8": {},
|
||||
"pcre2_set_substitute_callout_8": {},
|
||||
"pcre2_substitute_8": {},
|
||||
"pcre2_substring_copy_byname_8": {},
|
||||
"pcre2_substring_copy_bynumber_8": {},
|
||||
"pcre2_substring_free_8": {},
|
||||
"pcre2_substring_get_byname_8": {},
|
||||
"pcre2_substring_get_bynumber_8": {},
|
||||
"pcre2_substring_length_byname_8": {},
|
||||
"pcre2_substring_length_bynumber_8": {},
|
||||
"pcre2_substring_list_free_8": {},
|
||||
"pcre2_substring_list_get_8": {},
|
||||
"pcre2_substring_nametable_scan_8": {},
|
||||
"pcre2_substring_number_from_name_8": {},
|
||||
}
|
128
lib/capi_linux_amd64.go
Normal file
128
lib/capi_linux_amd64.go
Normal file
@ -0,0 +1,128 @@
|
||||
// Code generated by 'ccgo -o pcre2.go -pkgname lib -trace-translation-units -export-externs X -export-defines D -export-fields F -export-structs S -export-typedefs T pcre.json .libs/libpcre2-8.a', DO NOT EDIT.
|
||||
|
||||
package lib
|
||||
|
||||
var CAPI = map[string]struct{}{
|
||||
"_pcre2_OP_lengths_8": {},
|
||||
"_pcre2_auto_possessify_8": {},
|
||||
"_pcre2_callout_end_delims_8": {},
|
||||
"_pcre2_callout_start_delims_8": {},
|
||||
"_pcre2_check_escape_8": {},
|
||||
"_pcre2_default_compile_context_8": {},
|
||||
"_pcre2_default_convert_context_8": {},
|
||||
"_pcre2_default_match_context_8": {},
|
||||
"_pcre2_default_tables_8": {},
|
||||
"_pcre2_extuni_8": {},
|
||||
"_pcre2_find_bracket_8": {},
|
||||
"_pcre2_hspace_list_8": {},
|
||||
"_pcre2_is_newline_8": {},
|
||||
"_pcre2_jit_free_8": {},
|
||||
"_pcre2_jit_free_rodata_8": {},
|
||||
"_pcre2_jit_get_size_8": {},
|
||||
"_pcre2_jit_get_target_8": {},
|
||||
"_pcre2_memctl_malloc_8": {},
|
||||
"_pcre2_ord2utf_8": {},
|
||||
"_pcre2_script_run_8": {},
|
||||
"_pcre2_strcmp_8": {},
|
||||
"_pcre2_strcmp_c8_8": {},
|
||||
"_pcre2_strcpy_c8_8": {},
|
||||
"_pcre2_strlen_8": {},
|
||||
"_pcre2_strncmp_8": {},
|
||||
"_pcre2_strncmp_c8_8": {},
|
||||
"_pcre2_study_8": {},
|
||||
"_pcre2_ucd_boolprop_sets_8": {},
|
||||
"_pcre2_ucd_caseless_sets_8": {},
|
||||
"_pcre2_ucd_digit_sets_8": {},
|
||||
"_pcre2_ucd_records_8": {},
|
||||
"_pcre2_ucd_script_sets_8": {},
|
||||
"_pcre2_ucd_stage1_8": {},
|
||||
"_pcre2_ucd_stage2_8": {},
|
||||
"_pcre2_ucp_gbtable_8": {},
|
||||
"_pcre2_ucp_gentype_8": {},
|
||||
"_pcre2_unicode_version_8": {},
|
||||
"_pcre2_utf8_table1": {},
|
||||
"_pcre2_utf8_table1_size": {},
|
||||
"_pcre2_utf8_table2": {},
|
||||
"_pcre2_utf8_table3": {},
|
||||
"_pcre2_utf8_table4": {},
|
||||
"_pcre2_utt_8": {},
|
||||
"_pcre2_utt_names_8": {},
|
||||
"_pcre2_utt_size_8": {},
|
||||
"_pcre2_valid_utf_8": {},
|
||||
"_pcre2_vspace_list_8": {},
|
||||
"_pcre2_was_newline_8": {},
|
||||
"_pcre2_xclass_8": {},
|
||||
"pcre2_callout_enumerate_8": {},
|
||||
"pcre2_code_copy_8": {},
|
||||
"pcre2_code_copy_with_tables_8": {},
|
||||
"pcre2_code_free_8": {},
|
||||
"pcre2_compile_8": {},
|
||||
"pcre2_compile_context_copy_8": {},
|
||||
"pcre2_compile_context_create_8": {},
|
||||
"pcre2_compile_context_free_8": {},
|
||||
"pcre2_config_8": {},
|
||||
"pcre2_convert_context_copy_8": {},
|
||||
"pcre2_convert_context_create_8": {},
|
||||
"pcre2_convert_context_free_8": {},
|
||||
"pcre2_converted_pattern_free_8": {},
|
||||
"pcre2_dfa_match_8": {},
|
||||
"pcre2_general_context_copy_8": {},
|
||||
"pcre2_general_context_create_8": {},
|
||||
"pcre2_general_context_free_8": {},
|
||||
"pcre2_get_error_message_8": {},
|
||||
"pcre2_get_mark_8": {},
|
||||
"pcre2_get_match_data_size_8": {},
|
||||
"pcre2_get_ovector_count_8": {},
|
||||
"pcre2_get_ovector_pointer_8": {},
|
||||
"pcre2_get_startchar_8": {},
|
||||
"pcre2_jit_compile_8": {},
|
||||
"pcre2_jit_free_unused_memory_8": {},
|
||||
"pcre2_jit_match_8": {},
|
||||
"pcre2_jit_stack_assign_8": {},
|
||||
"pcre2_jit_stack_create_8": {},
|
||||
"pcre2_jit_stack_free_8": {},
|
||||
"pcre2_maketables_8": {},
|
||||
"pcre2_maketables_free_8": {},
|
||||
"pcre2_match_8": {},
|
||||
"pcre2_match_context_copy_8": {},
|
||||
"pcre2_match_context_create_8": {},
|
||||
"pcre2_match_context_free_8": {},
|
||||
"pcre2_match_data_create_8": {},
|
||||
"pcre2_match_data_create_from_pattern_8": {},
|
||||
"pcre2_match_data_free_8": {},
|
||||
"pcre2_pattern_convert_8": {},
|
||||
"pcre2_pattern_info_8": {},
|
||||
"pcre2_serialize_decode_8": {},
|
||||
"pcre2_serialize_encode_8": {},
|
||||
"pcre2_serialize_free_8": {},
|
||||
"pcre2_serialize_get_number_of_codes_8": {},
|
||||
"pcre2_set_bsr_8": {},
|
||||
"pcre2_set_callout_8": {},
|
||||
"pcre2_set_character_tables_8": {},
|
||||
"pcre2_set_compile_extra_options_8": {},
|
||||
"pcre2_set_compile_recursion_guard_8": {},
|
||||
"pcre2_set_depth_limit_8": {},
|
||||
"pcre2_set_glob_escape_8": {},
|
||||
"pcre2_set_glob_separator_8": {},
|
||||
"pcre2_set_heap_limit_8": {},
|
||||
"pcre2_set_match_limit_8": {},
|
||||
"pcre2_set_max_pattern_length_8": {},
|
||||
"pcre2_set_newline_8": {},
|
||||
"pcre2_set_offset_limit_8": {},
|
||||
"pcre2_set_parens_nest_limit_8": {},
|
||||
"pcre2_set_recursion_limit_8": {},
|
||||
"pcre2_set_recursion_memory_management_8": {},
|
||||
"pcre2_set_substitute_callout_8": {},
|
||||
"pcre2_substitute_8": {},
|
||||
"pcre2_substring_copy_byname_8": {},
|
||||
"pcre2_substring_copy_bynumber_8": {},
|
||||
"pcre2_substring_free_8": {},
|
||||
"pcre2_substring_get_byname_8": {},
|
||||
"pcre2_substring_get_bynumber_8": {},
|
||||
"pcre2_substring_length_byname_8": {},
|
||||
"pcre2_substring_length_bynumber_8": {},
|
||||
"pcre2_substring_list_free_8": {},
|
||||
"pcre2_substring_list_get_8": {},
|
||||
"pcre2_substring_nametable_scan_8": {},
|
||||
"pcre2_substring_number_from_name_8": {},
|
||||
}
|
128
lib/capi_linux_arm.go
Normal file
128
lib/capi_linux_arm.go
Normal file
@ -0,0 +1,128 @@
|
||||
// Code generated by 'ccgo -o pcre2_linux_arm.go -pkgname lib -trace-translation-units -export-externs X -export-defines D -export-fields F -export-structs S -export-typedefs T pcre.json .libs/libpcre2-8.a', DO NOT EDIT.
|
||||
|
||||
package lib
|
||||
|
||||
var CAPI = map[string]struct{}{
|
||||
"_pcre2_OP_lengths_8": {},
|
||||
"_pcre2_auto_possessify_8": {},
|
||||
"_pcre2_callout_end_delims_8": {},
|
||||
"_pcre2_callout_start_delims_8": {},
|
||||
"_pcre2_check_escape_8": {},
|
||||
"_pcre2_default_compile_context_8": {},
|
||||
"_pcre2_default_convert_context_8": {},
|
||||
"_pcre2_default_match_context_8": {},
|
||||
"_pcre2_default_tables_8": {},
|
||||
"_pcre2_extuni_8": {},
|
||||
"_pcre2_find_bracket_8": {},
|
||||
"_pcre2_hspace_list_8": {},
|
||||
"_pcre2_is_newline_8": {},
|
||||
"_pcre2_jit_free_8": {},
|
||||
"_pcre2_jit_free_rodata_8": {},
|
||||
"_pcre2_jit_get_size_8": {},
|
||||
"_pcre2_jit_get_target_8": {},
|
||||
"_pcre2_memctl_malloc_8": {},
|
||||
"_pcre2_ord2utf_8": {},
|
||||
"_pcre2_script_run_8": {},
|
||||
"_pcre2_strcmp_8": {},
|
||||
"_pcre2_strcmp_c8_8": {},
|
||||
"_pcre2_strcpy_c8_8": {},
|
||||
"_pcre2_strlen_8": {},
|
||||
"_pcre2_strncmp_8": {},
|
||||
"_pcre2_strncmp_c8_8": {},
|
||||
"_pcre2_study_8": {},
|
||||
"_pcre2_ucd_boolprop_sets_8": {},
|
||||
"_pcre2_ucd_caseless_sets_8": {},
|
||||
"_pcre2_ucd_digit_sets_8": {},
|
||||
"_pcre2_ucd_records_8": {},
|
||||
"_pcre2_ucd_script_sets_8": {},
|
||||
"_pcre2_ucd_stage1_8": {},
|
||||
"_pcre2_ucd_stage2_8": {},
|
||||
"_pcre2_ucp_gbtable_8": {},
|
||||
"_pcre2_ucp_gentype_8": {},
|
||||
"_pcre2_unicode_version_8": {},
|
||||
"_pcre2_utf8_table1": {},
|
||||
"_pcre2_utf8_table1_size": {},
|
||||
"_pcre2_utf8_table2": {},
|
||||
"_pcre2_utf8_table3": {},
|
||||
"_pcre2_utf8_table4": {},
|
||||
"_pcre2_utt_8": {},
|
||||
"_pcre2_utt_names_8": {},
|
||||
"_pcre2_utt_size_8": {},
|
||||
"_pcre2_valid_utf_8": {},
|
||||
"_pcre2_vspace_list_8": {},
|
||||
"_pcre2_was_newline_8": {},
|
||||
"_pcre2_xclass_8": {},
|
||||
"pcre2_callout_enumerate_8": {},
|
||||
"pcre2_code_copy_8": {},
|
||||
"pcre2_code_copy_with_tables_8": {},
|
||||
"pcre2_code_free_8": {},
|
||||
"pcre2_compile_8": {},
|
||||
"pcre2_compile_context_copy_8": {},
|
||||
"pcre2_compile_context_create_8": {},
|
||||
"pcre2_compile_context_free_8": {},
|
||||
"pcre2_config_8": {},
|
||||
"pcre2_convert_context_copy_8": {},
|
||||
"pcre2_convert_context_create_8": {},
|
||||
"pcre2_convert_context_free_8": {},
|
||||
"pcre2_converted_pattern_free_8": {},
|
||||
"pcre2_dfa_match_8": {},
|
||||
"pcre2_general_context_copy_8": {},
|
||||
"pcre2_general_context_create_8": {},
|
||||
"pcre2_general_context_free_8": {},
|
||||
"pcre2_get_error_message_8": {},
|
||||
"pcre2_get_mark_8": {},
|
||||
"pcre2_get_match_data_size_8": {},
|
||||
"pcre2_get_ovector_count_8": {},
|
||||
"pcre2_get_ovector_pointer_8": {},
|
||||
"pcre2_get_startchar_8": {},
|
||||
"pcre2_jit_compile_8": {},
|
||||
"pcre2_jit_free_unused_memory_8": {},
|
||||
"pcre2_jit_match_8": {},
|
||||
"pcre2_jit_stack_assign_8": {},
|
||||
"pcre2_jit_stack_create_8": {},
|
||||
"pcre2_jit_stack_free_8": {},
|
||||
"pcre2_maketables_8": {},
|
||||
"pcre2_maketables_free_8": {},
|
||||
"pcre2_match_8": {},
|
||||
"pcre2_match_context_copy_8": {},
|
||||
"pcre2_match_context_create_8": {},
|
||||
"pcre2_match_context_free_8": {},
|
||||
"pcre2_match_data_create_8": {},
|
||||
"pcre2_match_data_create_from_pattern_8": {},
|
||||
"pcre2_match_data_free_8": {},
|
||||
"pcre2_pattern_convert_8": {},
|
||||
"pcre2_pattern_info_8": {},
|
||||
"pcre2_serialize_decode_8": {},
|
||||
"pcre2_serialize_encode_8": {},
|
||||
"pcre2_serialize_free_8": {},
|
||||
"pcre2_serialize_get_number_of_codes_8": {},
|
||||
"pcre2_set_bsr_8": {},
|
||||
"pcre2_set_callout_8": {},
|
||||
"pcre2_set_character_tables_8": {},
|
||||
"pcre2_set_compile_extra_options_8": {},
|
||||
"pcre2_set_compile_recursion_guard_8": {},
|
||||
"pcre2_set_depth_limit_8": {},
|
||||
"pcre2_set_glob_escape_8": {},
|
||||
"pcre2_set_glob_separator_8": {},
|
||||
"pcre2_set_heap_limit_8": {},
|
||||
"pcre2_set_match_limit_8": {},
|
||||
"pcre2_set_max_pattern_length_8": {},
|
||||
"pcre2_set_newline_8": {},
|
||||
"pcre2_set_offset_limit_8": {},
|
||||
"pcre2_set_parens_nest_limit_8": {},
|
||||
"pcre2_set_recursion_limit_8": {},
|
||||
"pcre2_set_recursion_memory_management_8": {},
|
||||
"pcre2_set_substitute_callout_8": {},
|
||||
"pcre2_substitute_8": {},
|
||||
"pcre2_substring_copy_byname_8": {},
|
||||
"pcre2_substring_copy_bynumber_8": {},
|
||||
"pcre2_substring_free_8": {},
|
||||
"pcre2_substring_get_byname_8": {},
|
||||
"pcre2_substring_get_bynumber_8": {},
|
||||
"pcre2_substring_length_byname_8": {},
|
||||
"pcre2_substring_length_bynumber_8": {},
|
||||
"pcre2_substring_list_free_8": {},
|
||||
"pcre2_substring_list_get_8": {},
|
||||
"pcre2_substring_nametable_scan_8": {},
|
||||
"pcre2_substring_number_from_name_8": {},
|
||||
}
|
128
lib/capi_linux_arm64.go
Normal file
128
lib/capi_linux_arm64.go
Normal file
@ -0,0 +1,128 @@
|
||||
// Code generated by 'ccgo -o pcre2.go -pkgname lib -trace-translation-units -export-externs X -export-defines D -export-fields F -export-structs S -export-typedefs T pcre.json .libs/libpcre2-8.a', DO NOT EDIT.
|
||||
|
||||
package lib
|
||||
|
||||
var CAPI = map[string]struct{}{
|
||||
"_pcre2_OP_lengths_8": {},
|
||||
"_pcre2_auto_possessify_8": {},
|
||||
"_pcre2_callout_end_delims_8": {},
|
||||
"_pcre2_callout_start_delims_8": {},
|
||||
"_pcre2_check_escape_8": {},
|
||||
"_pcre2_default_compile_context_8": {},
|
||||
"_pcre2_default_convert_context_8": {},
|
||||
"_pcre2_default_match_context_8": {},
|
||||
"_pcre2_default_tables_8": {},
|
||||
"_pcre2_extuni_8": {},
|
||||
"_pcre2_find_bracket_8": {},
|
||||
"_pcre2_hspace_list_8": {},
|
||||
"_pcre2_is_newline_8": {},
|
||||
"_pcre2_jit_free_8": {},
|
||||
"_pcre2_jit_free_rodata_8": {},
|
||||
"_pcre2_jit_get_size_8": {},
|
||||
"_pcre2_jit_get_target_8": {},
|
||||
"_pcre2_memctl_malloc_8": {},
|
||||
"_pcre2_ord2utf_8": {},
|
||||
"_pcre2_script_run_8": {},
|
||||
"_pcre2_strcmp_8": {},
|
||||
"_pcre2_strcmp_c8_8": {},
|
||||
"_pcre2_strcpy_c8_8": {},
|
||||
"_pcre2_strlen_8": {},
|
||||
"_pcre2_strncmp_8": {},
|
||||
"_pcre2_strncmp_c8_8": {},
|
||||
"_pcre2_study_8": {},
|
||||
"_pcre2_ucd_boolprop_sets_8": {},
|
||||
"_pcre2_ucd_caseless_sets_8": {},
|
||||
"_pcre2_ucd_digit_sets_8": {},
|
||||
"_pcre2_ucd_records_8": {},
|
||||
"_pcre2_ucd_script_sets_8": {},
|
||||
"_pcre2_ucd_stage1_8": {},
|
||||
"_pcre2_ucd_stage2_8": {},
|
||||
"_pcre2_ucp_gbtable_8": {},
|
||||
"_pcre2_ucp_gentype_8": {},
|
||||
"_pcre2_unicode_version_8": {},
|
||||
"_pcre2_utf8_table1": {},
|
||||
"_pcre2_utf8_table1_size": {},
|
||||
"_pcre2_utf8_table2": {},
|
||||
"_pcre2_utf8_table3": {},
|
||||
"_pcre2_utf8_table4": {},
|
||||
"_pcre2_utt_8": {},
|
||||
"_pcre2_utt_names_8": {},
|
||||
"_pcre2_utt_size_8": {},
|
||||
"_pcre2_valid_utf_8": {},
|
||||
"_pcre2_vspace_list_8": {},
|
||||
"_pcre2_was_newline_8": {},
|
||||
"_pcre2_xclass_8": {},
|
||||
"pcre2_callout_enumerate_8": {},
|
||||
"pcre2_code_copy_8": {},
|
||||
"pcre2_code_copy_with_tables_8": {},
|
||||
"pcre2_code_free_8": {},
|
||||
"pcre2_compile_8": {},
|
||||
"pcre2_compile_context_copy_8": {},
|
||||
"pcre2_compile_context_create_8": {},
|
||||
"pcre2_compile_context_free_8": {},
|
||||
"pcre2_config_8": {},
|
||||
"pcre2_convert_context_copy_8": {},
|
||||
"pcre2_convert_context_create_8": {},
|
||||
"pcre2_convert_context_free_8": {},
|
||||
"pcre2_converted_pattern_free_8": {},
|
||||
"pcre2_dfa_match_8": {},
|
||||
"pcre2_general_context_copy_8": {},
|
||||
"pcre2_general_context_create_8": {},
|
||||
"pcre2_general_context_free_8": {},
|
||||
"pcre2_get_error_message_8": {},
|
||||
"pcre2_get_mark_8": {},
|
||||
"pcre2_get_match_data_size_8": {},
|
||||
"pcre2_get_ovector_count_8": {},
|
||||
"pcre2_get_ovector_pointer_8": {},
|
||||
"pcre2_get_startchar_8": {},
|
||||
"pcre2_jit_compile_8": {},
|
||||
"pcre2_jit_free_unused_memory_8": {},
|
||||
"pcre2_jit_match_8": {},
|
||||
"pcre2_jit_stack_assign_8": {},
|
||||
"pcre2_jit_stack_create_8": {},
|
||||
"pcre2_jit_stack_free_8": {},
|
||||
"pcre2_maketables_8": {},
|
||||
"pcre2_maketables_free_8": {},
|
||||
"pcre2_match_8": {},
|
||||
"pcre2_match_context_copy_8": {},
|
||||
"pcre2_match_context_create_8": {},
|
||||
"pcre2_match_context_free_8": {},
|
||||
"pcre2_match_data_create_8": {},
|
||||
"pcre2_match_data_create_from_pattern_8": {},
|
||||
"pcre2_match_data_free_8": {},
|
||||
"pcre2_pattern_convert_8": {},
|
||||
"pcre2_pattern_info_8": {},
|
||||
"pcre2_serialize_decode_8": {},
|
||||
"pcre2_serialize_encode_8": {},
|
||||
"pcre2_serialize_free_8": {},
|
||||
"pcre2_serialize_get_number_of_codes_8": {},
|
||||
"pcre2_set_bsr_8": {},
|
||||
"pcre2_set_callout_8": {},
|
||||
"pcre2_set_character_tables_8": {},
|
||||
"pcre2_set_compile_extra_options_8": {},
|
||||
"pcre2_set_compile_recursion_guard_8": {},
|
||||
"pcre2_set_depth_limit_8": {},
|
||||
"pcre2_set_glob_escape_8": {},
|
||||
"pcre2_set_glob_separator_8": {},
|
||||
"pcre2_set_heap_limit_8": {},
|
||||
"pcre2_set_match_limit_8": {},
|
||||
"pcre2_set_max_pattern_length_8": {},
|
||||
"pcre2_set_newline_8": {},
|
||||
"pcre2_set_offset_limit_8": {},
|
||||
"pcre2_set_parens_nest_limit_8": {},
|
||||
"pcre2_set_recursion_limit_8": {},
|
||||
"pcre2_set_recursion_memory_management_8": {},
|
||||
"pcre2_set_substitute_callout_8": {},
|
||||
"pcre2_substitute_8": {},
|
||||
"pcre2_substring_copy_byname_8": {},
|
||||
"pcre2_substring_copy_bynumber_8": {},
|
||||
"pcre2_substring_free_8": {},
|
||||
"pcre2_substring_get_byname_8": {},
|
||||
"pcre2_substring_get_bynumber_8": {},
|
||||
"pcre2_substring_length_byname_8": {},
|
||||
"pcre2_substring_length_bynumber_8": {},
|
||||
"pcre2_substring_list_free_8": {},
|
||||
"pcre2_substring_list_get_8": {},
|
||||
"pcre2_substring_nametable_scan_8": {},
|
||||
"pcre2_substring_number_from_name_8": {},
|
||||
}
|
128
lib/capi_linux_riscv64.go
Normal file
128
lib/capi_linux_riscv64.go
Normal file
@ -0,0 +1,128 @@
|
||||
// Code generated by 'ccgo -o pcre2_linux_riscv64.go -pkgname lib -trace-translation-units -export-externs X -export-defines D -export-fields F -export-structs S -export-typedefs T pcre.json .libs/libpcre2-8.a', DO NOT EDIT.
|
||||
|
||||
package lib
|
||||
|
||||
var CAPI = map[string]struct{}{
|
||||
"_pcre2_OP_lengths_8": {},
|
||||
"_pcre2_auto_possessify_8": {},
|
||||
"_pcre2_callout_end_delims_8": {},
|
||||
"_pcre2_callout_start_delims_8": {},
|
||||
"_pcre2_check_escape_8": {},
|
||||
"_pcre2_default_compile_context_8": {},
|
||||
"_pcre2_default_convert_context_8": {},
|
||||
"_pcre2_default_match_context_8": {},
|
||||
"_pcre2_default_tables_8": {},
|
||||
"_pcre2_extuni_8": {},
|
||||
"_pcre2_find_bracket_8": {},
|
||||
"_pcre2_hspace_list_8": {},
|
||||
"_pcre2_is_newline_8": {},
|
||||
"_pcre2_jit_free_8": {},
|
||||
"_pcre2_jit_free_rodata_8": {},
|
||||
"_pcre2_jit_get_size_8": {},
|
||||
"_pcre2_jit_get_target_8": {},
|
||||
"_pcre2_memctl_malloc_8": {},
|
||||
"_pcre2_ord2utf_8": {},
|
||||
"_pcre2_script_run_8": {},
|
||||
"_pcre2_strcmp_8": {},
|
||||
"_pcre2_strcmp_c8_8": {},
|
||||
"_pcre2_strcpy_c8_8": {},
|
||||
"_pcre2_strlen_8": {},
|
||||
"_pcre2_strncmp_8": {},
|
||||
"_pcre2_strncmp_c8_8": {},
|
||||
"_pcre2_study_8": {},
|
||||
"_pcre2_ucd_boolprop_sets_8": {},
|
||||
"_pcre2_ucd_caseless_sets_8": {},
|
||||
"_pcre2_ucd_digit_sets_8": {},
|
||||
"_pcre2_ucd_records_8": {},
|
||||
"_pcre2_ucd_script_sets_8": {},
|
||||
"_pcre2_ucd_stage1_8": {},
|
||||
"_pcre2_ucd_stage2_8": {},
|
||||
"_pcre2_ucp_gbtable_8": {},
|
||||
"_pcre2_ucp_gentype_8": {},
|
||||
"_pcre2_unicode_version_8": {},
|
||||
"_pcre2_utf8_table1": {},
|
||||
"_pcre2_utf8_table1_size": {},
|
||||
"_pcre2_utf8_table2": {},
|
||||
"_pcre2_utf8_table3": {},
|
||||
"_pcre2_utf8_table4": {},
|
||||
"_pcre2_utt_8": {},
|
||||
"_pcre2_utt_names_8": {},
|
||||
"_pcre2_utt_size_8": {},
|
||||
"_pcre2_valid_utf_8": {},
|
||||
"_pcre2_vspace_list_8": {},
|
||||
"_pcre2_was_newline_8": {},
|
||||
"_pcre2_xclass_8": {},
|
||||
"pcre2_callout_enumerate_8": {},
|
||||
"pcre2_code_copy_8": {},
|
||||
"pcre2_code_copy_with_tables_8": {},
|
||||
"pcre2_code_free_8": {},
|
||||
"pcre2_compile_8": {},
|
||||
"pcre2_compile_context_copy_8": {},
|
||||
"pcre2_compile_context_create_8": {},
|
||||
"pcre2_compile_context_free_8": {},
|
||||
"pcre2_config_8": {},
|
||||
"pcre2_convert_context_copy_8": {},
|
||||
"pcre2_convert_context_create_8": {},
|
||||
"pcre2_convert_context_free_8": {},
|
||||
"pcre2_converted_pattern_free_8": {},
|
||||
"pcre2_dfa_match_8": {},
|
||||
"pcre2_general_context_copy_8": {},
|
||||
"pcre2_general_context_create_8": {},
|
||||
"pcre2_general_context_free_8": {},
|
||||
"pcre2_get_error_message_8": {},
|
||||
"pcre2_get_mark_8": {},
|
||||
"pcre2_get_match_data_size_8": {},
|
||||
"pcre2_get_ovector_count_8": {},
|
||||
"pcre2_get_ovector_pointer_8": {},
|
||||
"pcre2_get_startchar_8": {},
|
||||
"pcre2_jit_compile_8": {},
|
||||
"pcre2_jit_free_unused_memory_8": {},
|
||||
"pcre2_jit_match_8": {},
|
||||
"pcre2_jit_stack_assign_8": {},
|
||||
"pcre2_jit_stack_create_8": {},
|
||||
"pcre2_jit_stack_free_8": {},
|
||||
"pcre2_maketables_8": {},
|
||||
"pcre2_maketables_free_8": {},
|
||||
"pcre2_match_8": {},
|
||||
"pcre2_match_context_copy_8": {},
|
||||
"pcre2_match_context_create_8": {},
|
||||
"pcre2_match_context_free_8": {},
|
||||
"pcre2_match_data_create_8": {},
|
||||
"pcre2_match_data_create_from_pattern_8": {},
|
||||
"pcre2_match_data_free_8": {},
|
||||
"pcre2_pattern_convert_8": {},
|
||||
"pcre2_pattern_info_8": {},
|
||||
"pcre2_serialize_decode_8": {},
|
||||
"pcre2_serialize_encode_8": {},
|
||||
"pcre2_serialize_free_8": {},
|
||||
"pcre2_serialize_get_number_of_codes_8": {},
|
||||
"pcre2_set_bsr_8": {},
|
||||
"pcre2_set_callout_8": {},
|
||||
"pcre2_set_character_tables_8": {},
|
||||
"pcre2_set_compile_extra_options_8": {},
|
||||
"pcre2_set_compile_recursion_guard_8": {},
|
||||
"pcre2_set_depth_limit_8": {},
|
||||
"pcre2_set_glob_escape_8": {},
|
||||
"pcre2_set_glob_separator_8": {},
|
||||
"pcre2_set_heap_limit_8": {},
|
||||
"pcre2_set_match_limit_8": {},
|
||||
"pcre2_set_max_pattern_length_8": {},
|
||||
"pcre2_set_newline_8": {},
|
||||
"pcre2_set_offset_limit_8": {},
|
||||
"pcre2_set_parens_nest_limit_8": {},
|
||||
"pcre2_set_recursion_limit_8": {},
|
||||
"pcre2_set_recursion_memory_management_8": {},
|
||||
"pcre2_set_substitute_callout_8": {},
|
||||
"pcre2_substitute_8": {},
|
||||
"pcre2_substring_copy_byname_8": {},
|
||||
"pcre2_substring_copy_bynumber_8": {},
|
||||
"pcre2_substring_free_8": {},
|
||||
"pcre2_substring_get_byname_8": {},
|
||||
"pcre2_substring_get_bynumber_8": {},
|
||||
"pcre2_substring_length_byname_8": {},
|
||||
"pcre2_substring_length_bynumber_8": {},
|
||||
"pcre2_substring_list_free_8": {},
|
||||
"pcre2_substring_list_get_8": {},
|
||||
"pcre2_substring_nametable_scan_8": {},
|
||||
"pcre2_substring_number_from_name_8": {},
|
||||
}
|
70944
lib/pcre2_linux_386.go
Normal file
70944
lib/pcre2_linux_386.go
Normal file
File diff suppressed because one or more lines are too long
70962
lib/pcre2_linux_amd64.go
Normal file
70962
lib/pcre2_linux_amd64.go
Normal file
File diff suppressed because one or more lines are too long
70944
lib/pcre2_linux_arm.go
Normal file
70944
lib/pcre2_linux_arm.go
Normal file
File diff suppressed because one or more lines are too long
70962
lib/pcre2_linux_arm64.go
Normal file
70962
lib/pcre2_linux_arm64.go
Normal file
File diff suppressed because one or more lines are too long
70961
lib/pcre2_linux_riscv64.go
Normal file
70961
lib/pcre2_linux_riscv64.go
Normal file
File diff suppressed because one or more lines are too long
665
pcre.go
Normal file
665
pcre.go
Normal file
@ -0,0 +1,665 @@
|
||||
// Package pcre is a library that provides pcre2 regular expressions
|
||||
// in pure Go, allowing for features such as cross-compiling.
|
||||
//
|
||||
// The lib directory contains source code automatically translated from
|
||||
// pcre2's C source code for each supported architecture and/or OS.
|
||||
// This package wraps the automatically-translated source to provide a
|
||||
// safe interface as close to Go's regexp library as possible.
|
||||
package pcre
|
||||
|
||||
import (
|
||||
"os"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"sync"
|
||||
"unsafe"
|
||||
|
||||
"go.arsenm.dev/pcre/lib"
|
||||
|
||||
"modernc.org/libc"
|
||||
)
|
||||
|
||||
// Regexp represents a pcre2 regular expression
|
||||
type Regexp struct {
|
||||
mtx *sync.Mutex
|
||||
expr string
|
||||
re uintptr
|
||||
tls *libc.TLS
|
||||
}
|
||||
|
||||
// Compile runs CompileOpts with no options.
|
||||
//
|
||||
// Close() should be called on the returned expression
|
||||
// once it is no longer needed.
|
||||
func Compile(pattern string) (*Regexp, error) {
|
||||
return CompileOpts(pattern, 0)
|
||||
}
|
||||
|
||||
// CompileOpts compiles the provided pattern using the given options.
|
||||
//
|
||||
// Close() should be called on the returned expression
|
||||
// once it is no longer needed.
|
||||
func CompileOpts(pattern string, options CompileOption) (*Regexp, error) {
|
||||
tls := libc.NewTLS()
|
||||
|
||||
// Get C string of pattern
|
||||
cPattern, err := libc.CString(pattern)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Free the string when done
|
||||
defer libc.Xfree(tls, cPattern)
|
||||
|
||||
// Allocate new error
|
||||
cErr := allocError(tls)
|
||||
// Free error when done
|
||||
defer libc.Xfree(tls, cErr)
|
||||
|
||||
// Get error offsets
|
||||
errPtr := addErrCodeOffset(cErr)
|
||||
errOffsetPtr := addErrOffsetOffset(cErr)
|
||||
|
||||
// Convert pattern length to size_t type
|
||||
cPatLen := lib.Tsize_t(len(pattern))
|
||||
|
||||
// Compile expression
|
||||
r := lib.Xpcre2_compile_8(tls, cPattern, cPatLen, uint32(options), errPtr, errOffsetPtr, 0)
|
||||
if r == 0 {
|
||||
return nil, ptrToError(tls, cErr)
|
||||
}
|
||||
|
||||
// Create regexp instance
|
||||
regex := Regexp{
|
||||
expr: pattern,
|
||||
mtx: &sync.Mutex{},
|
||||
re: r,
|
||||
tls: tls,
|
||||
}
|
||||
|
||||
// Make sure resources are freed if GC collects the
|
||||
// regular expression.
|
||||
runtime.SetFinalizer(®ex, func(r *Regexp) error {
|
||||
return r.Close()
|
||||
})
|
||||
|
||||
return ®ex, nil
|
||||
}
|
||||
|
||||
// MustCompile compiles the given pattern and panics
|
||||
// if there was an error
|
||||
//
|
||||
// Close() should be called on the returned expression
|
||||
// once it is no longer needed.
|
||||
func MustCompile(pattern string) *Regexp {
|
||||
rgx, err := Compile(pattern)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return rgx
|
||||
}
|
||||
|
||||
// MustCompileOpts compiles the given pattern with the given
|
||||
// options and panics if there was an error.
|
||||
//
|
||||
// Close() should be called on the returned expression
|
||||
// once it is no longer needed.
|
||||
func MustCompileOpts(pattern string, options CompileOption) *Regexp {
|
||||
rgx, err := CompileOpts(pattern, options)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return rgx
|
||||
}
|
||||
|
||||
// Find returns the leftmost match of the regular expression.
|
||||
// A return value of nil indicates no match.
|
||||
func (r *Regexp) Find(b []byte) []byte {
|
||||
matches, err := r.match(b, 0, false)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
match := matches[0]
|
||||
return b[match[0]:match[1]]
|
||||
}
|
||||
|
||||
// FindIndex returns a two-element slice of integers
|
||||
// representing the location of the leftmost match of the
|
||||
// regular expression.
|
||||
func (r *Regexp) FindIndex(b []byte) []int {
|
||||
matches, err := r.match(b, 0, false)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
match := matches[0]
|
||||
|
||||
return []int{int(match[0]), int(match[1])}
|
||||
}
|
||||
|
||||
// FindAll returns all matches of the regular expression.
|
||||
// A return value of nil indicates no match.
|
||||
func (r *Regexp) FindAll(b []byte, n int) [][]byte {
|
||||
matches, err := r.match(b, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 || n == 0 {
|
||||
return nil
|
||||
}
|
||||
if n > 0 && len(matches) > n {
|
||||
matches = matches[:n]
|
||||
}
|
||||
|
||||
var out [][]byte
|
||||
for _, match := range matches {
|
||||
out = append(out, b[match[0]:match[1]])
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// FindAll returns indices of all matches of the
|
||||
// regular expression. A return value of nil indicates
|
||||
// no match.
|
||||
func (r *Regexp) FindAllIndex(b []byte, n int) [][]int {
|
||||
matches, err := r.match(b, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 || n == 0 {
|
||||
return nil
|
||||
}
|
||||
if n > 0 && len(matches) > n {
|
||||
matches = matches[:n]
|
||||
}
|
||||
|
||||
var out [][]int
|
||||
for _, match := range matches {
|
||||
out = append(out, []int{int(match[0]), int(match[1])})
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// FindSubmatch returns a slice containing the match as the
|
||||
// first element, and the submatches as the subsequent elements.
|
||||
func (r *Regexp) FindSubmatch(b []byte) [][]byte {
|
||||
matches, err := r.match(b, 0, false)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
match := matches[0]
|
||||
|
||||
out := make([][]byte, len(match))
|
||||
for i := 0; i < len(match); i += 2 {
|
||||
out[i] = b[match[i]:match[i+1]]
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// FindSubmatchIndex returns a slice of index pairs representing
|
||||
// the match and submatches, if any.
|
||||
func (r *Regexp) FindSubmatchIndex(b []byte) []int {
|
||||
matches, err := r.match(b, 0, false)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
match := matches[0]
|
||||
|
||||
out := make([]int, len(match))
|
||||
for index, offset := range match {
|
||||
out[index] = int(offset)
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// FindAllSubmatch returns a slice of all matches and submatches
|
||||
// of the regular expression. It will return no more than n matches.
|
||||
// If n < 0, it will return all matches.
|
||||
func (r *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte {
|
||||
matches, err := r.match(b, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 || n == 0 {
|
||||
return nil
|
||||
}
|
||||
if n > 0 && len(matches) > n {
|
||||
matches = matches[:n]
|
||||
}
|
||||
|
||||
out := make([][][]byte, len(matches))
|
||||
for index, match := range matches {
|
||||
var outMatch [][]byte
|
||||
|
||||
for i := 0; i < len(match); i += 2 {
|
||||
outMatch = append(outMatch, b[match[i]:match[i+1]])
|
||||
}
|
||||
|
||||
out[index] = outMatch
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// FindAllSubmatch returns a slice of all indeces representing the
|
||||
// locations of matches and submatches, if any, of the regular expression.
|
||||
// It will return no more than n matches. If n < 0, it will return all matches.
|
||||
func (r *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int {
|
||||
matches, err := r.match(b, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 || n == 0 {
|
||||
return nil
|
||||
}
|
||||
if n > 0 && len(matches) > n {
|
||||
matches = matches[:n]
|
||||
}
|
||||
|
||||
out := make([][]int, len(matches))
|
||||
for index, match := range matches {
|
||||
offsets := make([]int, len(match))
|
||||
|
||||
for index, offset := range match {
|
||||
offsets[index] = int(offset)
|
||||
}
|
||||
|
||||
out[index] = offsets
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// FindString is the String version of Find
|
||||
func (r *Regexp) FindString(s string) string {
|
||||
return string(r.Find([]byte(s)))
|
||||
}
|
||||
|
||||
// FindStringIndex is the String version of FindIndex
|
||||
func (r *Regexp) FindStringIndex(s string) []int {
|
||||
return r.FindIndex([]byte(s))
|
||||
}
|
||||
|
||||
// FinAllString is the String version of FindAll
|
||||
func (r *Regexp) FindAllString(s string, n int) []string {
|
||||
matches := r.FindAll([]byte(s), n)
|
||||
out := make([]string, len(matches))
|
||||
for index, match := range matches {
|
||||
out[index] = string(match)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// FindAllStringIndex is the String version of FindIndex
|
||||
func (r *Regexp) FindAllStringIndex(s string, n int) [][]int {
|
||||
return r.FindAllIndex([]byte(s), n)
|
||||
}
|
||||
|
||||
// FindStringSubmatch is the string version of FindSubmatch
|
||||
func (r *Regexp) FindStringSubmatch(s string) []string {
|
||||
matches := r.FindSubmatch([]byte(s))
|
||||
|
||||
out := make([]string, len(matches))
|
||||
for index, match := range matches {
|
||||
out[index] = string(match)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// FindStringSubmatchIndex is the String version of FindSubmatchIndex
|
||||
func (r *Regexp) FindStringSubmatchIndex(s string) []int {
|
||||
return r.FindSubmatchIndex([]byte(s))
|
||||
}
|
||||
|
||||
// FindAllStringSubmatch is the String version of FindAllSubmatch
|
||||
func (r *Regexp) FindAllStringSubmatch(s string, n int) [][]string {
|
||||
matches := r.FindAllSubmatch([]byte(s), n)
|
||||
|
||||
out := make([][]string, len(matches))
|
||||
for index, match := range matches {
|
||||
outMatch := make([]string, len(match))
|
||||
|
||||
for index, byteMatch := range match {
|
||||
outMatch[index] = string(byteMatch)
|
||||
}
|
||||
|
||||
out[index] = outMatch
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// FindAllStringSubmatchIndex is the String version of FindAllSubmatchIndex
|
||||
func (r *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int {
|
||||
return r.FindAllSubmatchIndex([]byte(s), n)
|
||||
}
|
||||
|
||||
// Match reports whether b contains a match of the regular expression
|
||||
func (r *Regexp) Match(b []byte) bool {
|
||||
return r.Find(b) != nil
|
||||
}
|
||||
|
||||
// MatchString is the String version of Match
|
||||
func (r *Regexp) MatchString(s string) bool {
|
||||
return r.Find([]byte(s)) != nil
|
||||
}
|
||||
|
||||
// NumSubexp returns the number of parenthesized subexpressions
|
||||
// in the regular expression.
|
||||
func (r *Regexp) NumSubexp() int {
|
||||
return int(r.patternInfo(lib.DPCRE2_INFO_CAPTURECOUNT))
|
||||
}
|
||||
|
||||
// ReplaceAll returns a copy of src, replacing matches of the
|
||||
// regular expression with the replacement text repl.
|
||||
// Inside repl, $ signs are interpreted as in Expand,
|
||||
// so for instance $1 represents the text of the first
|
||||
// submatch.
|
||||
func (r *Regexp) ReplaceAll(src, repl []byte) []byte {
|
||||
matches, err := r.match(src, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
out := make([]byte, len(src))
|
||||
copy(out, src)
|
||||
|
||||
var diff int64
|
||||
for _, match := range matches {
|
||||
replStr := os.Expand(string(repl), func(s string) string {
|
||||
i, err := strconv.Atoi(s)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
// If there given match does not exist, return empty string
|
||||
if i == 0 || len(match) < (2*i)+1 {
|
||||
return ""
|
||||
}
|
||||
|
||||
// Return match
|
||||
return string(src[match[2*i]:match[(2*i)+1]])
|
||||
})
|
||||
// Replace replacement string with expanded string
|
||||
repl := []byte(replStr)
|
||||
|
||||
// Replace bytes with new replacement string
|
||||
diff, out = replaceBytes(out, repl, match[0], match[1], diff)
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// ReplaceAllFunc returns a copy of src in which all matches of the
|
||||
// regular expression have been replaced by the return value of function
|
||||
// repl applied to the matched byte slice. The replacement returned by
|
||||
// repl is substituted directly, without using Expand.
|
||||
func (r *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte {
|
||||
matches, err := r.match(src, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
out := make([]byte, len(src))
|
||||
copy(out, src)
|
||||
|
||||
var diff int64
|
||||
for _, match := range matches {
|
||||
replBytes := repl(src[match[0]:match[1]])
|
||||
diff, out = replaceBytes(out, replBytes, match[0], match[1], diff)
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// ReplaceAllLiteral returns a copy of src, replacing matches of
|
||||
// the regular expression with the replacement bytes repl.
|
||||
// The replacement is substituted directly, without using Expand.
|
||||
func (r *Regexp) ReplaceAllLiteral(src, repl []byte) []byte {
|
||||
matches, err := r.match(src, 0, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if len(matches) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
out := make([]byte, len(src))
|
||||
copy(out, src)
|
||||
|
||||
var diff int64
|
||||
for _, match := range matches {
|
||||
diff, out = replaceBytes(out, repl, match[0], match[1], diff)
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// ReplaceAllString is the String version of ReplaceAll
|
||||
func (r *Regexp) ReplaceAllString(src, repl string) string {
|
||||
return string(r.ReplaceAll([]byte(src), []byte(repl)))
|
||||
}
|
||||
|
||||
// ReplaceAllStringFunc is the String version of ReplaceAllFunc
|
||||
func (r *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string {
|
||||
return string(r.ReplaceAllFunc([]byte(src), func(b []byte) []byte {
|
||||
return []byte(repl(string(b)))
|
||||
}))
|
||||
}
|
||||
|
||||
// ReplaceAllLiteralString is the String version of ReplaceAllLiteral
|
||||
func (r *Regexp) ReplaceAllLiteralString(src, repl string) string {
|
||||
return string(r.ReplaceAllLiteral([]byte(src), []byte(repl)))
|
||||
}
|
||||
|
||||
// Split slices s into substrings separated by the
|
||||
// expression and returns a slice of the substrings
|
||||
// between those expression matches.
|
||||
//
|
||||
// Example:
|
||||
// s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5)
|
||||
// // s: ["", "b", "b", "c", "cadaaae"]
|
||||
// The count determines the number of substrings to return:
|
||||
// n > 0: at most n substrings; the last substring will be the unsplit remainder.
|
||||
// n == 0: the result is nil (zero substrings)
|
||||
// n < 0: all substrings
|
||||
func (r *Regexp) Split(s string, n int) []string {
|
||||
if n == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(r.expr) > 0 && len(s) == 0 {
|
||||
return []string{""}
|
||||
}
|
||||
|
||||
matches := r.FindAllStringIndex(s, n)
|
||||
strings := make([]string, 0, len(matches))
|
||||
|
||||
beg := 0
|
||||
end := 0
|
||||
for _, match := range matches {
|
||||
if n > 0 && len(strings) >= n-1 {
|
||||
break
|
||||
}
|
||||
|
||||
end = match[0]
|
||||
if match[1] != 0 {
|
||||
strings = append(strings, s[beg:end])
|
||||
}
|
||||
beg = match[1]
|
||||
}
|
||||
|
||||
if end != len(s) {
|
||||
strings = append(strings, s[beg:])
|
||||
}
|
||||
|
||||
return strings
|
||||
}
|
||||
|
||||
// String returns the text of the regular expression
|
||||
// used for compilation.
|
||||
func (r *Regexp) String() string {
|
||||
return r.expr
|
||||
}
|
||||
|
||||
// SubexpIndex returns the index of the subexpression
|
||||
// with the given name, or -1 if there is no subexpression
|
||||
// with that name.
|
||||
func (r *Regexp) SubexpIndex(name string) int {
|
||||
r.mtx.Lock()
|
||||
defer r.mtx.Unlock()
|
||||
|
||||
// Get C string of name
|
||||
cName, err := libc.CString(name)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Get substring index from name
|
||||
ret := lib.Xpcre2_substring_number_from_name_8(r.tls, r.re, cName)
|
||||
|
||||
// If no substring error returned, return -1.
|
||||
// If a different error is returned, panic.
|
||||
if ret == lib.DPCRE2_ERROR_NOSUBSTRING {
|
||||
return -1
|
||||
} else if ret < 0 {
|
||||
panic(codeToError(r.tls, ret))
|
||||
}
|
||||
|
||||
// Return the index of the subexpression
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
// replaceBytes replaces the bytes at a given location, and returns a new
|
||||
// offset, based on how much bigger or smaller the slice got after replacement
|
||||
func replaceBytes(src, repl []byte, sOff, eOff lib.Tsize_t, diff int64) (int64, []byte) {
|
||||
var out []byte
|
||||
out = append(
|
||||
src[:int64(sOff)+diff],
|
||||
append(
|
||||
repl,
|
||||
src[int64(eOff)+diff:]...,
|
||||
)...,
|
||||
)
|
||||
|
||||
return diff + int64(len(out)-len(src)), out
|
||||
}
|
||||
|
||||
// match calls the underlying pcre match functions. It re-runs the functions
|
||||
// until no matches are found if multi is set to true.
|
||||
func (r *Regexp) match(b []byte, options uint32, multi bool) ([][]lib.Tsize_t, error) {
|
||||
r.mtx.Lock()
|
||||
defer r.mtx.Unlock()
|
||||
|
||||
// Create a C pointer to the subject
|
||||
sp := unsafe.Pointer(&b[0])
|
||||
cSubject := uintptr(sp)
|
||||
// Convert the size of the subject to a C size_t type
|
||||
cSubjectLen := lib.Tsize_t(len(b))
|
||||
|
||||
// Create match data using the pattern to figure out the buffer size
|
||||
md := lib.Xpcre2_match_data_create_from_pattern_8(r.tls, r.re, 0)
|
||||
if md == 0 {
|
||||
panic("error creating match data")
|
||||
}
|
||||
// Free the match data at the end of the function
|
||||
defer lib.Xpcre2_match_data_free_8(r.tls, md)
|
||||
|
||||
var offset lib.Tsize_t
|
||||
var out [][]lib.Tsize_t
|
||||
// While the offset is less than the length of the subject
|
||||
for offset < cSubjectLen {
|
||||
// Execute expression on subject
|
||||
ret := lib.Xpcre2_match_8(r.tls, r.re, cSubject, cSubjectLen, offset, options, md, 0)
|
||||
if ret < 0 {
|
||||
// If no match found, break
|
||||
if ret == lib.DPCRE2_ERROR_NOMATCH {
|
||||
break
|
||||
}
|
||||
|
||||
return nil, codeToError(r.tls, ret)
|
||||
} else {
|
||||
// Get amount of pairs in output vector
|
||||
pairAmt := lib.Xpcre2_get_ovector_count_8(r.tls, md)
|
||||
// Get pointer to output vector
|
||||
ovec := lib.Xpcre2_get_ovector_pointer_8(r.tls, md)
|
||||
// Create a Go slice using the output vector as the underlying array
|
||||
slice := unsafe.Slice((*lib.Tsize_t)(unsafe.Pointer(ovec)), pairAmt*2)
|
||||
|
||||
// Create a new slice and copy the elements from the slice
|
||||
// This is required because the match data will be freed in
|
||||
// a defer, and that would cause a panic every time the slice
|
||||
// is used later.
|
||||
matches := make([]lib.Tsize_t, len(slice))
|
||||
copy(matches, slice)
|
||||
|
||||
// If the two indices are the same (empty string), and the match is not
|
||||
// immediately after another match, add it to the output and increment the
|
||||
// offset. Otherwise, increment the offset and ignore the match.
|
||||
if slice[0] == slice[1] && len(out) > 0 && slice[0] != out[len(out)-1][1] {
|
||||
out = append(out, matches)
|
||||
offset = slice[1] + 1
|
||||
continue
|
||||
} else if slice[0] == slice[1] {
|
||||
offset = slice[1] + 1
|
||||
continue
|
||||
}
|
||||
|
||||
// Add the match to the output
|
||||
out = append(out, matches)
|
||||
// Set the next offset to the end index of the match
|
||||
offset = matches[1]
|
||||
}
|
||||
|
||||
// If multiple matches disabled, break
|
||||
if !multi {
|
||||
break
|
||||
}
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// patternInfo calls the underlying pcre pattern info function
|
||||
// and returns information about the compiled regular expression
|
||||
func (r *Regexp) patternInfo(what uint32) (out uint32) {
|
||||
// Create a C pointer to the output integer
|
||||
cOut := uintptr(unsafe.Pointer(&out))
|
||||
// Get information about the compiled pattern
|
||||
lib.Xpcre2_pattern_info_8(r.tls, r.re, what, cOut)
|
||||
return
|
||||
}
|
||||
|
||||
// Close frees resources used by the regular expression.
|
||||
func (r *Regexp) Close() error {
|
||||
if r == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Close thread-local storage
|
||||
defer r.tls.Close()
|
||||
|
||||
// Free the compiled code
|
||||
lib.Xpcre2_code_free_8(r.tls, r.re)
|
||||
// Set regular expression to null
|
||||
r.re = 0
|
||||
|
||||
return nil
|
||||
}
|
236
pcre_test.go
Normal file
236
pcre_test.go
Normal file
@ -0,0 +1,236 @@
|
||||
package pcre_test
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"go.arsenm.dev/pcre"
|
||||
)
|
||||
|
||||
func TestCompileError(t *testing.T) {
|
||||
r, err := pcre.Compile("(")
|
||||
if err == nil {
|
||||
t.Error("expected error, got nil")
|
||||
}
|
||||
defer r.Close()
|
||||
}
|
||||
|
||||
func TestMatch(t *testing.T) {
|
||||
r := pcre.MustCompile(`\d+ (?=USD)`)
|
||||
defer r.Close()
|
||||
|
||||
matches := r.MatchString("9000 USD")
|
||||
if !matches {
|
||||
t.Error("expected 9000 USD to match")
|
||||
}
|
||||
|
||||
matches = r.MatchString("9000 RUB")
|
||||
if matches {
|
||||
t.Error("expected 9000 RUB not to match")
|
||||
}
|
||||
|
||||
matches = r.MatchString("800 USD")
|
||||
if !matches {
|
||||
t.Error("expected 800 USD to match")
|
||||
}
|
||||
|
||||
matches = r.MatchString("700 CAD")
|
||||
if matches {
|
||||
t.Error("expected 700 CAD not to match")
|
||||
}
|
||||
|
||||
matches = r.Match([]byte("8 USD"))
|
||||
if !matches {
|
||||
t.Error("expected 8 USD to match")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMatchUngreedy(t *testing.T) {
|
||||
r := pcre.MustCompileOpts(`Hello, (.+)\.`, pcre.Ungreedy)
|
||||
defer r.Close()
|
||||
|
||||
submatches := r.FindAllStringSubmatch("Hello, World. Hello, pcre2.", 1)
|
||||
if submatches[0][1] != "World" {
|
||||
t.Errorf("expected World, got %s", submatches[0][1])
|
||||
}
|
||||
|
||||
matches := r.MatchString("hello, world.")
|
||||
if matches {
|
||||
t.Error("expected lowercase 'hello, world' not to match")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReplace(t *testing.T) {
|
||||
r := pcre.MustCompile(`(\d+)\.\d+`)
|
||||
defer r.Close()
|
||||
|
||||
testStr := "123.54321 Test"
|
||||
|
||||
newStr := r.ReplaceAllString(testStr, "${1}.12345")
|
||||
if newStr != "123.12345 Test" {
|
||||
t.Errorf(`expected "123.12345 Test", got "%s"`, newStr)
|
||||
}
|
||||
|
||||
newStr = r.ReplaceAllString(testStr, "${9}.12345")
|
||||
if newStr != ".12345 Test" {
|
||||
t.Errorf(`expected ".12345 Test", got "%s"`, newStr)
|
||||
}
|
||||
|
||||
newStr = r.ReplaceAllString(testStr, "${hi}.12345")
|
||||
if newStr != ".12345 Test" {
|
||||
t.Errorf(`expected ".12345 Test", got "%s"`, newStr)
|
||||
}
|
||||
|
||||
newStr = r.ReplaceAllLiteralString(testStr, "${1}.12345")
|
||||
if newStr != "${1}.12345 Test" {
|
||||
t.Errorf(`expected "${1}.12345 Test", got "%s"`, newStr)
|
||||
}
|
||||
|
||||
newStr = r.ReplaceAllStringFunc(testStr, func(s string) string {
|
||||
return strings.Replace(s, ".", ",", -1)
|
||||
})
|
||||
if newStr != "123,54321 Test" {
|
||||
t.Errorf(`expected "123,54321 Test", got "%s"`, newStr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplit(t *testing.T) {
|
||||
r := pcre.MustCompile("a*")
|
||||
defer r.Close()
|
||||
|
||||
split := r.Split("abaabaccadaaae", 5)
|
||||
expected := [5]string{"", "b", "b", "c", "cadaaae"}
|
||||
|
||||
if *(*[5]string)(split) != expected {
|
||||
t.Errorf("expected %v, got %v", expected, split)
|
||||
}
|
||||
|
||||
split = r.Split("", 0)
|
||||
if split != nil {
|
||||
t.Errorf("expected nil, got %v", split)
|
||||
}
|
||||
|
||||
split = r.Split("", 5)
|
||||
if split[0] != "" {
|
||||
t.Errorf(`expected []string{""}, got %v`, split)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFind(t *testing.T) {
|
||||
r := pcre.MustCompile(`(\d+)`)
|
||||
defer r.Close()
|
||||
|
||||
testStr := "3 times 4 is 12"
|
||||
|
||||
matches := r.FindAllString(testStr, -1)
|
||||
if len(matches) != 3 {
|
||||
t.Errorf("expected length 3, got %d", len(matches))
|
||||
}
|
||||
|
||||
matches = r.FindAllString(testStr, 2)
|
||||
if len(matches) != 2 {
|
||||
t.Errorf("expected length 2, got %d", len(matches))
|
||||
}
|
||||
if matches[0] != "3" || matches[1] != "4" {
|
||||
t.Errorf("expected [3 4], got %v", matches)
|
||||
}
|
||||
|
||||
index := r.FindStringIndex(testStr)
|
||||
if index[0] != 0 || index[1] != 1 {
|
||||
t.Errorf("expected [0 1], got %v", index)
|
||||
}
|
||||
|
||||
submatch := r.FindStringSubmatch(testStr)
|
||||
if submatch[0] != "3" {
|
||||
t.Errorf("expected 3, got %s", submatch[0])
|
||||
}
|
||||
|
||||
index = r.FindStringSubmatchIndex(testStr)
|
||||
if *(*[4]int)(index) != [4]int{0, 1, 0, 1} {
|
||||
t.Errorf("expected [0 1 0 1], got %v", index)
|
||||
}
|
||||
|
||||
submatches := r.FindAllStringSubmatchIndex(testStr, 2)
|
||||
if len(submatches) != 2 {
|
||||
t.Errorf("expected length 2, got %d", len(submatches))
|
||||
}
|
||||
|
||||
expected := [2][4]int{{0, 1, 0, 1}, {8, 9, 8, 9}}
|
||||
if *(*[4]int)(submatches[0]) != expected[0] {
|
||||
t.Errorf("expected %v, got %v", expected[0], submatches[0])
|
||||
}
|
||||
if *(*[4]int)(submatches[1]) != expected[1] {
|
||||
t.Errorf("expected %v, got %v", expected[0], submatches[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestSubexpIndex(t *testing.T) {
|
||||
r := pcre.MustCompile(`(?P<number>\d)`)
|
||||
defer r.Close()
|
||||
|
||||
index := r.SubexpIndex("number")
|
||||
if index != 1 {
|
||||
t.Errorf("expected 1, got %d", index)
|
||||
}
|
||||
|
||||
index = r.SubexpIndex("string")
|
||||
if index != -1 {
|
||||
t.Errorf("expected -1, got %d", index)
|
||||
}
|
||||
|
||||
num := r.NumSubexp()
|
||||
if num != 1 {
|
||||
t.Errorf("expected 1, got %d", num)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConcurrency(t *testing.T) {
|
||||
r := pcre.MustCompile(`\d*`)
|
||||
defer r.Close()
|
||||
|
||||
wg := &sync.WaitGroup{}
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
||||
found := r.FindString("Test string 12345")
|
||||
if found != "12345" {
|
||||
t.Errorf("expected 12345, got %s", found)
|
||||
}
|
||||
}()
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
||||
matched := r.MatchString("Hello")
|
||||
if matched {
|
||||
t.Errorf("Expected Hello not to match")
|
||||
}
|
||||
}()
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
||||
matched := r.MatchString("54321")
|
||||
if !matched {
|
||||
t.Errorf("expected 54321 to match")
|
||||
}
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func TestString(t *testing.T) {
|
||||
const expr = `()`
|
||||
|
||||
r := pcre.MustCompile(expr)
|
||||
defer r.Close()
|
||||
|
||||
if r.String() != expr {
|
||||
t.Errorf("expected %s, got %s", expr, r.String())
|
||||
}
|
||||
}
|
38
types.go
Normal file
38
types.go
Normal file
@ -0,0 +1,38 @@
|
||||
package pcre
|
||||
|
||||
import "go.arsenm.dev/pcre/lib"
|
||||
|
||||
type CompileOption uint32
|
||||
|
||||
// Compile option bits
|
||||
const (
|
||||
Anchored = CompileOption(lib.DPCRE2_ANCHORED)
|
||||
AllowEmptyClass = CompileOption(lib.DPCRE2_ALLOW_EMPTY_CLASS)
|
||||
AltBsux = CompileOption(lib.DPCRE2_ALT_BSUX)
|
||||
AltCircumflex = CompileOption(lib.DPCRE2_ALT_CIRCUMFLEX)
|
||||
AltVerbnames = CompileOption(lib.DPCRE2_ALT_VERBNAMES)
|
||||
AutoCallout = CompileOption(lib.DPCRE2_AUTO_CALLOUT)
|
||||
Caseless = CompileOption(lib.DPCRE2_CASELESS)
|
||||
DollarEndOnly = CompileOption(lib.DPCRE2_DOLLAR_ENDONLY)
|
||||
DotAll = CompileOption(lib.DPCRE2_DOTALL)
|
||||
DupNames = CompileOption(lib.DPCRE2_DUPNAMES)
|
||||
EndAnchored = CompileOption(lib.DPCRE2_ENDANCHORED)
|
||||
Extended = CompileOption(lib.DPCRE2_EXTENDED)
|
||||
FirstLine = CompileOption(lib.DPCRE2_FIRSTLINE)
|
||||
Literal = CompileOption(lib.DPCRE2_LITERAL)
|
||||
MatchInvalidUTF = CompileOption(lib.DPCRE2_MATCH_INVALID_UTF)
|
||||
MactchUnsetBackref = CompileOption(lib.DPCRE2_MATCH_UNSET_BACKREF)
|
||||
Multiline = CompileOption(lib.DPCRE2_MULTILINE)
|
||||
NeverBackslashC = CompileOption(lib.DPCRE2_NEVER_BACKSLASH_C)
|
||||
NeverUCP = CompileOption(lib.DPCRE2_NEVER_UCP)
|
||||
NeverUTF = CompileOption(lib.DPCRE2_NEVER_UTF)
|
||||
NoAutoCapture = CompileOption(lib.DPCRE2_NO_AUTO_CAPTURE)
|
||||
NoAutoPossess = CompileOption(lib.DPCRE2_NO_AUTO_POSSESS)
|
||||
NoDotStarAnchor = CompileOption(lib.DPCRE2_NO_DOTSTAR_ANCHOR)
|
||||
NoStartOptimize = CompileOption(lib.DPCRE2_NO_START_OPTIMIZE)
|
||||
NoUTFCheck = CompileOption(lib.DPCRE2_NO_UTF_CHECK)
|
||||
UCP = CompileOption(lib.DPCRE2_UCP)
|
||||
Ungreedy = CompileOption(lib.DPCRE2_UNGREEDY)
|
||||
UseOffsetLimit = CompileOption(lib.DPCRE2_USE_OFFSET_LIMIT)
|
||||
UTF = CompileOption(lib.DPCRE2_UTF)
|
||||
)
|
Loading…
Reference in New Issue
Block a user