Beispiel #1
0
        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);
            }
        }