Mercurial > hg > octave-kai > gnulib-hg
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 |
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 } |