]> pd.if.org Git - pdclib/blobdiff - internals/_PDCLIB_encoding.h
Pointer typedef resulted in non-const structure where const was intended.
[pdclib] / internals / _PDCLIB_encoding.h
index 0b466c150a291789fe3a6deb7335dca59935e4af..10f1140c3e73527670d08ab20c246a4ce9572d27 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
  *
@@ -75,18 +75,18 @@ 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;
         }
     }
 }
 
-struct _PDCLIB_charcodec {
+struct _PDCLIB_charcodec_t {
     /* Reads at most *_P_insz code units from *_P_inbuf and writes the result 
      * into *_P_outbuf, writing at most *_P_outsz code units. Updates 
      * *_P_outbuf, *_P_outsz, *_P_inbuf, *_P_outsz with the resulting state
@@ -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