private static IntPtr CompileSet(string[] patterns, RureFlags flags, IntPtr options) { var patBytes = patterns.Select(Encoding.UTF8.GetBytes).ToArray(); var patLengths = patBytes .Select(byts => new UIntPtr((uint)byts.Length)).ToArray(); var patByteHandles = patBytes .Select(a => GCHandle.Alloc(a, GCHandleType.Pinned)).ToArray(); var patBytePinnedPointers = patByteHandles .Select(h => h.AddrOfPinnedObject()).ToArray(); using (var err = new Error()) { var compiled = RureFfi.rure_compile_set(patBytePinnedPointers, patLengths, new UIntPtr((uint)patLengths.Length), (uint)flags, options, err.Raw); foreach (var handle in patByteHandles) { handle.Free(); } if (compiled != IntPtr.Zero) { return(compiled); } throw new RegexCompilationException(err.Message); } }
/// <summary> /// Create a new regex instance from the given pattern, with the given /// options applied and with the given flags enabled. /// </summary> public Regex(string pattern, Options opts, RureFlags flags) : this(pattern, opts.Raw, (uint)flags) { }
/// <summary> /// Create a new regex instance from the given pattern and flags. /// </summary> public Regex(string pattern, RureFlags flags) : this(pattern, IntPtr.Zero, (uint)flags) { }
public RegexSet(RureFlags flags, Options options, params string[] patterns) : base(CompileSet(patterns, flags, options.Raw)) { _arity = patterns.Length; }
public RegexSet(RureFlags flags, params string[] patterns) : base(CompileSet(patterns, flags, IntPtr.Zero)) { _arity = patterns.Length; }