]> pd.if.org Git - pdclib.old/blobdiff - internals/_PDCLIB_encoding.h
PDCLIB-2 PDCLIB-8: Implement mbrtowc using mbrtoc32/mbrtoc16 depending upon definitio...
[pdclib.old] / internals / _PDCLIB_encoding.h
index 0b466c150a291789fe3a6deb7335dca59935e4af..4d17123edb1dc20f64c9fc9e42b9ef3b51ac97f4 100644 (file)
@@ -6,7 +6,7 @@
 
 #ifndef __PDCLIB_ENCODING_H
 #define __PDCLIB_ENCODING_H __PDCLIB_ENCODING_H
-#include "_PDCLIB_int.h"
+#include <uchar.h>
 
 /* Must be cauued with bufsize >= 1, in != NULL, out != NULL, ps != NULL
  *
@@ -102,19 +102,19 @@ struct _PDCLIB_charcodec {
     /* 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 +124,78 @@ 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_cwcrtomb_l c16rtomb_l
+#elif _PDCLIB_WCHAR_ENCODING == _PDCLIB_WCHAR_ENCODING_UCS4
+    #define _PDCLIB_mbrtocwc_l mbrtoc32_l
+    #define _PDCLIB_cwcrtomb_l c32rtomb_l
+#else
+    #error _PDCLIB_WCHAR_ENCODING not defined correctly
+    #error Define to one of _PDCLIB_WCHAR_ENCODING_UCS4 or _PDCLIB_WCHAR_ENCODING_UTF16
+#endif
+
 #endif