Example #1
0
 public static int GetOmitLast(WordTransformType type)
 {
     if (type >= WordTransformType.OMIT_LAST_1 && type <= WordTransformType.OMIT_LAST_9)
     {
         return((type - WordTransformType.OMIT_LAST_1) + 1);
     }
     return(0);
 }
Example #2
0
        public static int TransformDictionaryWord(byte[] dest, int dstOffset, byte[] word, int wordOffset,
                                                  int len, Transform transform)
        {
            int offset = dstOffset;

            // Copy prefix.
            byte[] str = transform.prefix;
            int    tmp = str.Length;
            int    i   = 0;

            // In most cases tmp < 10 -> no benefits from System.arrayCopy
            while (i < tmp)
            {
                dest[offset++] = str[i++];
            }

            // Copy trimmed word.
            WordTransformType op = transform.type;

            tmp = TransformType.GetOmitFirst(op);// op.omitFirst;
            if (tmp > len)
            {
                tmp = len;
            }
            wordOffset += tmp;
            len        -= tmp;
            len        -= TransformType.GetOmitLast(op);//op.omitLast;
            i           = len;
            while (i > 0)
            {
                dest[offset++] = word[wordOffset++];
                i--;
            }

            if (op == UPPERCASE_ALL || op == UPPERCASE_FIRST)
            {
                int uppercaseOffset = offset - len;
                if (op == UPPERCASE_FIRST)
                {
                    len = 1;
                }
                while (len > 0)
                {
                    tmp = dest[uppercaseOffset] & 0xFF;
                    if (tmp < 0xc0)
                    {
                        if (tmp >= 'a' && tmp <= 'z')
                        {
                            dest[uppercaseOffset] ^= (byte)32;
                        }
                        uppercaseOffset += 1;
                        len             -= 1;
                    }
                    else if (tmp < 0xe0)
                    {
                        dest[uppercaseOffset + 1] ^= (byte)32;
                        uppercaseOffset           += 2;
                        len -= 2;
                    }
                    else
                    {
                        dest[uppercaseOffset + 2] ^= (byte)5;
                        uppercaseOffset           += 3;
                        len -= 3;
                    }
                }
            }

            // Copy suffix.
            str = transform.suffix;
            tmp = str.Length;
            i   = 0;
            while (i < tmp)
            {
                dest[offset++] = str[i++];
            }

            return(offset - dstOffset);
        }
Example #3
0
 public Transform(string prefix, WordTransformType type, string suffix)
 {
     this.prefix = ReadUniBytes(prefix);
     this.type   = type;
     this.suffix = ReadUniBytes(suffix);
 }
Example #4
0
        internal static int TransformDictionaryWord(byte[] dst, int dstOffset, byte[] word,
                                                    int wordOffset, int len, BrotliTransform transform)
        {
            int offset = dstOffset;

            // Copy prefix.
            byte[] prefixBuffer = transform._prefix;
            int    tmp          = prefixBuffer.Length;
            int    i            = 0;

            // In most cases tmp < 10 -> no benefits from System.arrayCopy
            while (i < tmp)
            {
                dst[offset++] = prefixBuffer[i++];
            }
            // Copy trimmed word.
            int op = transform._type;

            tmp = WordTransformType.GetOmitFirst(op);
            if (tmp > len)
            {
                tmp = len;
            }
            wordOffset += tmp;
            len        -= tmp;
            len        -= WordTransformType.GetOmitLast(op);
            i           = len;
            while (i > 0)
            {
                dst[offset++] = word[wordOffset++];
                i--;
            }
            if (op == WordTransformType.UppercaseAll || op == WordTransformType.UppercaseFirst)
            {
                int uppercaseOffset = offset - len;
                if (op == WordTransformType.UppercaseFirst)
                {
                    len = 1;
                }
                while (len > 0)
                {
                    tmp = dst[uppercaseOffset] & unchecked ((int)(0xFF));
                    if (tmp < unchecked ((int)(0xc0)))
                    {
                        if (tmp >= 'a' && tmp <= 'z')
                        {
                            dst[uppercaseOffset] ^= unchecked ((byte)32);
                        }
                        uppercaseOffset += 1;
                        len             -= 1;
                    }
                    else if (tmp < unchecked ((int)(0xe0)))
                    {
                        dst[uppercaseOffset + 1] ^= unchecked ((byte)32);
                        uppercaseOffset          += 2;
                        len -= 2;
                    }
                    else
                    {
                        dst[uppercaseOffset + 2] ^= unchecked ((byte)5);
                        uppercaseOffset          += 3;
                        len -= 3;
                    }
                }
            }

            // Copy suffix.
            prefixBuffer = transform._suffix;
            tmp          = prefixBuffer.Length;
            i            = 0;
            while (i < tmp)
            {
                dst[offset++] = prefixBuffer[i++];
            }
            return(offset - dstOffset);
        }