Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 size_t
00021 mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
00022 {
00023 if (ps == NULL)
00024 ps = &_gl_mbsrtowcs_state;
00025 {
00026 const char *src = *srcp;
00027
00028 if (dest != NULL)
00029 {
00030 wchar_t *destptr = dest;
00031
00032 for (; len > 0; destptr++, len--)
00033 {
00034 size_t src_avail;
00035 size_t ret;
00036
00037
00038
00039 if (src[0] == '\0')
00040 src_avail = 1;
00041 else if (src[1] == '\0')
00042 src_avail = 2;
00043 else if (src[2] == '\0')
00044 src_avail = 3;
00045 else if (MB_LEN_MAX <= 4 || src[3] == '\0')
00046 src_avail = 4;
00047 else
00048 src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
00049
00050
00051 ret = mbrtowc (destptr, src, src_avail, ps);
00052
00053 if (ret == (size_t)(-2))
00054
00055
00056 abort ();
00057
00058 if (ret == (size_t)(-1))
00059 goto bad_input;
00060 if (ret == 0)
00061 {
00062 src = NULL;
00063
00064 break;
00065 }
00066 src += ret;
00067 }
00068
00069 *srcp = src;
00070 return destptr - dest;
00071 }
00072 else
00073 {
00074
00075
00076 mbstate_t state = *ps;
00077 size_t totalcount = 0;
00078
00079 for (;; totalcount++)
00080 {
00081 size_t src_avail;
00082 size_t ret;
00083
00084
00085
00086 if (src[0] == '\0')
00087 src_avail = 1;
00088 else if (src[1] == '\0')
00089 src_avail = 2;
00090 else if (src[2] == '\0')
00091 src_avail = 3;
00092 else if (MB_LEN_MAX <= 4 || src[3] == '\0')
00093 src_avail = 4;
00094 else
00095 src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
00096
00097
00098 ret = mbrtowc (NULL, src, src_avail, &state);
00099
00100 if (ret == (size_t)(-2))
00101
00102
00103 abort ();
00104
00105 if (ret == (size_t)(-1))
00106 goto bad_input2;
00107 if (ret == 0)
00108 {
00109
00110 break;
00111 }
00112 src += ret;
00113 }
00114
00115 return totalcount;
00116 }
00117
00118 bad_input:
00119 *srcp = src;
00120 bad_input2:
00121 errno = EILSEQ;
00122 return (size_t)(-1);
00123 }
00124 }