scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

mbsrtowcs.c (671B)


      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 	for (n = 0; ; n++) {
     20 		cnt = mbrtowc(&wc, s, MB_LEN_MAX, ps);
     21 		if (cnt == (size_t) -2) {
     22 			s += MB_LEN_MAX;
     23 			continue;
     24 		}
     25 		if (cnt == (size_t) -1)
     26 			return -1;
     27 
     28 		if (dest) {
     29 			if (n == len) {
     30 				*src = s;
     31 				return n;
     32 			}
     33 			*dest++ = wc;
     34 		}
     35 		s += cnt;
     36 
     37 		if (wc == 0)
     38 			break;
     39 	}
     40 
     41 	if (dest) {
     42 		memset(ps, 0, sizeof(mbstate_t));
     43 		*src = NULL;
     44 	}
     45 
     46 	return n;
     47 }