code: private void _fill () throws IOException
    {
      int nDstOfs = 0;
      if (m_nMarkedChar > UNMARKED)
      {
        // Marked
        final int nDelta = m_nNextCharIndex - m_nMarkedChar;
        if (nDelta >= m_nReadAheadLimit)
        {
          // Gone past read-ahead limit: Invalidate mark
          m_nMarkedChar = INVALIDATED;
          m_nReadAheadLimit = 0;
        }
        else
        {
          if (m_nReadAheadLimit <= m_aBuf.length)
          {
            // Shuffle in the current buffer
            System.arraycopy (m_aBuf, m_nMarkedChar, m_aBuf, 0, nDelta);
            m_nMarkedChar = 0;
            nDstOfs = nDelta;
          }
          else
          {
            // Reallocate buffer to accommodate read-ahead limit
            final char [] aNewBuf = new char [m_nReadAheadLimit];
            System.arraycopy (m_aBuf, m_nMarkedChar, aNewBuf, 0, nDelta);
            m_aBuf = aNewBuf;
            m_nMarkedChar = 0;
            nDstOfs = nDelta;
          }
          m_nNextCharIndex = nDelta;
          m_nChars = nDelta;
        }
      }
  
      int nBytesRead;
      do
      {
        nBytesRead = m_aReader.read (m_aBuf, nDstOfs, m_aBuf.length - nDstOfs);
      } while (nBytesRead == 0);
      if (nBytesRead > 0)
      {
        m_nChars = nDstOfs + nBytesRead;
        m_nNextCharIndex = nDstOfs;
      }
    }
docs: Fills the input buffer, taking the mark into account if it is valid.
  
  @throws IOException
  In case reading fails