annotate libcoding/utf8_decode2.c @ 0:2d0082216916

libcoding: beginning with a subset of uptools version
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 05 Aug 2023 00:46:23 +0000
parents
children e56bb9f09ff1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This library module implements the function for converting UTF-8 input
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * to UCS-2 in outgoing SMS composition.
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 */
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <sys/types.h>
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 utf8_to_ucs2(inbuf, outbuf, outmax, outlenp)
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 u_char *inbuf;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 u_short *outbuf;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 unsigned outmax, *outlenp;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 {
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 u_char *ip = inbuf;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 u_short *op = outbuf;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 unsigned outcnt = 0, c, n, uni;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 while (c = *ip++) {
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 if (c < 0x80) {
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 uni = c;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 goto gotuni;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 }
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 if (c < 0xC0 || c > 0xEF)
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 return(-1);
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 uni = c & 0x1F;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 if (c >= 0xE0)
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 n = 2;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 else
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 n = 1;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 for (; n; n--) {
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 c = *ip++;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 if (c < 0x80 || c > 0xBF)
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 return(-1);
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 uni <<= 6;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 uni |= c & 0x3F;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 }
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 gotuni: if (outcnt >= outmax)
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 return(-2);
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 *op++ = uni;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 outcnt++;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 }
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 *outlenp = outcnt;
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 return(0);
2d0082216916 libcoding: beginning with a subset of uptools version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 }