code: private boolean loadMore(int available)
          throws IOException
      {
          mByteCount += (mByteBufferEnd - available);
  
          // Bytes that need to be moved to the beginning of buffer?
          if (available > 0) {
  	    /* 11-Nov-2008, TSa: can only move if we own the buffer; otherwise
  	     *   we are stuck with the data.
  	     */
              if (mBytePtr > 0 && canModifyBuffer()) {
                  for (int i = 0; i < available; ++i) {
                      mByteBuffer[i] = mByteBuffer[mBytePtr+i];
                  }
                  mBytePtr = 0;
  		mByteBufferEnd = available;
              }
          } else {
              /* Ok; here we can actually reasonably expect an EOF,
               * so let's do a separate read right away:
               */
              int count = readBytes();
              if (count < 1) {
                  if (count < 0) { // -1
                      freeBuffers(); // to help GC?
                      return false;
                  }
                  // 0 count is no good; let's err out
                  reportStrangeStream();
              }
          }
  
          /* Need at least 4 bytes; if we don't get that many, it's an
           * error.
           */
          while (mByteBufferEnd < 4) {
              int count = readBytesAt(mByteBufferEnd);
              if (count < 1) {
                  if (count < 0) { // -1, EOF... no good!
                      freeBuffers(); // to help GC?
                      reportUnexpectedEOF(mByteBufferEnd, 4);
                  }
                  // 0 count is no good; let's err out
                  reportStrangeStream();
              }
          }
          return true;
      }
docs: @param available Number of "unused" bytes in the input buffer
  
  @return True, if enough bytes were read to allow decoding of at least
  one full character; false if EOF was encountered instead.