c_io_libio_codecvt.c [plain text]
#include <libio.h>
#ifdef _GLIBCPP_USE_WCHAR_T
static enum __codecvt_result
do_out(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
const wchar_t *from_start, const wchar_t *from_end,
const wchar_t **from_stop, char *to_start, char *to_end,
char **to_stop);
static enum __codecvt_result
do_unshift(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, char *to_start,
char *to_end, char **to_stop);
static enum __codecvt_result
do_in(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
const char *from_start, const char *from_end, const char **from_stop,
wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop);
static int
do_encoding(struct _IO_codecvt *codecvt);
static int
do_length(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
const char *from_start, const char *from_end, _IO_size_t max);
static int
do_max_length(struct _IO_codecvt *codecvt);
static int
do_always_noconv(struct _IO_codecvt *codecvt);
struct _IO_codecvt __c_libio_codecvt =
{
.__codecvt_destr = NULL,
.__codecvt_do_out = do_out,
.__codecvt_do_unshift = do_unshift,
.__codecvt_do_in = do_in,
.__codecvt_do_encoding = do_encoding,
.__codecvt_do_always_noconv = do_always_noconv,
.__codecvt_do_length = do_length,
.__codecvt_do_max_length = do_max_length
};
static enum __codecvt_result
do_out(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
const wchar_t *from_start, const wchar_t *from_end,
const wchar_t **from_stop, char *to_start, char *to_end,
char **to_stop)
{
enum __codecvt_result res = __codecvt_ok;
while (from_start < from_end)
{
if (to_start >= to_end)
{
res = __codecvt_partial;
break;
}
*to_start++ = (char) *from_start++;
}
*from_stop = from_start;
*to_stop = to_start;
return res;
}
static enum __codecvt_result
do_unshift(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
char *to_start, char *to_end, char **to_stop)
{
*to_stop = to_start;
return __codecvt_ok;
}
static enum __codecvt_result
do_in(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
const char *from_start, const char *from_end, const char **from_stop,
wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop)
{
enum __codecvt_result res = __codecvt_ok;
while (from_start < from_end)
{
if (to_start >= to_end)
{
res = __codecvt_partial;
break;
}
*to_start++ = (wchar_t) *from_start++;
}
*from_stop = from_start;
*to_stop = to_start;
return res;
}
static int
do_encoding(struct _IO_codecvt *codecvt)
{ return 1; }
static int
do_always_noconv(struct _IO_codecvt *codecvt)
{ return 0; }
static int
do_length(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
const char *from_start, const char *from_end, _IO_size_t max)
{ return from_end - from_start; }
static int
do_max_length(struct _IO_codecvt *codecvt)
{ return 1; }
#endif