示例#1
0
        public static Utf8Iterator GetFirst(this Utf8String src)
        {
            var it = src.GetIterator();

            it.MoveNext();
            return(it);
        }
示例#2
0
        static TomlValue ParseLHS(Utf8String segment, int parentIndex)
        {
            var it = segment.GetIterator();

            while (it.MoveNext())
            {
                if (it.Current == '"')
                {
                    throw new NotImplementedException();
                }
                else if (it.Current == '.')
                {
                    throw new NotImplementedException();
                }
                else if (it.Current == ' ' || it.Current == '\t' || it.Current == '=')
                {
                    return(new TomlValue(segment.Subbytes(0, it.BytePosition),
                                         TomlValueType.BareKey, parentIndex));
                }
            }

            throw new NotImplementedException();
        }
        public static void Escape(Utf8String s, IStore w)
        {
            if (s.IsEmpty)
            {
                return;
            }

            var it = s.GetIterator();

            while (it.MoveNext())
            {
                var l = it.CurrentByteLength;
                if (l == 1)
                {
                    var b = it.Current;
                    switch (b)
                    {
                    case (Byte)'"':
                    case (Byte)'\\':
                    case (Byte)'/':
                        // \\ prefix
                        w.Write((Byte)'\\');
                        w.Write(b);
                        break;

                    case (Byte)'\b':
                        w.Write((Byte)'\\');
                        w.Write((Byte)'b');
                        break;

                    case (Byte)'\f':
                        w.Write((Byte)'\\');
                        w.Write((Byte)'f');
                        break;

                    case (Byte)'\n':
                        w.Write((Byte)'\\');
                        w.Write((Byte)'n');
                        break;

                    case (Byte)'\r':
                        w.Write((Byte)'\\');
                        w.Write((Byte)'r');
                        break;

                    case (Byte)'\t':
                        w.Write((Byte)'\\');
                        w.Write((Byte)'t');
                        break;

                    default:
                        w.Write(b);
                        break;
                    }
                    // ascii
                }
                else if (l == 2)
                {
                    w.Write(it.Current);
                    w.Write(it.Second);
                }
                else if (l == 3)
                {
                    w.Write(it.Current);
                    w.Write(it.Second);
                    w.Write(it.Third);
                }
                else if (l == 4)
                {
                    w.Write(it.Current);
                    w.Write(it.Second);
                    w.Write(it.Third);
                    w.Write(it.Fourth);
                }
                else
                {
                    throw new ParserException("invalid utf8");
                }
            }
        }
        public static int Unescape(Utf8String s, IStore w)
        {
            int           writeCount = 0;
            Action <Byte> Write      = c =>
            {
                if (w != null)
                {
                    w.Write(c);
                }
                ++writeCount;
            };

            var it = s.GetIterator();

            while (it.MoveNext())
            {
                var l = it.CurrentByteLength;
                if (l == 1)
                {
                    if (it.Current == (Byte)'\\')
                    {
                        var c = it.Second;
                        switch (c)
                        {
                        case (Byte)'\\':
                        case (Byte)'/':
                        case (Byte)'"':
                            // remove prefix
                            Write(c);
                            it.MoveNext();
                            continue;

                        case (Byte)'b':
                            Write((Byte)'\b');
                            it.MoveNext();
                            continue;

                        case (Byte)'f':
                            Write((Byte)'\f');
                            it.MoveNext();
                            continue;

                        case (Byte)'n':
                            Write((Byte)'\n');
                            it.MoveNext();
                            continue;

                        case (Byte)'r':
                            Write((Byte)'\r');
                            it.MoveNext();
                            continue;

                        case (Byte)'t':
                            Write((Byte)'\t');
                            it.MoveNext();
                            continue;

                        case (Byte)'u':
                        {
                            // skip back slash
                            it.MoveNext();
                            // skip u
                            it.MoveNext();

                            var u0 = CheckHex((char)it.Current);
                            it.MoveNext();

                            var u1 = CheckHex((char)it.Current);
                            it.MoveNext();

                            var u2 = CheckHex((char)it.Current);
                            it.MoveNext();

                            var u3 = CheckHex((char)it.Current);

                            var u    = (u0 << 12) + (u1 << 8) + (u2 << 4) + u3;
                            var utf8 = Utf8String.From(new string(new char[] { (char)u }));
                            // var utf8 = Utf8String.From((int)u);
                            foreach (var x in utf8.Bytes)
                            {
                                Write(x);
                            }
                        }
                            continue;
                        }
                    }

                    Write(it.Current);
                }
                else if (l == 2)
                {
                    Write(it.Current);
                    Write(it.Second);
                }
                else if (l == 3)
                {
                    Write(it.Current);
                    Write(it.Second);
                    Write(it.Third);
                }
                else if (l == 4)
                {
                    Write(it.Current);
                    Write(it.Second);
                    Write(it.Third);
                    Write(it.Fourth);
                }
                else
                {
                    throw new ParserException("invalid utf8");
                }
            }

            return(writeCount);
        }
示例#5
0
        public static int Unescape(Utf8String s, IStore w)
        {
            int           writeCount = 0;
            Action <Byte> Write      = c =>
            {
                if (w != null)
                {
                    w.Write(c);
                }
                ++writeCount;
            };

            var it = s.GetIterator();

            while (it.MoveNext())
            {
                var l = it.CurrentByteLength;
                if (l == 1)
                {
                    if (it.Current == (Byte)'\\')
                    {
                        var c = it.Second;
                        switch (c)
                        {
                        case (Byte)'\\':
                        case (Byte)'/':
                        case (Byte)'"':
                            // remove prefix
                            Write(c);
                            it.MoveNext();
                            continue;

                        case (Byte)'b':
                            Write((Byte)'\b');
                            it.MoveNext();
                            continue;

                        case (Byte)'f':
                            Write((Byte)'\f');
                            it.MoveNext();
                            continue;

                        case (Byte)'n':
                            Write((Byte)'\n');
                            it.MoveNext();
                            continue;

                        case (Byte)'r':
                            Write((Byte)'\r');
                            it.MoveNext();
                            continue;

                        case (Byte)'t':
                            Write((Byte)'\t');
                            it.MoveNext();
                            continue;
                        }
                    }

                    Write(it.Current);
                }
                else if (l == 2)
                {
                    Write(it.Current);
                    Write(it.Second);
                }
                else if (l == 3)
                {
                    Write(it.Current);
                    Write(it.Second);
                    Write(it.Third);
                }
                else if (l == 4)
                {
                    Write(it.Current);
                    Write(it.Second);
                    Write(it.Third);
                    Write(it.Fourth);
                }
                else
                {
                    throw new ParserException("invalid utf8");
                }
            }

            return(writeCount);
        }