From 7886c839945ca476d45e5ef0228cae1c138c5a43 Mon Sep 17 00:00:00 2001 From: Owen Shepherd Date: Sun, 30 Dec 2012 20:32:19 +0000 Subject: [PATCH] PDCLIB-2 PDCLIB-12: Add new "basecodecs" option, which will provide ASCII/Latin-1/UTF-8 codecs. Add to the POSIX build. --- opt/basecodecs/_PDCLIB_ascii.c | 121 +++++++++++++++++++++++++++++++++ platform/posix/Config.jam | 2 +- 2 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 opt/basecodecs/_PDCLIB_ascii.c diff --git a/opt/basecodecs/_PDCLIB_ascii.c b/opt/basecodecs/_PDCLIB_ascii.c new file mode 100644 index 0000000..2036eb3 --- /dev/null +++ b/opt/basecodecs/_PDCLIB_ascii.c @@ -0,0 +1,121 @@ +/* ASCII codec + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#ifndef REGTEST +#include + +static bool asciitoc32( + char32_t **restrict p_outbuf, + size_t *restrict p_outsz, + const char **restrict p_inbuf, + size_t *restrict p_insz, + mbstate_t *restrict p_ps +) +{ + while(*p_outsz && *p_insz) { + unsigned char c = **p_inbuf; + if(c > 128) + return false; + **p_outbuf = c; + + (*p_inbuf)++; + (*p_outbuf)++; + (*p_insz)--; + (*p_outsz)--; + } + return true; +} + +static bool c32toascii( + char **restrict p_outbuf, + size_t *restrict p_outsz, + const char32_t **restrict p_inbuf, + size_t *restrict p_insz, + mbstate_t *restrict p_ps +) +{ + while(*p_outsz && *p_insz) { + char32_t c = **p_inbuf; + if(c > 128) + return false; + **p_outbuf = c; + + (*p_inbuf)++; + (*p_outbuf)++; + (*p_insz)--; + (*p_outsz)--; + } + return true; +} +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ +#ifndef REGTEST + // Valid conversion & back + + char32_t c32out[5]; + + char32_t *c32ptr = &c32out[0]; + size_t c32rem = 5; + char *chrptr = (char*) &abcde[0]; + size_t chrrem = 5; + mbstate_t mbs = { 0 }; + + TESTCASE(asciitoc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == true); + TESTCASE(c32rem == 0); + TESTCASE(chrrem == 0); + TESTCASE(c32ptr == &c32out[5]); + TESTCASE(chrptr == &abcde[5]); + TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && \ + c32out[3] == 'd' && c32out[4] == 'e'); + + char chrout[5]; + c32ptr = &c32out[0]; + c32rem = 5; + chrptr = &chrout[0]; + chrrem = 5; + + + TESTCASE(c32toascii(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == true); + TESTCASE(c32rem == 0); + TESTCASE(chrrem == 0); + TESTCASE(c32ptr == &c32out[5]); + TESTCASE(chrptr == &chrout[5]); + TESTCASE(memcmp(chrout, abcde, 5) == 0); + + // Invalid conversions + char badascii = '\xC0'; + c32ptr = &c32out[0]; + c32rem = 5; + chrptr = &badascii; + chrrem = 1; + TESTCASE(asciitoc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false); + TESTCASE(c32ptr == &c32out[0]); + TESTCASE(c32rem == 5); + TESTCASE(chrptr == &badascii); + TESTCASE(chrrem == 1); + + char32_t baduni = 0xC0; + c32ptr = &baduni; + c32rem = 1; + chrptr = &chrout[0]; + chrrem = 5; + TESTCASE(c32toascii(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == false); + TESTCASE(c32ptr == &baduni); + TESTCASE(c32rem == 1); + TESTCASE(chrptr == &chrout[0]); + TESTCASE(chrrem == 5); +#endif + return TEST_RESULTS; +} + +#endif + diff --git a/platform/posix/Config.jam b/platform/posix/Config.jam index 20fc4ad..4fb8cf5 100644 --- a/platform/posix/Config.jam +++ b/platform/posix/Config.jam @@ -11,4 +11,4 @@ if $(OS) = "MACOSX" { PDCLIB_TEST_LINKLIBS += -lgcc ; } -PDCLIB_OPTIONS = pthreads notime dlmalloc ; \ No newline at end of file +PDCLIB_OPTIONS = pthreads notime dlmalloc basecodecs ; \ No newline at end of file -- 2.40.0