Example #1
0
 /// <summary>
 /// </summary>
 /// <param name="src"></param>
 /// <param name="dest"></param>
 /// <param name="index"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 private static int CompareString(Span <byte> src, Span <byte> dest, StringCompareMode mode = StringCompareMode.None)
 {
     fixed(byte *p1 = src, p2 = dest)
     {
         return(Compare(p1, p2, src.Length, dest.Length, mode));
     }
 }
Example #2
0
        public static int Compare(byte *p1, byte *p2, int len1, int len2, StringCompareMode mode = StringCompareMode.None)
        {
            var lp1 = p1;
            var lp2 = p2;
            var len = Math.Min(len1, len2);

            for (var i = 0; i < len / 8; i++)
            {
                if (*(long *)lp1 != *(long *)lp2)
                {
                    if (*(int *)lp1 == *(int *)lp2)
                    {
                        lp1 += 4;
                        lp2 += 4;
                    }

                    return(Compare(lp1, lp2, sizeof(int), mode));
                }

                lp1 += 8;
                lp2 += 8;
            }

            if ((len & 0x04) != 0)
            {
                if (*(int *)lp1 != *(int *)lp2)
                {
                    return(Compare(lp1, lp2, sizeof(int), mode));
                }

                lp1 += 4;
                lp2 += 4;
            }

            if ((len & 0x02) != 0)
            {
                if (*(short *)lp1 != *(short *)lp2)
                {
                    return(Compare(lp1, lp2, sizeof(short), mode));
                }

                lp1 += 2;
                lp2 += 2;
            }

            if ((len & 0x01) != 0)
            {
                var flag = *lp1 - *lp2;
                if (flag != 0)
                {
                    return(flag);
                }
            }

            return(len1 - len2);
        }
		/// <summary>
		/// 创建一个判断页面是否载入的地址条件.
		/// </summary>
		/// <param name="name">条件的名称.</param>
		/// <param name="url">用于判断的地址.</param>
		/// <param name="compareMode">地址的判断模式.</param>
		public UrlCondition ( string name, string url, StringCompareMode compareMode )
			: base ( WebPageConditionType.Url, name )
		{

			if ( null == url )
				url = string.Empty;

			this.Url = url.ToLower ( );
			this.CompareMode = compareMode;
		}
Example #4
0
        /// <summary>
        /// 创建一个判断页面是否载入的地址条件.
        /// </summary>
        /// <param name="name">条件的名称.</param>
        /// <param name="url">用于判断的地址.</param>
        /// <param name="compareMode">地址的判断模式.</param>
        public UrlCondition(string name, string url, StringCompareMode compareMode)
            : base(WebPageConditionType.Url, name)
        {
            if (null == url)
            {
                url = string.Empty;
            }

            this.Url         = url.ToLower( );
            this.CompareMode = compareMode;
        }
Example #5
0
        public static int Compare(byte *p1, byte *p2, int len, StringCompareMode mode = StringCompareMode.None)
        {
            for (var n = 0; n < len; n++)
            {
                var v1 = mode == StringCompareMode.IgnoreCase ? GetASCIILowercaseChar(p1[n]) : p1[n];
                var v2 = mode == StringCompareMode.IgnoreCase ? GetASCIILowercaseChar(p2[n]) : p2[n];
                var v  = v1 - v2;
                if (v == 0)
                {
                    continue;
                }

                return(v);
            }

            return(0);
        }
Example #6
0
        public static int Compare(Span <byte> s1, Span <byte> s2, StringCompareMode mode = StringCompareMode.None)
        {
            var i = 0;
            var n = 0;

            for (; i < s1.Length && n < s2.Length;)
            {
                var v  = 0;
                var t1 = (DataType)(s1[i++] & DataTypeConstants.DataTypeMask);
                var t2 = (DataType)(s2[n++] & DataTypeConstants.DataTypeMask);
                if (t1 != t2 && (!t1.IsNumeric() || !t2.IsNumeric()))
                {
                    return(t1 - t2);
                }

                switch (t1)
                {
                case DataType.Null:
                    v = 0;
                    break;

                case DataType.Char:
                    v  = CompareNumeric(s1.ToChar(i), s2, ref n, t2);
                    i += sizeof(char);
                    break;

                case DataType.Byte:
                    v  = CompareNumeric(s1[i], s2, ref n, t2);
                    i += sizeof(byte);
                    break;

                case DataType.Int16:
                    v  = CompareNumeric(s1.ToInt16(i), s2, ref n, t2);
                    i += sizeof(short);
                    break;

                case DataType.Int32:
                    v  = CompareNumeric(s1.ToInt32(i), s2, ref n, t2);
                    i += sizeof(int);
                    break;

                case DataType.Int64:
                    v  = CompareNumeric(s1.ToInt64(i), s2, ref n, t2);
                    i += sizeof(long);
                    break;

                case DataType.UInt16:
                    v  = CompareNumeric(s1.ToUInt16(i), s2, ref n, t2);
                    i += sizeof(ushort);
                    break;

                case DataType.UInt32:
                    v  = CompareNumeric(s1.ToUInt32(i), s2, ref n, t2);
                    i += sizeof(uint);
                    break;

                case DataType.UInt64:
                    v  = CompareNumeric(s1.ToUInt64(i), s2, ref n, t2);
                    i += sizeof(ulong);
                    break;

                case DataType.Single:
                    v  = CompareNumeric(s1.ToSingle(i), s2, ref n, t2);
                    i += sizeof(float);
                    break;

                case DataType.Double:
                    v  = CompareNumeric(s1.ToDouble(i), s2, ref n, t2);
                    i += sizeof(double);
                    break;

                case DataType.Boolean:
                    v  = CompareNumeric(s1.ToBoolean(i) ? 1 : 0, s2, ref n, t2);
                    i += sizeof(bool);
                    break;

                case DataType.DateTime:
                    v  = s1.ToInt64(i).CompareTo(s2.ToInt64(n));
                    i += sizeof(long);
                    n += sizeof(long);
                    break;

                case DataType.String:
                    var str1 = s1.GetString(i - 1, out var size1);
                    var str2 = s2.GetString(n - 1, out var size2);

                    v = CompareString(s1, s2, mode);

                    i += size1 + str1.Length;
                    n += size2 + str2.Length;
                    break;
                }

                if (v != 0)
                {
                    return(v);
                }
            }

            return(s1.Length - s2.Length);
        }