annotate lib/utf16-ucs4.h @ 4275:e272bc901785

New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
author Bruno Haible <bruno@clisp.org>
date Thu, 03 Apr 2003 18:35:07 +0000
parents
children a48fb0e98c8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4275
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Conversion UTF-16 to UCS-4.
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
2 Copyright (C) 2001-2002 Free Software Foundation, Inc.
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <haible@clisp.cons.org>, 2001.
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 any later version.
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program; if not, write to the Free Software
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 #include <stddef.h>
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 /* Return the length (number of units) of the first character in S, putting
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 its 'ucs4_t' representation in *PUC. */
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 static int
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 u16_mbtouc_aux (unsigned int *puc, const unsigned short *s, size_t n)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 unsigned short c = *s;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 if (c < 0xdc00)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 if (n >= 2)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 if (s[1] >= 0xdc00 && s[1] < 0xe000)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 return 2;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 }
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 /* invalid multibyte character */
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 }
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 else
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 /* incomplete multibyte character */
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 *puc = 0xfffd;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 return n;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 }
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 }
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 /* invalid multibyte character */
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 *puc = 0xfffd;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 return 1;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 }
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 static inline int
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 u16_mbtouc (unsigned int *puc, const unsigned short *s, size_t n)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 unsigned short c = *s;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 if (c < 0xd800 || c >= 0xe000)
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 {
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 *puc = c;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 return 1;
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 }
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 else
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 return u16_mbtouc_aux (puc, s, n);
e272bc901785 New modules: utf8-ucs4, utf16-ucs4, ucs4-utf8, ucs4-utf16.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 }