annotate uptools/libcoding/utf8_decode2.c @ 960:411d1cc14326

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