]> pd.if.org Git - pdclib/blobdiff - functions/uchar/c16rtomb.c
dos2unix
[pdclib] / functions / uchar / c16rtomb.c
index bce172bd00ff070a5095d33747ff273d56b8021b..5070e28f86b5b004a34062a1c7d6300f2834d405 100644 (file)
-/* c16rtomb( char *, char16_t, mbstate_t * )\r
-\r
-   This file is part of the Public Domain C Library (PDCLib).\r
-   Permission is granted to use, modify, and / or redistribute at will.\r
-*/\r
-\r
-#ifndef REGTEST\r
-#include <uchar.h>\r
-#include <errno.h>\r
-#include <stdint.h>\r
-#include <assert.h>\r
-#include <stdlib.h>\r
-#include "_PDCLIB_encoding.h"\r
-#include "_PDCLIB_locale.h"\r
-\r
-size_t c16rtomb_l(\r
-    char        *restrict   s, \r
-    char16_t                c16,\r
-    mbstate_t   *restrict   ps,\r
-    locale_t     restrict   l\r
-)\r
-{\r
-    const char16_t *restrict psrc = &c16;\r
-    char buf[s ? 0 : MB_CUR_MAX];\r
-    s =      s ? s : buf;\r
-\r
-    if(!l->_Codec->__c16stombs) {\r
-        // Codec doesn't support direct conversion - translate via UCS-4\r
-        if(ps->_Surrogate == 0) {\r
-            // No pending surrogate\r
-            if((c16 & 0xF800) == 0xD800) {\r
-                // Surrogate range\r
-                if((c16 & 0x0400) == 0) {\r
-                    // 0xD800 -> 0xDBFF leading surrogate\r
-                    ps->_Surrogate = c16;\r
-\r
-                    // Need more data\r
-                    // Return 0 - we haven't output anything yet\r
-\r
-                    /* STD: ISO/IEC 9899:2011 is very implcifit about this being\r
-                     *      the correct return value. N1040, from which the \r
-                     *      function was adopted, is explicit about 0 being a \r
-                     *      valid return.\r
-                     */\r
-                    return (size_t) 0;\r
-                } else {\r
-                    // 0xDC00 -> 0xDFFF trailing surrogate\r
-                    errno = EILSEQ;\r
-                    return (size_t) -1;\r
-                }\r
-            } else {\r
-                // BMP range - UTF16 == UCS-4, pass through to c32rtomb_l\r
-                return c32rtomb_l(s, c16, ps, l);\r
-            }\r
-        } else {\r
-            // We have a stored surrogate\r
-            if((c16 & 0xFC00) == 0xDC00) {\r
-                // Trailing surrogate\r
-                char32_t c32 = (ps->_Surrogate & 0x3FF) << 10 | (c16 & 0x3FF);\r
-                ps->_Surrogate = 0;\r
-                return c32rtomb_l(s, c32, ps, l);\r
-            } else {\r
-                // Not a trailing surrogate - encoding error\r
-                errno = EILSEQ;\r
-                return (size_t) -1;\r
-            }\r
-\r
-        }\r
-    } else {\r
-        // Codec supports direct conversion\r
-        size_t srcsz  = 1;\r
-        size_t dstsz  = MB_CUR_MAX;\r
-        size_t dstrem = dstsz;\r
-\r
-        if(l->_Codec->__c16stombs(&s, &dstrem, &psrc, &srcsz, ps)) {\r
-            // Successful conversion\r
-            return dstsz - dstrem;\r
-        } else {\r
-            errno = EILSEQ;\r
-            return (size_t) -1;\r
-        }\r
-    }\r
-}\r
-\r
-size_t c16rtomb(\r
-    char        *restrict   s, \r
-    char16_t                c16,\r
-    mbstate_t   *restrict   ps\r
-)\r
-{\r
-    return c16rtomb_l(s, c16, ps, _PDCLIB_threadlocale());\r
-}\r
-\r
-#endif\r
-\r
-#ifdef TEST\r
-#include "_PDCLIB_test.h"\r
-\r
-int main( void )\r
-{\r
-    TESTCASE( NO_TESTDRIVER );\r
-    return TEST_RESULTS;\r
-}\r
-#endif\r
+/* c16rtomb( char *, char16_t, mbstate_t * )
+
+   This file is part of the Public Domain C Library (PDCLib).
+   Permission is granted to use, modify, and / or redistribute at will.
+*/
+
+#ifndef REGTEST
+#include <uchar.h>
+#include <errno.h>
+#include <stdint.h>
+#include <assert.h>
+#include <stdlib.h>
+#include "_PDCLIB_encoding.h"
+#include "_PDCLIB_locale.h"
+
+size_t c16rtomb_l(
+    char        *restrict   s, 
+    char16_t                c16,
+    mbstate_t   *restrict   ps,
+    locale_t     restrict   l
+)
+{
+    const char16_t *restrict psrc = &c16;
+    char buf[s ? 0 : MB_CUR_MAX];
+    s =      s ? s : buf;
+
+    if(!l->_Codec->__c16stombs) {
+        // Codec doesn't support direct conversion - translate via UCS-4
+        if(ps->_Surrogate == 0) {
+            // No pending surrogate
+            if((c16 & 0xF800) == 0xD800) {
+                // Surrogate range
+                if((c16 & 0x0400) == 0) {
+                    // 0xD800 -> 0xDBFF leading surrogate
+                    ps->_Surrogate = c16;
+
+                    // Need more data
+                    // Return 0 - we haven't output anything yet
+
+                    /* STD: ISO/IEC 9899:2011 is very implcifit about this being
+                     *      the correct return value. N1040, from which the 
+                     *      function was adopted, is explicit about 0 being a 
+                     *      valid return.
+                     */
+                    return (size_t) 0;
+                } else {
+                    // 0xDC00 -> 0xDFFF trailing surrogate
+                    errno = EILSEQ;
+                    return (size_t) -1;
+                }
+            } else {
+                // BMP range - UTF16 == UCS-4, pass through to c32rtomb_l
+                return c32rtomb_l(s, c16, ps, l);
+            }
+        } else {
+            // We have a stored surrogate
+            if((c16 & 0xFC00) == 0xDC00) {
+                // Trailing surrogate
+                char32_t c32 = (ps->_Surrogate & 0x3FF) << 10 | (c16 & 0x3FF);
+                ps->_Surrogate = 0;
+                return c32rtomb_l(s, c32, ps, l);
+            } else {
+                // Not a trailing surrogate - encoding error
+                errno = EILSEQ;
+                return (size_t) -1;
+            }
+
+        }
+    } else {
+        // Codec supports direct conversion
+        size_t srcsz  = 1;
+        size_t dstsz  = MB_CUR_MAX;
+        size_t dstrem = dstsz;
+
+        if(l->_Codec->__c16stombs(&s, &dstrem, &psrc, &srcsz, ps)) {
+            // Successful conversion
+            return dstsz - dstrem;
+        } else {
+            errno = EILSEQ;
+            return (size_t) -1;
+        }
+    }
+}
+
+size_t c16rtomb(
+    char        *restrict   s, 
+    char16_t                c16,
+    mbstate_t   *restrict   ps
+)
+{
+    return c16rtomb_l(s, c16, ps, _PDCLIB_threadlocale());
+}
+
+#endif
+
+#ifdef TEST
+#include "_PDCLIB_test.h"
+
+int main( void )
+{
+    TESTCASE( NO_TESTDRIVER );
+    return TEST_RESULTS;
+}
+#endif