home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_10_07 / 1007019a < prev    next >
Text File  |  1992-05-05  |  851b  |  42 lines

  1. Listing 6 -- wcstombs.c
  2.  
  3. /* wcstombs function */
  4. #include <limits.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7.  
  8. size_t (wcstombs)(char *s, const wchar_t *wcs, size_t n)
  9.     {    /* translate wide char string to multibyte string */
  10.     char *sc;
  11.     char state = {0};
  12.     size_t i;
  13.  
  14.     for (sc = s; 0 < n; n -= i, ++wcs)
  15.         {    /* translate another wide character */
  16.         if (MB_CUR_MAX <= n)
  17.             {    /* copy directly */
  18.             if ((i = _Wctomb(sc, *wcs, &state)) <= 0)
  19.                 return (-1);
  20.             }
  21.         else
  22.             {    /* copy into local buffer */
  23.             char buf[MB_LEN_MAX];
  24.  
  25.             if ((i = _Wctomb(buf, *wcs, &state)) <= 0)
  26.                 return (-1);
  27.             else if (i <= n)
  28.                 memcpy(sc, buf, i);
  29.             else
  30.                 {    /* won't all fit */
  31.                 memcpy(sc, buf, n);
  32.                 return (sc - s + n);
  33.                 }
  34.             }
  35.         sc += i;
  36.         if (sc[-1] == '\0')
  37.             return (sc - s - 1);
  38.         }
  39.     return (sc - s);
  40.     }
  41.  
  42.