X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=internals%2F_PDCLIB_encoding.h;h=fdaee7ee42061044cdb792212b3ef5b4a24287c1;hb=3862b03514c94f37966f61693619e6483ead6045;hp=0b466c150a291789fe3a6deb7335dca59935e4af;hpb=0e35e82c5e9a0804864839e8fc0e985b1ae41f07;p=pdclib.old diff --git a/internals/_PDCLIB_encoding.h b/internals/_PDCLIB_encoding.h index 0b466c1..fdaee7e 100644 --- a/internals/_PDCLIB_encoding.h +++ b/internals/_PDCLIB_encoding.h @@ -6,7 +6,7 @@ #ifndef __PDCLIB_ENCODING_H #define __PDCLIB_ENCODING_H __PDCLIB_ENCODING_H -#include "_PDCLIB_int.h" +#include /* Must be cauued with bufsize >= 1, in != NULL, out != NULL, ps != NULL * @@ -75,12 +75,12 @@ static inline _PDCLIB_size_t _PDCLIB_c32rtoc16( return 1; } else { // Supplementary plane character - *out = 0xD800 | (*in & 0x3FF); + *out = 0xD800 | (*in >> 10); if(bufsize >= 2) { - out[1] = 0xDC00 | (*in >> 10); + out[1] = 0xDC00 | (*in & 0x3FF); return 2; } else { - ps->_Surrogate = 0xDC00 | (*in >> 10); + ps->_Surrogate = 0xDC00 | (*in & 0x3FF); return 1; } } @@ -99,22 +99,25 @@ struct _PDCLIB_charcodec { * encountered), else return false. */ + /* mbsinit. Mandatory. */ + _PDCLIB_bool (*__mbsinit)(const _PDCLIB_mbstate_t *_P_ps); + /* UCS-4 variants. Mandatory. */ _PDCLIB_bool (*__mbstoc32s)( - _PDCLIB_char32_t **_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const char **_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps + _PDCLIB_char32_t *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, + const char *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_insz, + _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps ); _PDCLIB_bool (*__c32stombs)( - char **_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const _PDCLIB_char32_t **_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps + char *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, + const _PDCLIB_char32_t *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_insz, + _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps ); /* UTF-16 variants; same as above except optional. @@ -124,20 +127,82 @@ struct _PDCLIB_charcodec { */ _PDCLIB_bool (*__mbstoc16s)( - _PDCLIB_char16_t **_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const char **_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps + _PDCLIB_char16_t *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, + const char *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_insz, + _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps ); _PDCLIB_bool (*__c16stombs)( - char **_PDCLIB_restrict _P_outbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, - const _PDCLIB_char16_t **_PDCLIB_restrict _P_inbuf, - _PDCLIB_size_t *_PDCLIB_restrict _P_insz, - _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps + char *_PDCLIB_restrict *_PDCLIB_restrict _P_outbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_outsz, + const _PDCLIB_char16_t *_PDCLIB_restrict *_PDCLIB_restrict _P_inbuf, + _PDCLIB_size_t *_PDCLIB_restrict _P_insz, + _PDCLIB_mbstate_t *_PDCLIB_restrict _P_ps ); + + size_t __mb_max; +}; + +/* mbstate _PendState values */ +enum { + /* Nothing pending; _PendChar ignored */ + _PendClear = 0, + + /* Process the character stored in _PendChar before reading the buffer + * passed for the conversion + */ + _PendPrefix = 1, }; +/* XXX Defining these here is temporary - will move to xlocale in future */ +size_t mbrtoc16_l( + char16_t *_PDCLIB_restrict pc16, + const char *_PDCLIB_restrict s, + size_t n, + mbstate_t *_PDCLIB_restrict ps, +_PDCLIB_locale_t _PDCLIB_restrict l); + +size_t c16rtomb_l( + char *_PDCLIB_restrict s, + char16_t c16, + mbstate_t *_PDCLIB_restrict ps, +_PDCLIB_locale_t _PDCLIB_restrict l); + +size_t mbrtoc32_l( + char32_t *_PDCLIB_restrict pc32, + const char *_PDCLIB_restrict s, + size_t n, + mbstate_t *_PDCLIB_restrict ps, +_PDCLIB_locale_t _PDCLIB_restrict l); + +size_t c32rtomb_l( + char *_PDCLIB_restrict s, + char32_t c32, + mbstate_t *_PDCLIB_restrict ps, +_PDCLIB_locale_t _PDCLIB_restrict l); + +#define _PDCLIB_WCHAR_ENCODING_UTF16 16 +#define _PDCLIB_WCHAR_ENCODING_UCS4 32 + +#if !defined(_PDCLIB_WCHAR_ENCODING) + #define _PDCLIB_WCHAR_ENCODING 0 +#endif + +#if _PDCLIB_WCHAR_ENCODING == _PDCLIB_WCHAR_ENCODING_UTF16 + #define _PDCLIB_mbrtocwc_l mbrtoc16_l + #define _PDCLIB_mbrtocwc mbrtoc16 + #define _PDCLIB_cwcrtomb_l c16rtomb_l + #define _PDCLIB_cwcrtomb c16rtomb +#elif _PDCLIB_WCHAR_ENCODING == _PDCLIB_WCHAR_ENCODING_UCS4 + #define _PDCLIB_mbrtocwc_l mbrtoc32_l + #define _PDCLIB_mbrtocwc mbrtoc32 + #define _PDCLIB_cwcrtomb_l c32rtomb_l + #define _PDCLIB_cwcrtomb c32rtomb +#else + #error _PDCLIB_WCHAR_ENCODING not defined correctly + #error Define to one of _PDCLIB_WCHAR_ENCODING_UCS4 or _PDCLIB_WCHAR_ENCODING_UTF16 +#endif + #endif