Add glob conversion
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package pcre
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"go.arsenm.dev/pcre/lib"
|
||||
"modernc.org/libc"
|
||||
)
|
||||
|
||||
// CompileGlob converts the given glob into a
|
||||
// pcre regular expression, and then compiles it,
|
||||
// returning the result.
|
||||
func CompileGlob(glob string) (*Regexp, error) {
|
||||
tls := libc.NewTLS()
|
||||
defer tls.Close()
|
||||
|
||||
// Get C string from given glob
|
||||
cGlob, err := libc.CString(glob)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer libc.Xfree(tls, cGlob)
|
||||
// Convert length to size_t
|
||||
cGlobLen := lib.Tsize_t(len(glob))
|
||||
|
||||
// Create null pointer
|
||||
outPtr := uintptr(0)
|
||||
// Get pointer to pointer
|
||||
cOutPtr := uintptr(unsafe.Pointer(&outPtr))
|
||||
|
||||
// Create 0 size_t
|
||||
outLen := lib.Tsize_t(0)
|
||||
// Get pointer to size_t
|
||||
cOutLen := uintptr(unsafe.Pointer(&outLen))
|
||||
|
||||
// Convert glob to regular expression
|
||||
ret := lib.Xpcre2_pattern_convert_8(
|
||||
tls,
|
||||
cGlob,
|
||||
cGlobLen,
|
||||
lib.DPCRE2_CONVERT_GLOB,
|
||||
cOutPtr,
|
||||
cOutLen,
|
||||
0,
|
||||
)
|
||||
if ret != 0 {
|
||||
return nil, codeToError(tls, ret)
|
||||
}
|
||||
|
||||
// Get output as byte slice
|
||||
out := unsafe.Slice((*byte)(unsafe.Pointer(outPtr)), outLen)
|
||||
// Convert output to string
|
||||
// This copies the data, so it's safe for later use
|
||||
pattern := string(out)
|
||||
|
||||
// Compile converted glob and return results
|
||||
return Compile(pattern)
|
||||
}
|
||||
Reference in New Issue
Block a user