コード例 #1
0
        protected override DataObject EvaluateBinary(DataObject ob1, DataObject ob2, IEvaluateContext context)
        {
            if (ob1.IsNull)
            {
                return(ob1);
            }
            if (ob2.IsNull)
            {
                return(ob2);
            }

            char cEscape = '\\';

            if (Escape is ConstantExpression)
            {
                // TODO: some more checks...
                var escapeValue = ((ConstantExpression)Escape).Value;
                cEscape = escapeValue.ToString()[0];
            }

            string val     = ob1.CastTo(PrimitiveTypes.String()).ToStringValue();
            string pattern = ob2.CastTo(PrimitiveTypes.String()).ToStringValue();

            return(DataObject.Boolean(PatternSearch.FullPatternMatch(pattern, val, cEscape)));
        }
コード例 #2
0
        public bool Matches(ISqlString source, string pattern, char escapeChar)
        {
            if (!(source is SqlString))
            {
                throw new ArgumentException("This implementation of the string search does not support long strings");
            }

            var s = ((SqlString)source).Value;

            return(PatternSearch.PatternMatch(pattern, s, escapeChar));
        }
コード例 #3
0
        public IHttpActionResult Search([FromBody] PatternSearch search)
        {
            IHttpActionResult result;

            if (db.patterns.Count() > 0)
            {
                result = Ok(db.patterns.Where(x => x.free == true && x.name.Contains(search.PatternName)));
            }

            else
            {
                result = NotFound();
            }


            return(result);
        }
コード例 #4
0
    public long SearchForBytePattern(byte[] pattern, bool wildcard = false)
    {
        MEMORY_BASIC_INFORMATION mem_info = new MEMORY_BASIC_INFORMATION();

        long min_address = 0;
        long max_address = 0x7FFFFFFF;

        byte[]        buffer        = new byte[81920];
        PatternSearch patternSearch = new PatternSearch(buffer, pattern, wildcard);

        //scan process memory regions
        while (min_address < max_address &&
               VirtualQueryEx(processHandle, (IntPtr)min_address, out mem_info, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION))) > 0)
        {
            //check if memory region is accessible
            //skip regions smaller than 16M (default DOSBOX memory size)
            if (mem_info.Protect == PAGE_READWRITE && mem_info.State == MEM_COMMIT && (mem_info.Type & MEM_PRIVATE) == MEM_PRIVATE &&
                (int)mem_info.RegionSize >= 1024 * 1024 * 16)
            {
                long readPosition = (long)mem_info.BaseAddress;
                int  bytesToRead  = Math.Min((int)mem_info.RegionSize, 1024 * 640);               //scan first 640K only

                long bytesRead;
                while (bytesToRead > 0 && (bytesRead = Read(buffer, readPosition, Math.Min(buffer.Length, bytesToRead))) > 0)
                {
                    //search bytes pattern
                    int index = patternSearch.IndexOf((int)bytesRead);
                    if (index != -1)
                    {
                        return(readPosition + index);
                    }

                    readPosition += bytesRead;
                    bytesToRead  -= (int)bytesRead;
                }
            }

            // move to next memory region
            min_address = (long)mem_info.BaseAddress + (long)mem_info.RegionSize;
        }

        return(-1);
    }
コード例 #5
0
ファイル: StringType.cs プロジェクト: meikeric/deveeldb
        public SqlBoolean IsLike(ISqlString value, ISqlString pattern)
        {
            if (value == null && IsNull)
            {
                return(true);
            }
            if (!IsNull && value == null)
            {
                return(false);
            }
            if (value == null)
            {
                return(false);
            }

            var s1 = value.ToString();
            var s2 = pattern.ToString();

            return(PatternSearch.FullPatternMatch(s1, s2, '\\'));
        }
コード例 #6
0
        public static PatternSelect AddPattern(this PatternSelect subject, string name, string pattern, Func <PatternContext, PatternResult, PatternResult>?transform = null)
        {
            subject.VerifyNotNull(nameof(subject));
            name.VerifyNotEmpty(nameof(name));
            pattern.VerifyNotEmpty(nameof(pattern));

            subject.Add(name, context =>
            {
                var search = new PatternSearch
                {
                    Name    = name,
                    Pattern = pattern
                };

                if (new PatternTransform().TryMatch(search, context.Source, out PatternResult? pathPatternResult) == false)
                {
                    return(null);
                }

                return(transform?.Invoke(context, pathPatternResult) ?? pathPatternResult);
            });

            return(subject);
        }
コード例 #7
0
 public void SetUp()
 {
     patternProcessor = new PatternProcessor();
     queryValidator   = new InputValidator();
     patternSearch    = new PatternSearch(patternProcessor, queryValidator);
 }
コード例 #8
0
ファイル: PatternTransform.cs プロジェクト: khooversoft/Spin
        public bool TryMatch(PatternSearch pathPatternSearch, string source, [NotNullWhen(true)] out PatternResult?pathPatternResult)
        {
            pathPatternSearch
            .VerifyNotNull(nameof(pathPatternSearch))
            .Pattern.VerifyNotEmpty(nameof(pathPatternSearch.Pattern));

            pathPatternResult = null;
            if (source.IsEmpty())
            {
                return(false);
            }

            // Tokenized
            IReadOnlyList <IToken> patternTokens = new StringTokenizer()
                                                   .Add("{", "}")
                                                   .Parse(pathPatternSearch.Pattern);

            var matches    = new List <string>();
            var names      = new List <string>();
            var nameValues = new List <string>();

            var cursor = new Cursor <IToken>(patternTokens);

            while (cursor.TryNextValue(out IToken? item))
            {
                if (item.Value == "{")
                {
                    if (!cursor.TryNextValue(out IToken? propertyName))
                    {
                        return(false);
                    }
                    names.Add(propertyName.Value);

                    if (!cursor.TryNextValue(out propertyName))
                    {
                        return(false);
                    }
                    if (propertyName.Value != "}")
                    {
                        return(false);
                    }
                    continue;
                }

                matches.Add(item.Value);
            }

            int start       = 0;
            var matchCursor = new Cursor <string>(matches);

            while (matchCursor.TryNextValue(out string?matchItem))
            {
                int indexOf = source.IndexOf(matchItem, start);
                if (indexOf < 0)
                {
                    return(false);
                }

                if (indexOf > start)
                {
                    nameValues.Add(source.Substring(start, indexOf - start));
                }

                start = indexOf + matchItem.Length;
            }

            if (start < source.Length)
            {
                nameValues.Add(source.Substring(start));
            }

            if (names.Count != nameValues.Count)
            {
                return(false);
            }

            pathPatternResult = new PatternResult
            {
                Name    = pathPatternSearch.Name,
                Pattern = pathPatternSearch.Pattern,
                Source  = source,
                Values  = new ConcurrentDictionary <string, string>(names.Zip(nameValues, (o, i) => new KeyValuePair <string, string>(o, i)), StringComparer.OrdinalIgnoreCase),
            };

            return(true);
        }