Advertisement
homer512

wide character to string

Aug 27th, 2015
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.45 KB | None | 0 0
  1. #include <wchar.h>
  2. /* using wcsrtombs */
  3. #include <stdlib.h>
  4. /* using realloc, free */
  5. #include <string.h>
  6. /* using memset */
  7. #include <stdio.h>
  8.  /* using fprintf */
  9. #include <locale.h>
  10. /* using setlocale */
  11.  
  12. char* s_wstring_to_string (const wchar_t* ws)
  13. {
  14.   size_t buflen;
  15.   char* buffer;
  16.   char* resized;
  17.   size_t bufpos ;
  18.   mbstate_t mbstate;
  19.   memset(&mbstate, 0, sizeof(mbstate));
  20.   /* to avoid parsing the string twice, we allocate memory speculatively
  21.    * with exponential growth. Then we shrink it at the end
  22.    *
  23.    * Alternative:  use
  24.    * const wchar_t* tmp = ws;
  25.    * size_t buflen = wcsrtombs(NULL, &tmp, 0, mbstate);
  26.    * buffer = malloc(buflen);
  27.    * wcsrtombs(buffer, &ws, 0, mbstate);
  28.    * return buffer;
  29.    */
  30.   for(buflen = 4, buffer = NULL, bufpos = 0; ws; buflen *= 2) {
  31.     size_t converted;
  32.     if(! (resized = realloc(buffer, buflen)))
  33.       goto err;
  34.     buffer = resized;
  35.     if((converted = wcsrtombs(buffer + bufpos, &ws, buflen - bufpos, &mbstate))
  36.        == (size_t) -1)
  37.       goto err;
  38.     bufpos += converted;    
  39.   }
  40.   /* shrink buffer to actually required size */
  41.   if(! (resized = realloc(buffer, bufpos + 1)))
  42.     goto err;
  43.   return resized;
  44.  err:
  45.   free(buffer);
  46.   return NULL;
  47. }
  48.  
  49. int
  50. main(void) {
  51.   setlocale(LC_ALL, "");
  52.   char * my_wstr = s_wstring_to_string (L"z\u00df\u6c34\U0001f34c");
  53.   if(my_wstr)
  54.     fprintf (stdout, "%s\n", my_wstr);
  55.   else
  56.     puts("Parse failed");
  57.   return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement