annotate uptools/libcoding/ucs2_decode.c @ 783:c136a1a2474b

simagent: initial implementation of APDU exchange
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 13 Mar 2021 22:06:08 +0000
parents 978571e23318
children 1c599681fd60
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
328
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This library module implements the conversion of UCS2-encoded data
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * (typically received in SMS) into ASCII, ISO 8859-1 or UTF-8,
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * maintaining parallelism with the corresponding function for decoding
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * GSM7-encoded data.
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 */
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <sys/types.h>
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 ucs2_to_ascii_or_ext(inbuf, inlen, outbuf, outlenp, ascii_ext, newline_ok, errp)
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 u_char *inbuf, *outbuf;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 unsigned inlen, *outlenp, *errp;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 {
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 u_char *inp, *endp, *outp;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 unsigned errcnt = 0;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 unsigned uni;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 inp = inbuf;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 endp = inbuf + (inlen & ~1);
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 outp = outbuf;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 while (inp < endp) {
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 uni = (inp[0] << 8) | inp[1];
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 inp += 2;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 if (uni == '\r') {
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *outp++ = '\\';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *outp++ = 'r';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 errcnt++;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 } else if (uni == '\n') {
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 if (newline_ok)
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 *outp++ = '\n';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 else {
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 *outp++ = '\\';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 *outp++ = 'n';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 errcnt++;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 }
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 } else if (!is_decoded_char_ok(uni, ascii_ext)) {
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 *outp++ = '?';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 errcnt++;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 } else if (ascii_ext == 2)
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 outp += emit_utf8_char(uni, outp);
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 else
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 *outp++ = uni;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 }
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 *outp = '\0';
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 if (outlenp)
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 *outlenp = outp - outbuf;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 if (errp)
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 *errp = errcnt;
978571e23318 uptools started with libcoding
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 }