public override sealed void mark(int limit)
 {
     //Console.WriteLine("mark %d: %s",limit,isDisabled());
     if (isDisabled())
     {
         stream.mark(limit);
         return;
     }
     if (limit < 0)
     {
         throw new ArgumentException();
     }
     markpos   = 0;
     posAtMark = pos;
     marklimit = limit;
 }
Beispiel #2
0
        public int read()
        {
            int cp          = 0;
            int bytesSeen   = 0;
            int bytesNeeded = 0;
            int lower       = 0x80;
            int upper       = 0xBF;

            while (true)
            {
                int b = stream.ReadByte();
                if (b < 0 && bytesNeeded != 0)
                {
                    bytesNeeded = 0;
                    throw new IOException("", new DecoderFallbackException());
                }
                else if (b < 0)
                {
                    return(-1);
                }
                if (bytesNeeded == 0)
                {
                    if (b < 0x80)
                    {
                        return(b);
                    }
                    else if (b >= 0xc2 && b <= 0xdf)
                    {
                        stream.mark(4);
                        bytesNeeded = 1;
                        cp          = b - 0xc0;
                    }
                    else if (b >= 0xe0 && b <= 0xef)
                    {
                        stream.mark(4);
                        lower       = (b == 0xe0) ? 0xa0 : 0x80;
                        upper       = (b == 0xed) ? 0x9f : 0xbf;
                        bytesNeeded = 2;
                        cp          = b - 0xe0;
                    }
                    else if (b >= 0xf0 && b <= 0xf4)
                    {
                        stream.mark(4);
                        lower       = (b == 0xf0) ? 0x90 : 0x80;
                        upper       = (b == 0xf4) ? 0x8f : 0xbf;
                        bytesNeeded = 3;
                        cp          = b - 0xf0;
                    }
                    else
                    {
                        throw new IOException("", new DecoderFallbackException());
                    }
                    cp <<= (6 * bytesNeeded);
                    continue;
                }
                if (b < lower || b > upper)
                {
                    cp    = bytesNeeded = bytesSeen = 0;
                    lower = 0x80;
                    upper = 0xbf;
                    stream.reset();
                    throw new IOException("", new DecoderFallbackException());
                }
                lower = 0x80;
                upper = 0xbf;
                bytesSeen++;
                cp += (b - 0x80) << (6 * (bytesNeeded - bytesSeen));
                stream.mark(4);
                if (bytesSeen != bytesNeeded)
                {
                    continue;
                }
                int ret = cp;
                cp          = 0;
                bytesSeen   = 0;
                bytesNeeded = 0;
                return(ret);
            }
        }