if (status == GCONV_OK && ((wchar_t *) dst)[result - 1] == L'\0')
if ((status == GCONV_OK || status == GCONV_EMPTY_INPUT) && ((wchar_t *) dst)[result - 1] == L'\0')
__mbsrtowcs (dst, src, len, ps)     wchar_t *dst;     const char **src;     size_t len;     mbstate_t *ps;{  struct gconv_step_data data;  size_t result = 0;  int status;  /* Tell where we want the result.  */  data.is_last = 1;  data.statep = ps ?: &state;  /* Make sure we use the correct function.  */  update_conversion_ptrs ();  /* We have to handle DST == NULL special.  */  if (dst == NULL)    {      wchar_t buf[64];		/* Just an arbitrary size.  */      size_t inbytes_in = strlen (*src) + 1;      size_t inbytes = inbytes_in;      const char *inbuf = *src;      size_t written;      data.outbuf = (char *) buf;      data.outbufsize = sizeof (buf);      do	{	  inbuf += inbytes_in - inbytes;	  inbytes_in = inbytes;	  data.outbufavail = 0;	  written = 0;	  status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,						     &data, inbuf, &inbytes,						     &written, 0);	  result += written;	}      while (status == GCONV_FULL_OUTPUT);      if (status == GCONV_OK && ((wchar_t *) dst)[written - 1] == L'\0')	/* Don't count the NUL character in.  */	--result;    }  else    {      /* This code is based on the safe assumption that all internal	 multi-byte encodings use the NUL byte only to mark the end	 of the string.  */      size_t inbytes_in = __strnlen (*src, len * MB_CUR_MAX) + 1;      size_t inbytes = inbytes_in;      data.outbuf = (char *) dst;      data.outbufsize = len * sizeof (wchar_t);      data.outbufavail = 0;      status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,						 &data, *src, &inbytes,						 &result, 0);      /* We have to determine whether the last character converted	 is the NUL character.  */      if (status == GCONV_OK && ((wchar_t *) dst)[result - 1] == L'\0')	{	  assert (result > 0);	  assert (mbsinit (data.statep));	  *src = NULL;	  --result;	}      else	*src += inbytes_in - inbytes;    }  /* There must not be any problems with the conversion but illegal input     characters.  */  assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT	  || status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);  if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)    {      result = (size_t) -1;      __set_errno (EILSEQ);    }  return result;}