Blame manual/examples/mbstouwcs.c

Packit 6c4009
#include <stdbool.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <wchar.h>
Packit 6c4009
Packit 6c4009
/* Do not include the above headers in the example.
Packit 6c4009
*/
Packit 6c4009
wchar_t *
Packit 6c4009
mbstouwcs (const char *s)
Packit 6c4009
{
Packit 6c4009
  /* Include the null terminator in the conversion.  */
Packit 6c4009
  size_t len = strlen (s) + 1;
Packit 6c4009
  wchar_t *result = reallocarray (NULL, len, sizeof (wchar_t));
Packit 6c4009
  if (result == NULL)
Packit 6c4009
    return NULL;
Packit 6c4009
Packit 6c4009
  wchar_t *wcp = result;
Packit 6c4009
  mbstate_t state;
Packit 6c4009
  memset (&state, '\0', sizeof (state));
Packit 6c4009
Packit 6c4009
  while (true)
Packit 6c4009
    {
Packit 6c4009
      wchar_t wc;
Packit 6c4009
      size_t nbytes = mbrtowc (&wc, s, len, &state);
Packit 6c4009
      if (nbytes == 0)
Packit 6c4009
        {
Packit 6c4009
          /* Terminate the result string.  */
Packit 6c4009
          *wcp = L'\0';
Packit 6c4009
          break;
Packit 6c4009
        }
Packit 6c4009
      else if (nbytes == (size_t) -2)
Packit 6c4009
        {
Packit 6c4009
          /* Truncated input string.  */
Packit 6c4009
          errno = EILSEQ;
Packit 6c4009
          free (result);
Packit 6c4009
          return NULL;
Packit 6c4009
        }
Packit 6c4009
      else if (nbytes == (size_t) -1)
Packit 6c4009
        {
Packit 6c4009
          /* Some other error (including EILSEQ).  */
Packit 6c4009
          free (result);
Packit 6c4009
          return NULL;
Packit 6c4009
        }
Packit 6c4009
      else
Packit 6c4009
        {
Packit 6c4009
          /* A character was converted.  */
Packit 6c4009
          *wcp++ = towupper (wc);
Packit 6c4009
          len -= nbytes;
Packit 6c4009
          s += nbytes;
Packit 6c4009
        }
Packit 6c4009
    }
Packit 6c4009
  return result;
Packit 6c4009
}