scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | 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 }