コード例 #1
0
ファイル: UTF8Encoding.cs プロジェクト: michkot/Automata
        public static Tuple <BDD, Tuple <BDD, BDD>[]>[] Extract3ByteUTF8Encodings(BDD set)
        {
            var           alg = set.algebra;
            CharSetSolver css = alg as CharSetSolver;

            if (css == null)
            {
                throw new AutomataException(AutomataExceptionKind.NotSupported);
            }

            var surrogates     = css.MkCharSetFromRange('\uD800', '\uDFFF');
            var threebyterange = css.MkCharSetFromRange('\u0800', '\uFFFF').Diff(surrogates);
            var uptoFF         = css.MkCharSetFromRange('\0', '\xFF');

            var set3 = set & threebyterange;

            var lowerpartition = set3.Partition(11);

            var b5       = alg.MkBitTrue(5);
            var b6       = alg.MkBitTrue(6);
            var b7       = alg.MkBitTrue(7);
            var b4_false = alg.MkBitFalse(4);
            var b6_false = alg.MkBitFalse(6);

            var start_mask = b7 & b6 & b5 & b4_false & uptoFF;
            var val_mask   = b7 & b6_false & uptoFF;

            var partition = Array.ConvertAll(lowerpartition, x => new Tuple <BDD, Tuple <BDD, BDD>[]>(
                                                 css.OmitBitsAbove(x.Item2 >> 12, 4) & start_mask,
                                                 Array.ConvertAll <Tuple <BDD, BDD>, Tuple <BDD, BDD> >(x.Item1.Partition(5),
                                                                                                        y => new Tuple <BDD, BDD>(css.OmitBitsAbove(y.Item2 >> 6, 6) & val_mask, y.Item1 & val_mask))
                                                 ));

            return(partition);
        }
コード例 #2
0
ファイル: UTF8Encoding.cs プロジェクト: michkot/Automata
        public static Tuple <BDD, BDD>[] Extract2ByteUTF8Encodings(BDD set)
        {
            CharSetSolver css = set.algebra as CharSetSolver;

            if (css == null)
            {
                throw new AutomataException(AutomataExceptionKind.NotSupported);
            }

            var twobyterange = css.MkCharSetFromRange('\x80', '\u07FF');
            var uptoFF       = css.MkCharSetFromRange('\0', '\xFF');

            var b6       = set.algebra.MkBitTrue(6);
            var b7       = set.algebra.MkBitTrue(7);
            var b5_false = set.algebra.MkBitFalse(5);
            var b6_false = set.algebra.MkBitFalse(6);

            var byte1_mask = b7 & b6 & b5_false & uptoFF;
            var byte2_mask = b7 & b6_false & uptoFF;

            var d2        = set & twobyterange;
            var partition = d2.Partition(5);
            var res       = Array.ConvertAll(partition, x => new Tuple <BDD, BDD>(css.OmitBitsAbove(x.Item2 >> 6, 5) & byte1_mask, x.Item1 & byte2_mask));

            return(res);
        }