From a16d38f68798a7859c38f944373a8c122f7e8cd4 Mon Sep 17 00:00:00 2001 From: Owen Shepherd Date: Mon, 31 Dec 2012 20:34:58 +0000 Subject: [PATCH] PDCLIB-2 PDCLIB-9: Single character conversions for --- functions/uchar/c32rtomb.c | 59 ++++++++++++++++++++++++++++++ functions/uchar/mbrtoc32.c | 75 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 functions/uchar/c32rtomb.c create mode 100644 functions/uchar/mbrtoc32.c diff --git a/functions/uchar/c32rtomb.c b/functions/uchar/c32rtomb.c new file mode 100644 index 0000000..ab5006b --- /dev/null +++ b/functions/uchar/c32rtomb.c @@ -0,0 +1,59 @@ +/* c32rtomb( + char *restrict s, + char32_t c32, + mbstate_t *restrict ps); + + 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 +#include +#include +#include +#include +#include <_PDCLIB_encoding.h> +#include <_PDCLIB_locale.h> + +size_t c32rtomb_l( + char *restrict s, + char32_t c32, + mbstate_t *restrict ps, + locale_t restrict l +) +{ + char32_t *restrict psrc = &c32; + size_t srcsz = 1; + size_t dstsz = MB_CUR_MAX; + size_t dstrem = dstsz; + + if(l->_Codec->__c32stombs(&s, &dstrem, &psrc, &srcsz, ps)) { + // Successful conversion + return dstsz - dstrem; + } else { + errno = EILSEQ; + return (size_t) -1; + } +} + +size_t c32rtomb( + char *restrict s, + char32_t c32, + mbstate_t *restrict ps +) +{ + return c32rtomb_l(s, c32, ps, _PDCLIB_threadlocale()); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} +#endif diff --git a/functions/uchar/mbrtoc32.c b/functions/uchar/mbrtoc32.c new file mode 100644 index 0000000..05d9184 --- /dev/null +++ b/functions/uchar/mbrtoc32.c @@ -0,0 +1,75 @@ +/* size_t mbrtoc32( + char16_t *restrict pc16, + const char *restrict s, + size_t n, + mbstate_t *restrict ps); + + 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 +#include +#include +#include +#include <_PDCLIB_encoding.h> +#include <_PDCLIB_locale.h> + +size_t mbrtoc32_l( + char32_t *restrict pc32, + const char *restrict s, + size_t n, + mbstate_t *restrict ps, + locale_t restrict l +) +{ + size_t dstlen = 1; + size_t nr = n; + + if(l->_Codec->__mbstoc32s(&pc32, &dstlen, &s, &nr, ps)) { + // Successful conversion + if(dstlen == 0) { + // A character was output + if(nr == n) { + // The output character resulted entirely from stored state + return (size_t) -3; + } else if(pc32[-1] == 0) { + // Was null character + return 0; + } else { + // Count of processed characters + return n - nr; + } + } else { + assert(nr == 0 && "Must have processed whole input"); + return (size_t) -2; + } + } else { + // Failed conversion + errno = EILSEQ; + return (size_t) -1; + } +} + +size_t mbrtoc32( + char32_t *restrict pc32, + const char *restrict s, + size_t n, + mbstate_t *restrict ps +) +{ + return mbrtoc32_l(pc32, s, n, ps, _PDCLIB_threadlocale()); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} +#endif -- 2.40.0