Path: blob/master/waterbox/libc/functions/_PDCLIB/_PDCLIB_ascii.c
2 views
/* ASCII codec12This file is part of the Public Domain C Library (PDCLib).3Permission is granted to use, modify, and / or redistribute at will.4*/56#include <stdbool.h>7#ifndef REGTEST8#include <uchar.h>9#include "_PDCLIB_encoding.h"1011static bool ascii_mbsinit( const mbstate_t *ps )12{ return 1; }1314static bool asciitoc32(15char32_t *restrict *restrict p_outbuf,16size_t *restrict p_outsz,17const char *restrict *restrict p_inbuf,18size_t *restrict p_insz,19mbstate_t *restrict p_ps20)21{22while(*p_outsz && *p_insz) {23unsigned char c = **p_inbuf;24if(c > 127)25return false;2627if(p_outbuf) {28**p_outbuf = c;29(*p_outbuf)++;30}3132(*p_inbuf)++;33(*p_insz)--;34(*p_outsz)--;35}36return true;37}3839static bool c32toascii(40char *restrict *restrict p_outbuf,41size_t *restrict p_outsz,42const char32_t *restrict *restrict p_inbuf,43size_t *restrict p_insz,44mbstate_t *restrict p_ps45)46{47while(*p_outsz && *p_insz) {48char32_t c = **p_inbuf;49if(c > 127)50return false;5152if(p_outbuf) {53**p_outbuf = c;54(*p_outbuf)++;55}5657(*p_inbuf)++;58(*p_insz)--;59(*p_outsz)--;60}61return true;62}6364const struct _PDCLIB_charcodec_t _PDCLIB_ascii_codec = {65.__mbsinit = ascii_mbsinit,66.__mbstoc32s = asciitoc32,67.__c32stombs = c32toascii,68.__mb_max = 1,69};7071#endif7273#ifdef TEST74#include "_PDCLIB_test.h"7576int main( void )77{78#ifndef REGTEST79// Valid conversion & back8081char32_t c32out[5];8283char32_t *c32ptr = &c32out[0];84size_t c32rem = 5;85char *chrptr = (char*) &abcde[0];86size_t chrrem = 5;87mbstate_t mbs = { 0 };8889TESTCASE(asciitoc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == true);90TESTCASE(c32rem == 0);91TESTCASE(chrrem == 0);92TESTCASE(c32ptr == &c32out[5]);93TESTCASE(chrptr == &abcde[5]);94TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && \95c32out[3] == 'd' && c32out[4] == 'e');9697char chrout[5];98c32ptr = &c32out[0];99c32rem = 5;100chrptr = &chrout[0];101chrrem = 5;102103104TESTCASE(c32toascii(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == true);105TESTCASE(c32rem == 0);106TESTCASE(chrrem == 0);107TESTCASE(c32ptr == &c32out[5]);108TESTCASE(chrptr == &chrout[5]);109TESTCASE(memcmp(chrout, abcde, 5) == 0);110111// Invalid conversions112char badascii = '\xC0';113c32ptr = &c32out[0];114c32rem = 5;115chrptr = &badascii;116chrrem = 1;117TESTCASE(asciitoc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == false);118TESTCASE(c32ptr == &c32out[0]);119TESTCASE(c32rem == 5);120TESTCASE(chrptr == &badascii);121TESTCASE(chrrem == 1);122123char32_t baduni = 0xC0;124c32ptr = &baduni;125c32rem = 1;126chrptr = &chrout[0];127chrrem = 5;128TESTCASE(c32toascii(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == false);129TESTCASE(c32ptr == &baduni);130TESTCASE(c32rem == 1);131TESTCASE(chrptr == &chrout[0]);132TESTCASE(chrrem == 5);133#endif134return TEST_RESULTS;135}136137#endif138139140141