if (fp->_IO_buf_base && want <= fp->_IO_buf_end - fp->_IO_buf_base)
if (fp->_IO_buf_base && want < fp->_IO_buf_end - fp->_IO_buf_base)
_IO_file_xsgetn (fp, data, n)     _IO_FILE *fp;     void *data;     _IO_size_t n;{  register _IO_size_t want, have;  register _IO_ssize_t count;  register char *s = data;  want = n;  while (want > 0)    {      have = fp->_IO_read_end - fp->_IO_read_ptr;      if (want <= have)	{	  memcpy (s, fp->_IO_read_ptr, want);	  fp->_IO_read_ptr += want;	  want = 0;	}      else	{	  if (have > 0)	    {	      memcpy (s, fp->_IO_read_ptr, have);	      want -= have;	      s += have;	      fp->_IO_read_ptr += have;	    }	  /* Check for backup and repeat */	  if (_IO_in_backup (fp))	    {	      _IO_switch_to_main_get_area (fp);	      continue;	    }	  /* If we now want less than a buffer, underflow and repeat	     the copy.  Otherwise, _IO_SYSREAD directly to	     the user buffer. */	  if (fp->_IO_buf_base && want <= fp->_IO_buf_end - fp->_IO_buf_base)	    {	      if (__underflow (fp) == EOF)		break;	      continue;	    }	  /* These must be set before the sysread as we might longjmp out	     waiting for input. */	  _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);	  _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);	  count = _IO_SYSREAD (fp, s, want);	  if (count <= 0)	    {	      if (count == 0)		fp->_flags |= _IO_EOF_SEEN;	      else		fp->_flags |= _IO_ERR_SEEN;	      break;	    }	  s += count;	  want -= count;	  if (fp->_offset != _IO_pos_BAD)	    _IO_pos_adjust (fp->_offset, count);	}    }  return n - want;}