]> pd.if.org Git - pdclib.old/blob - opt/basecodecs/_PDCLIB_latin1.c
73844f417b6aa32587cf5f1e03346d6330d0e0e1
[pdclib.old] / opt / basecodecs / _PDCLIB_latin1.c
1 /* Latin-1 codec
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 #include <stdbool.h>
8 #ifndef REGTEST
9 #include <uchar.h>
10
11 static bool latin1toc32(
12     char32_t       **restrict   p_outbuf,
13     size_t          *restrict   p_outsz,
14     const char     **restrict   p_inbuf,
15     size_t          *restrict   p_insz,
16     mbstate_t       *restrict   p_ps
17 )
18 {
19     while(*p_outsz && *p_insz) {
20         unsigned char c = **p_inbuf;
21         **p_outbuf = c;
22
23         (*p_inbuf)++;
24         (*p_outbuf)++; 
25         (*p_insz)--; 
26         (*p_outsz)--;
27     }
28     return true;
29 }
30
31 static bool c32tolatin1(
32     char           **restrict  p_outbuf,
33     size_t          *restrict  p_outsz,
34     const char32_t **restrict  p_inbuf,
35     size_t          *restrict  p_insz,
36     mbstate_t       *restrict  p_ps
37 )
38 {
39     while(*p_outsz && *p_insz) {
40         char32_t c = **p_inbuf;
41         if(c > 255)
42             return false;
43         **p_outbuf = c;
44
45         (*p_inbuf)++;
46         (*p_outbuf)++; 
47         (*p_insz)--; 
48         (*p_outsz)--;        
49     }
50     return true;
51 }
52 #endif
53
54 #ifdef TEST
55 #include <_PDCLIB_test.h>
56
57 int main( void )
58 {
59 #ifndef REGTEST
60     // Valid conversion & back
61
62     char32_t c32out[5];
63
64     char32_t *c32ptr = &c32out[0];
65     size_t    c32rem = 5;
66     char     *chrptr = (char*) &abcde[0];
67     size_t    chrrem = 5;
68     mbstate_t mbs = { 0 };
69
70     TESTCASE(latin1toc32(&c32ptr, &c32rem, &chrptr, &chrrem, &mbs) == true);
71     TESTCASE(c32rem == 0);
72     TESTCASE(chrrem == 0);
73     TESTCASE(c32ptr == &c32out[5]);
74     TESTCASE(chrptr == &abcde[5]);
75     TESTCASE(c32out[0] == 'a' && c32out[1] == 'b' && c32out[2] == 'c' && \
76              c32out[3] == 'd' && c32out[4] == 'e');
77
78     char chrout[5];
79     c32ptr = &c32out[0];
80     c32rem = 5;
81     chrptr = &chrout[0];
82     chrrem = 5;
83
84
85     TESTCASE(c32tolatin1(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == true);
86     TESTCASE(c32rem == 0);
87     TESTCASE(chrrem == 0);
88     TESTCASE(c32ptr == &c32out[5]);
89     TESTCASE(chrptr == &chrout[5]);
90     TESTCASE(memcmp(chrout, abcde, 5) == 0);
91
92     // Invalid conversions
93     char32_t baduni = 0xFFFE;
94     c32ptr = &baduni;
95     c32rem = 1;
96     chrptr = &chrout[0];
97     chrrem = 5;
98     TESTCASE(c32tolatin1(&chrptr, &chrrem, &c32ptr, &c32rem, &mbs) == false);
99     TESTCASE(c32ptr == &baduni);
100     TESTCASE(c32rem == 1);
101     TESTCASE(chrptr == &chrout[0]);
102     TESTCASE(chrrem == 5);
103 #endif
104     return TEST_RESULTS;
105 }
106
107 #endif
108