*((wchar_t *) (outbuf + outwchars)) = inbuf[cnt];
*((wchar_t *) (outbuf + outwchars)) = (unsigned char) inbuf[cnt];
gconv (struct gconv_step *step, struct gconv_step_data *data,       const char *inbuf, size_t *inbufsize, size_t *written, int do_flush){  struct gconv_step *next_step = step + 1;  struct gconv_step_data *next_data = data + 1;  gconv_fct fct = next_step->fct;  size_t do_write;  int result;  /* If the function is called with no input this means we have to reset     to the initial state.  The possibly partly converted input is     dropped.  */  if (do_flush)    {      do_write = 0;      /* Call the steps down the chain if there are any.  */      if (data->is_last)	result = GCONV_OK;      else	{	  struct gconv_step *next_step = step + 1;	  struct gconv_step_data *next_data = data + 1;	  result = (*fct) (next_step, next_data, NULL, 0, written, 1);	  /* Clear output buffer.  */	  data->outbufavail = 0;	}    }  else    {      enum direction dir = ((struct iso88591_data *) data->data)->dir;      do_write = 0;      do	{	  result = GCONV_OK;	  if (dir == from_iso88591)	    {	      size_t inchars = *inbufsize;	      size_t outwchars = data->outbufavail;	      char *outbuf = data->outbuf;	      size_t cnt = 0;	      while (cnt < inchars		     && (outwchars + sizeof (wchar_t) <= data->outbufsize))		{		  *((wchar_t *) (outbuf + outwchars)) = inbuf[cnt];		  ++do_write;		  outwchars += sizeof (wchar_t);		  ++cnt;		}	      *inbufsize -= cnt;	      data->outbufavail = outwchars;	    }	  else	    {	      size_t inwchars = *inbufsize;	      size_t outchars = data->outbufavail;	      char *outbuf = data->outbuf;	      size_t cnt = 0;	      while (inwchars >= cnt + sizeof (wchar_t)		     && outchars < data->outbufsize)		{		  if (*((wchar_t *) (inbuf + cnt)) >= L'\0'		      && *((wchar_t *) (inbuf + cnt)) <= L'\377')		    outbuf[outchars] = *((wchar_t *) (inbuf + cnt));		  else		    /* Here is where the transliteration would enter the		       scene.  */		    break;		  ++do_write;		  ++outchars;		  cnt += sizeof (wchar_t);		}	      *inbufsize -= cnt;	      data->outbufavail = outchars;	      if (outchars < data->outbufsize)		{		  /* If there is still room in the output buffer something		     is wrong with the input.  */		  if (inwchars >= cnt + sizeof (wchar_t))		    {		      /* An error occurred.  */		      result = GCONV_ILLEGAL_INPUT;		      break;		    }		  if (inwchars != cnt)		    {		      /* There are some unprocessed bytes at the end of the			 input buffer.  */		      result = GCONV_INCOMPLETE_INPUT;		      break;		    }		}	    }	  if (result != GCONV_OK)	    break;	  if (data->is_last)	    {	      /* This is the last step.  */	      result = (*inbufsize > (dir == from_iso88591				      ? 0 : sizeof (wchar_t) - 1)			? GCONV_FULL_OUTPUT : GCONV_EMPTY_INPUT);	      break;	    }	  /* Status so far.  */	  result = GCONV_EMPTY_INPUT;	  if (data->outbufavail > 0)	    {	      /* Call the functions below in the chain.  */	      size_t newavail = data->outbufavail;	      result = (*fct) (next_step, next_data, data->outbuf, &newavail,			       written, 0);	      /* Correct the output buffer.  */	      if (newavail != data->outbufavail && newavail > 0)		{		  memmove (data->outbuf,			   &data->outbuf[data->outbufavail - newavail],			   newavail);		  data->outbufavail = newavail;		}	    }	}      while (*inbufsize > 0 && result == GCONV_EMPTY_INPUT);    }  if (written != NULL && data->is_last)    *written = do_write;  return result;}