fix all implicit conversion between signed/unsigned pointers
[musl] / src / multibyte / mbrtowc.c
1 /* 
2  * This code was written by Rich Felker in 2010; no copyright is claimed.
3  * This code is in the public domain. Attribution is appreciated but
4  * unnecessary.
5  */
6
7 #include <stdlib.h>
8 #include <inttypes.h>
9 #include <wchar.h>
10 #include <errno.h>
11
12 #include "internal.h"
13
14 size_t mbrtowc(wchar_t *wc, const char *src, size_t n, mbstate_t *st)
15 {
16         static unsigned internal_state;
17         unsigned c;
18         const unsigned char *s = (const void *)src;
19         const unsigned N = n;
20
21         if (!st) st = (void *)&internal_state;
22         c = *(unsigned *)st;
23         
24         if (!s) {
25                 s = (void *)"";
26                 wc = (void *)&wc;
27                 n = 1;
28         } else if (!wc) wc = (void *)&wc;
29
30         if (!n) return -2;
31         if (!c) {
32                 if (*s < 0x80) return !!(*wc = *s);
33                 if (*s-SA > SB-SA) goto ilseq;
34                 c = bittab[*s++-SA]; n--;
35         }
36
37         if (n) {
38                 if (OOB(c,*s)) goto ilseq;
39 loop:
40                 c = c<<6 | *s++-0x80; n--;
41                 if (!(c&(1U<<31))) {
42                         *(unsigned *)st = 0;
43                         *wc = c;
44                         return N-n;
45                 }
46                 if (n) {
47                         if (*s-0x80u >= 0x40) goto ilseq;
48                         goto loop;
49                 }
50         }
51
52         *(unsigned *)st = c;
53         return -2;
54 ilseq:
55         *(unsigned *)st = FAILSTATE;
56         errno = EILSEQ;
57         return -1;
58 }