public override sealed int ReadByte()
 {
     if (markpos < 0)
     {
         return(readInternal());
     }
     else
     {
         if (isDisabled())
         {
             return(stream.ReadByte());
         }
         int c = readInternal();
         if (c >= 0 && markpos >= 0)
         {
             markpos++;
             if (markpos > marklimit)
             {
                 marklimit = 0;
                 markpos   = -1;
                 if (buffer != null && isDisabled())
                 {
                     buffer = null;
                 }
             }
         }
         return(c);
     }
 }
Ejemplo n.º 2
0
            public int read()
            {
                int c = stream.ReadByte();

                if (c >= 0x80)
                {
                    throw new IOException("Invalid ASCII");
                }
                return(c);
            }
Ejemplo n.º 3
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);
            }
        }