Code:
#define ASDST_ARGS(S) pawhhc *dst, pawd max, S src, pawd len
#define ASDST_FUNC(S) PAW_API pawzd S##2hss( ASDST_ARGS(S) )
#define ASDST_CODE(C,E) return paw_encode( INTO(pawhhc,"UTF-8"), FROM(C,E) )
#define ASDST(S,C,ENC) ASDST_FUNC(S) { ASDST_CODE(C,ENC); }
#define ASSRC_ARGS(C) C *dst, pawd max, pawhhs src, pawd len
#define ASSRC_FUNC(C,S) PAW_API pawzd pawhhs2##S( ASSRC_ARGS(C) )
#define ASSRC_CODE(C,E) return paw_encode( INTO(C,E), FROM(pawhhc,"UTF-8") )
#define ASSRC(C,S,ENC) ASSRC_FUNC(C,S) { ASSRC_CODE(C,ENC); }
#define ASMBC_ARGS(C) pawmbc *dst, C src
#define ASMBC_FUNC(C) PAW_API pawzd C##2hhc( ASMBC_ARGS(C) )
#define ASMBC_CODE(C,E) return paw_encodec( dst, E, src, sizeof(C) )
#define ASMBC(C,ENC) ASMBC_FUNC(C) { ASMBC_CODE(C,ENC); }
#define DEF_ENCODING_FUNCS(TS,TC,SFX,ENC) \
ASDST(TS,TC,ENC) \
ASSRC(TC,SFX,ENC) \
ASMBC(TC,ENC)
/* Smallest character type */
DEF_MOST_STR_FUNCS(paws,pawc,PAWC_MBC_BIT)
DEF_ENCODING_FUNCS(paws,pawc,s,NULL)
/* Wide character type */
DEF_MOST_STR_FUNCS(pawls,pawlc,PAWLC_MBC_BIT)
DEF_ENCODING_FUNCS(pawls,pawlc,ls,"WCHAR_T")
/* UTF-8 character type */
DEF_MOST_STR_FUNCS(pawhhs,pawhhc,PAWHHC_MBC_BIT)
/* UTF-16 character type */
DEF_MOST_STR_FUNCS(pawhs,pawhc,PAWHC_MBC_BIT)
DEF_ENCODING_FUNCS(pawhs,pawhc,hs,"UTF-16")
/* UTF-32 character type */
DEF_MOST_STR_FUNCS(pawlls,pawllc,PAWLLC_MBC_BIT)
DEF_ENCODING_FUNCS(pawlls,pawllc,lls,"UTF-32")
/* Largest character type (char32_t is currently the only option here) */
DEF_MOST_STR_FUNCS(pawjs,pawjc,PAWJC_MBC_BIT)
DEF_ENCODING_FUNCS(pawjs,pawjc,js,"UTF-32")
/* Native system character type (equivalent of TCHAR on windows) */
DEF_MOST_STR_FUNCS(pawts,pawtc,PAWTC_MBC_BIT)
#if PAWTC_MAX > PAWC_MAX
DEF_ENCODING_FUNCS(pawts,pawtc,ts,"WCHAR_T")
#else
DEF_ENCODING_FUNCS(pawts,pawtc,ts,NULL)
#endif