Path: blob/master/waterbox/libc/functions/_PDCLIB/_PDCLIB_latin1.c
2 views
/* Latin-1 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 latin1_mbsinit( const mbstate_t *ps )12{ return 1; }1314static bool latin1toc32(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;2425if(p_outbuf) {26**p_outbuf = c;27(*p_outbuf)++;28}2930(*p_inbuf)++;31(*p_insz)--;32(*p_outsz)--;33}34return true;35}3637static bool c32tolatin1(38char *restrict *restrict p_outbuf,39size_t *restrict p_outsz,40const char32_t *restrict *restrict p_inbuf,41size_t *restrict p_insz,42mbstate_t *restrict p_ps43)44{45while(*p_outsz && *p_insz) {46char32_t c = **p_inbuf;47if(c > 255)48return false;4950if(p_outbuf) {51**p_outbuf = c;52(*p_outbuf)++;53}5455(*p_inbuf)++;56(*p_insz)--;57(*p_outsz)--;58}59return true;60}6162const struct _PDCLIB_charcodec_t _PDCLIB_latin1_codec = {63.__mbsinit = latin1_mbsinit,64.__mbstoc32s = latin1toc32,65.__c32stombs = c32tolatin1,66.__mb_max = 1,67};6869#endif7071#ifdef TEST72#include "_PDCLIB_test.h"7374int main( void )75{76#ifndef REGTEST77// Valid conversion & back7879char32_t c32out[5];8081char32_t *c32ptr = &c32out[0];82size_t c32rem = 5;83char *chrptr = (char*) &abcde[0];84size_t chrrem = 5;85mbstate_t mbs = { 0 };8687TESTCASE(latin1toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == true);88TESTCASE(c32rem == 0);89TESTCASE(chrrem == 0);90TESTCASE(c32ptr == &c32out[5]);91TESTCASE(chrptr == &abcde[5]);92TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && \93c32out[3] == 'd' && c32out[4] == 'e');9495char chrout[5];96c32ptr = &c32out[0];97c32rem = 5;98chrptr = &chrout[0];99chrrem = 5;100101102TESTCASE(c32tolatin1(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == true);103TESTCASE(c32rem == 0);104TESTCASE(chrrem == 0);105TESTCASE(c32ptr == &c32out[5]);106TESTCASE(chrptr == &chrout[5]);107TESTCASE(memcmp(chrout, abcde, 5) == 0);108109// Invalid conversions110char32_t baduni = 0xFFFE;111c32ptr = &baduni;112c32rem = 1;113chrptr = &chrout[0];114chrrem = 5;115TESTCASE(c32tolatin1(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == false);116TESTCASE(c32ptr == &baduni);117TESTCASE(c32rem == 1);118TESTCASE(chrptr == &chrout[0]);119TESTCASE(chrrem == 5);120#endif121return TEST_RESULTS;122}123124#endif125126127128