source: trunk/third/perl/utf8.h @ 17035

Revision 17035, 4.7 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17034, which included commits to RCS files with non-trunk default branches.
Line 
1/*    utf8.h
2 *
3 *    Copyright (c) 1998-2001, Larry Wall
4 *
5 *    You may distribute under the terms of either the GNU General Public
6 *    License or the Artistic License, as specified in the README file.
7 *
8 */
9
10START_EXTERN_C
11
12#ifdef DOINIT
13EXTCONST unsigned char PL_utf8skip[] = {
141,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
151,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
161,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
171,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
181,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
191,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, /* scripts */
213,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,     /* cjk etc. */
227,13, /* Perl extended (not UTF-8).  Up to 72bit allowed (64-bit + reserved). */
23};
24#else
25EXTCONST unsigned char PL_utf8skip[];
26#endif
27
28END_EXTERN_C
29
30#define UTF8_MAXLEN 13 /* how wide can a single UTF8 encoded character become */
31
32/* #define IN_UTF8 (PL_curcop->op_private & HINT_UTF8) */
33#define IN_BYTE (PL_curcop->op_private & HINT_BYTE)
34#define DO_UTF8(sv) (SvUTF8(sv) && !IN_BYTE)
35
36#define UTF8_ALLOW_EMPTY                0x0001
37#define UTF8_ALLOW_CONTINUATION         0x0002
38#define UTF8_ALLOW_NON_CONTINUATION     0x0004
39#define UTF8_ALLOW_FE_FF                0x0008
40#define UTF8_ALLOW_SHORT                0x0010
41#define UTF8_ALLOW_SURROGATE            0x0020
42#define UTF8_ALLOW_BOM                  0x0040
43#define UTF8_ALLOW_FFFF                 0x0080
44#define UTF8_ALLOW_LONG                 0x0100
45#define UTF8_ALLOW_ANYUV                (UTF8_ALLOW_EMPTY|UTF8_ALLOW_FE_FF|\
46                                         UTF8_ALLOW_SURROGATE|UTF8_ALLOW_BOM|\
47                                         UTF8_ALLOW_FFFF|UTF8_ALLOW_LONG)
48#define UTF8_ALLOW_ANY                  0x00ff
49#define UTF8_CHECK_ONLY                 0x0100
50
51#define UNICODE_SURROGATE_FIRST         0xd800
52#define UNICODE_SURROGATE_LAST          0xdfff
53#define UNICODE_REPLACEMENT             0xfffd
54#define UNICODE_BYTER_ORDER_MARK        0xfffe
55#define UNICODE_ILLEGAL                 0xffff
56
57#define UNICODE_IS_SURROGATE(c)         ((c) >= UNICODE_SURROGATE_FIRST && \
58                                         (c) <= UNICODE_SURROGATE_LAST)
59#define UNICODE_IS_REPLACEMENT(c)       ((c) == UNICODE_REPLACMENT)
60#define UNICODE_IS_BYTE_ORDER_MARK(c)   ((c) == UNICODE_BYTER_ORDER_MARK)
61#define UNICODE_IS_ILLEGAL(c)           ((c) == UNICODE_ILLEGAL)
62
63#define UTF8SKIP(s) PL_utf8skip[*(U8*)s]
64
65#define UTF8_QUAD_MAX   UINT64_C(0x1000000000)
66
67/*
68 
69 The following table is from Unicode 3.1.
70
71 Code Points            1st Byte  2nd Byte  3rd Byte  4th Byte
72
73   U+0000..U+007F       00..7F   
74   U+0080..U+07FF       C2..DF    80..BF   
75   U+0800..U+0FFF       E0        A0..BF    80..BF  
76   U+1000..U+FFFF       E1..EF    80..BF    80..BF  
77  U+10000..U+3FFFF      F0        90..BF    80..BF    80..BF
78  U+40000..U+FFFFF      F1..F3    80..BF    80..BF    80..BF
79 U+100000..U+10FFFF     F4        80..8F    80..BF    80..BF
80
81 */
82
83#define UTF8_IS_ASCII(c)                (((U8)c) <  0x80)
84#define UTF8_IS_START(c)                (((U8)c) >= 0xc0 && (((U8)c) <= 0xfd))
85#define UTF8_IS_CONTINUATION(c)         (((U8)c) >= 0x80 && (((U8)c) <= 0xbf))
86#define UTF8_IS_CONTINUED(c)            (((U8)c) &  0x80)
87#define UTF8_IS_DOWNGRADEABLE_START(c)  (((U8)c & 0xfc) != 0xc0)
88
89#define UTF8_CONTINUATION_MASK          ((U8)0x3f)
90#define UTF8_ACCUMULATION_SHIFT         6
91#define UTF8_ACCUMULATE(old, new)       (((old) << UTF8_ACCUMULATION_SHIFT) | (((U8)new) & UTF8_CONTINUATION_MASK))
92
93#define UTF8_EIGHT_BIT_HI(c)    ( (((U8)(c))>>6)      |0xc0)
94#define UTF8_EIGHT_BIT_LO(c)    (((((U8)(c))   )&0x3f)|0x80)
95
96#ifdef HAS_QUAD
97#define UNISKIP(uv) ( (uv) < 0x80           ? 1 : \
98                      (uv) < 0x800          ? 2 : \
99                      (uv) < 0x10000        ? 3 : \
100                      (uv) < 0x200000       ? 4 : \
101                      (uv) < 0x4000000      ? 5 : \
102                      (uv) < 0x80000000     ? 6 : \
103                      (uv) < UTF8_QUAD_MAX ? 7 : 13 )
104#else
105/* No, I'm not even going to *TRY* putting #ifdef inside a #define */
106#define UNISKIP(uv) ( (uv) < 0x80           ? 1 : \
107                      (uv) < 0x800          ? 2 : \
108                      (uv) < 0x10000        ? 3 : \
109                      (uv) < 0x200000       ? 4 : \
110                      (uv) < 0x4000000      ? 5 : \
111                      (uv) < 0x80000000     ? 6 : 7 )
112#endif
113
114
115/*
116 * Note: we try to be careful never to call the isXXX_utf8() functions
117 * unless we're pretty sure we've seen the beginning of a UTF-8 character
118 * (that is, the two high bits are set).  Otherwise we risk loading in the
119 * heavy-duty SWASHINIT and SWASHGET routines unnecessarily.
120 */
121#ifdef EBCDIC
122#define isIDFIRST_lazy_if(p,c) isIDFIRST(*(p))
123#define isALNUM_lazy_if(p,c)   isALNUM(*(p))
124#else
125#define isIDFIRST_lazy_if(p,c) ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
126                                ? isIDFIRST(*(p)) \
127                                : isIDFIRST_utf8((U8*)p))
128#define isALNUM_lazy_if(p,c)   ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
129                                ? isALNUM(*(p)) \
130                                : isALNUM_utf8((U8*)p))
131#endif
132#define isIDFIRST_lazy(p)       isIDFIRST_lazy_if(p,1)
133#define isALNUM_lazy(p)         isALNUM_lazy_if(p,1)
Note: See TracBrowser for help on using the repository browser.