From: Owen Shepherd Date: Mon, 31 Dec 2012 16:16:01 +0000 (+0000) Subject: PDCLIB-2 PDCLIB-9: Add char32/char16 conversions to header, incl. optional extras... X-Git-Url: https://pd.if.org/git/?p=pdclib.old;a=commitdiff_plain;h=8a90fe871522665803dce65d11381ccbd30deb18 PDCLIB-2 PDCLIB-9: Add char32/char16 conversions to header, incl. optional extras providing string conversions (which will be used internally by the library to implement wide character conversions) Implement (as yet untested) ucs-4 conversions --- diff --git a/functions/uchar/_PDCLIB_c32srtombs.c b/functions/uchar/_PDCLIB_c32srtombs.c new file mode 100644 index 0000000..da80259 --- /dev/null +++ b/functions/uchar/_PDCLIB_c32srtombs.c @@ -0,0 +1,60 @@ +/* _PDCLIB_c32srtombs( + char *_PDCLIB_restrict dst, + const char32_t **_PDCLIB_restrict src, + size_t len, + mbstate_t *_PDCLIB_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 <_PDCLIB_encoding.h> +#include <_PDCLIB_locale.h> + +size_t _PDCLIB_c32srtombs_l( + char *restrict dst, + const char32_t **restrict src, + size_t len, + mbstate_t *restrict ps, + _PDCLIB_locale_t restrict l) +{ + char *restrict *restrict dstp = dst ? &dst : NULL; + len = dst ? len : SIZE_MAX; + + size_t srclen = _PDCLIB_c32slen(*src); + size_t dstlen = len; + + if(l->_Codec->__c32stombs(dstp, &dstlen, src, &srclen, ps)) { + // Successful conversion + return len - dstlen; + } else { + // Failed conversion + errno = EILSEQ; + return (size_t) -1; + } +} + +size_t _PDCLIB_c32srtombs( + char *restrict dst, + const char32_t **restrict src, + size_t len, + mbstate_t *restrict ps +) +{ + return _PDCLIB_c32srtombs_l(dst, src, len, ps, _PDCLIB_threadlocale()); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + return TEST_RESULTS; +} +#endif \ No newline at end of file diff --git a/functions/uchar/_PDCLIB_mbsrtoc32s.c b/functions/uchar/_PDCLIB_mbsrtoc32s.c new file mode 100644 index 0000000..0571e2c --- /dev/null +++ b/functions/uchar/_PDCLIB_mbsrtoc32s.c @@ -0,0 +1,59 @@ +/* _PDCLIB_mbsrtoc32s( + char32_t *restrict dst, + const char **restrict src, + size_t len, + 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 _PDCLIB_mbsrtoc32s_l +( + char32_t *restrict dst, + const char **restrict src, + size_t len, + mbstate_t *restrict ps, + locale_t restrict l +) +{ + size_t dstlen = len = dst ? len : SIZE_MAX; + char32_t *restrict *restrict dstp = dst ? &dst : NULL; + + size_t srclen = strlen(*src); + if(l->_Codec->__mbstoc32s(dstp, &dstlen, src, &srclen, ps)) { + return len - dstlen; + } else { + errno = EILSEQ; + return (size_t) -1; + } +} + +size_t _PDCLIB_mbsrtoc32s( + char32_t *restrict dst, + const char **restrict src, + size_t len, + mbstate_t *restrict ps +) +{ + return _PDCLIB_mbsrtoc32s_l(dst, src, len, ps, _PDCLIB_threadlocale()); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + return TEST_RESULTS; +} +#endif diff --git a/includes/uchar.h b/includes/uchar.h index 87b5aab..97210ca 100644 --- a/includes/uchar.h +++ b/includes/uchar.h @@ -37,4 +37,57 @@ typedef _PDCLIB_char32_t char32_t; #endif #endif -#endif \ No newline at end of file +size_t mbrtoc16( + char16_t *_PDCLIB_restrict pc16, + const char *_PDCLIB_restrict s, + size_t n, + mbstate_t *_PDCLIB_restrict ps); + +size_t c16rtomb( + char *_PDCLIB_restrict s, + char16_t c16, + mbstate_t *_PDCLIB_restrict ps); + +size_t mbrtoc32( + char32_t *_PDCLIB_restrict pc32, + const char *_PDCLIB_restrict s, + size_t n, + mbstate_t *_PDCLIB_restrict ps); + +size_t c32rtomb( + char *_PDCLIB_restrict s, + char32_t c32, + mbstate_t *_PDCLIB_restrict ps); + +#if defined(_PDCLIB_EXTENSIONS) +/* Analogous to strlen/wcslen */ +size_t _PDCLIB_c16slen(const char16_t * str); +size_t _PDCLIB_c32slen(const char32_t * str); + +/* String generalizations of the above functions */ +size_t _PDCLIB_mbsrtoc16s( + char16_t *_PDCLIB_restrict dst, + const char **_PDCLIB_restrict src, + size_t len, + mbstate_t *_PDCLIB_restrict ps); + +size_t _PDCLIB_mbsrtoc32s( + char32_t *_PDCLIB_restrict dst, + const char **_PDCLIB_restrict src, + size_t len, + mbstate_t *_PDCLIB_restrict ps); + +size_t _PDCLIB_c16srtombs( + char *_PDCLIB_restrict dst, + const char16_t **_PDCLIB_restrict src, + size_t len, + mbstate_t *_PDCLIB_restrict ps); + +size_t _PDCLIB_c32srtombs( + char *_PDCLIB_restrict dst, + const char32_t **_PDCLIB_restrict src, + size_t len, + mbstate_t *_PDCLIB_restrict ps); +#endif + +#endif diff --git a/internals/_PDCLIB_locale.h b/internals/_PDCLIB_locale.h new file mode 100644 index 0000000..bed89b5 --- /dev/null +++ b/internals/_PDCLIB_locale.h @@ -0,0 +1,12 @@ +#ifndef __PDCLIB_LOCALE_H +#define __PDCLIB_LOCALE_H __PDCLIB_LOCALE_H +#include + +#define _PDCLIB_threadlocale() (uselocale(NULL)) + +struct _PDCLIB_locale { + struct _PDCLIB_charcodec *_Codec; + struct lconv _Conv; +}; + +#endif