assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT || status == GCONV_INCOMPLETE_INPUT);
assert (status == GCONV_OK || status == GCONV_EMPTY_INPUT || status == GCONV_ILLEGAL_INPUT || status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);
__mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps){  wchar_t buf[1];  struct gconv_step_data data;  size_t inbytes;  int status;  size_t result;  /* Tell where we want the result.  */  data.outbuf = (char *) (pwc ?: buf);  data.outbufavail = 0;  data.outbufsize = sizeof (wchar_t);  data.is_last = 1;  data.statep = ps ?: &state;  /* A first special case is if S is NULL.  This means put PS in the     initial state.  */  if (s == NULL)    {      data.outbuf = (char *) buf;      s = "";      n = 1;    }  /* Make sure we use the correct function.  */  update_conversion_ptrs ();  /* Do a normal conversion.  */  inbytes = n;  status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,					     &data, s, &inbytes, NULL, 0);  /* There must not be any problems with the conversion but illegal input     characters.  The output buffer must be large enough, otherwise the     definition of MB_CUR_MAX is not correct.  All the other possible     errors also must not happen.  */  assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT	  || status == GCONV_INCOMPLETE_INPUT);  if (status == GCONV_OK)    {      if (*(wchar_t *)data.outbuf == L'\0')	{	  /* The converted character is the NUL character.  */	  assert (mbsinit (data.statep));	  result = 0;	}      else	result = n - inbytes;    }  else    {      result = status == GCONV_INCOMPLETE_INPUT ? (size_t) -2 : (size_t) -1;      __set_errno (EILSEQ);    }  return result;}