newlib/winsup/cygwin/wchar.h
Corinna Vinschen 462fcdb67f Cygwin: convert sys_wcstombs/sys_mbstowcs wrapper to inline functions
This should slightly speed up especially path conversions,
given there's one less function call rearranging all function
arguments in registers/stack (and less stack pressure).

For clarity, rename overloaded  sys_wcstombs to _sys_wcstombs
and sys_cp_mbstowcs to _sys_mbstowcs.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-07-10 10:29:33 +02:00

98 lines
2.4 KiB
C

/* wchar.h: Extra wchar defs
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifndef _CYGWIN_WCHAR_H
#define _CYGWIN_WCHAR_H
#include_next <wchar.h>
/* Internal headers from newlib */
#include "../locale/setlocale.h"
#define ENCODING_LEN 31
#ifdef __cplusplus
extern "C" {
#endif
typedef int mbtowc_f (struct _reent *, wchar_t *, const char *, size_t,
mbstate_t *);
typedef mbtowc_f *mbtowc_p;
extern mbtowc_f __ascii_mbtowc;
extern mbtowc_f __utf8_mbtowc;
extern mbtowc_p __iso_mbtowc (int);
extern mbtowc_p __cp_mbtowc (int);
#define __MBTOWC (__get_current_locale ()->mbtowc)
typedef int wctomb_f (struct _reent *, char *, wchar_t, mbstate_t *);
typedef wctomb_f *wctomb_p;
extern wctomb_f __ascii_wctomb;
extern wctomb_f __utf8_wctomb;
#define __WCTOMB (__get_current_locale ()->wctomb)
#ifdef __cplusplus
}
#endif
#ifdef __INSIDE_CYGWIN__
#ifdef __cplusplus
extern size_t _sys_wcstombs (char *dst, size_t len, const wchar_t *src,
size_t nwc, bool is_path);
extern size_t _sys_wcstombs_alloc (char **dst_p, int type, const wchar_t *src,
size_t nwc, bool is_path);
static inline size_t
sys_wcstombs (char *dst, size_t len, const wchar_t * src,
size_t nwc = (size_t) -1)
{
return _sys_wcstombs (dst, len, src, nwc, true);
}
static inline size_t
sys_wcstombs_no_path (char *dst, size_t len, const wchar_t * src,
size_t nwc = (size_t) -1)
{
return _sys_wcstombs (dst, len, src, nwc, false);
}
static inline size_t
sys_wcstombs_alloc (char **dst_p, int type, const wchar_t *src,
size_t nwc = (size_t) -1)
{
return _sys_wcstombs_alloc (dst_p, type, src, nwc, true);
}
static inline size_t
sys_wcstombs_alloc_no_path (char **dst_p, int type, const wchar_t *src,
size_t nwc = (size_t) -1)
{
return _sys_wcstombs_alloc (dst_p, type, src, nwc, false);
}
size_t _sys_mbstowcs (mbtowc_p, wchar_t *, size_t, const char *,
size_t = (size_t) -1);
static inline size_t
sys_mbstowcs (wchar_t * dst, size_t dlen, const char *src,
size_t nms = (size_t) -1)
{
mbtowc_p f_mbtowc = (__MBTOWC == __ascii_mbtowc) ? __utf8_mbtowc : __MBTOWC;
return _sys_mbstowcs (f_mbtowc, dst, dlen, src, nms);
}
size_t sys_mbstowcs_alloc (wchar_t **, int, const char *, size_t = (size_t) -1);
#endif /* __cplusplus */
#endif /* __INSIDE_CYGWIN__ */
#endif /* _CYGWIN_WCHAR_H */