mbsrtowcs.c - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
       mbsrtowcs.c (643B)
       ---
            1 #include <limits.h>
            2 #include <string.h>
            3 #include <wchar.h>
            4 
            5 #undef mbsrtowcs
            6 
            7 size_t
            8 mbsrtowcs(wchar_t *restrict dest, const char **restrict src, size_t len,
            9           mbstate_t *restrict ps)
           10 {
           11         wchar_t wc;
           12         const char *s = *src;
           13         size_t cnt, n;
           14         static mbstate_t st;
           15 
           16         if (!ps)
           17                 ps = &st;
           18 
           19         n = 0;
           20         for (;;) {
           21                 cnt = mbrtowc(&wc, s, MB_LEN_MAX, ps);
           22                 if (cnt == (size_t) -2) {
           23                         s += MB_LEN_MAX;
           24                         continue;
           25                 }
           26                 if (cnt == (size_t) -1)
           27                         return -1;
           28 
           29                 if (dest) {
           30                         if (n == len) {
           31                                 *src = s;
           32                                 break;
           33                         }
           34                         *dest++ = wc;
           35                 }
           36 
           37                 if (wc == 0) {
           38                         if (dest)
           39                                 *src = NULL;
           40                         break;
           41                 }
           42 
           43                 s += cnt;
           44                 n++;
           45 
           46         }
           47 
           48         return n;
           49 }