source: icXML/icXML-devel/src/icxmlc/XMLNameChars.hpp @ 2720

Last change on this file since 2720 was 2720, checked in by cameron, 6 years ago

Initial check-in of icXML 0.8 source files

File size: 6.7 KB
Line 
1/* namechars.h - Bitset maps for name characters.
2    Copyright (c) 2008, 2010 Robert D. Cameron.
3    Licensed to the public under the Open Software License 3.0.
4    Licensed to International Characters, Inc., under the Academic
5    Free License 3.0.
6   
7    This is a generated file using xml_chars.py.  Do not edit.
8   
9    The XML10 maps apply to XML 1.0 4th edition and prior.
10    The XML11 maps apply to XML 1.1 and the proposed XML 1.0 5th edition.
11
12*/
13#ifndef NAMECHARS_H
14#define NAMECHARS_H
15
16#include <icxmlc/XMLConfig.hpp>
17
18XERCES_CPP_NAMESPACE_BEGIN
19
20static const uint8_t NAME_START_0000_03FF[] = {
21    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
22    0x7F, 0xFF, 0xFF, 0xE1, 0x7F, 0xFF, 0xFF, 0xE0,
23    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24    0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,
25    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
26    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
27    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
28    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
29    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
30    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
31    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
32    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
33    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD,
35    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
36    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
37
38static const uint8_t NAME_CHAR_0000_03FF[] = {
39    0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xE0,
40    0x7F, 0xFF, 0xFF, 0xE1, 0x7F, 0xFF, 0xFF, 0xE0,
41    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
42    0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF,
43    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
44    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
45    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
46    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
47    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
48    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
49    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
50    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
51    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
52    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
53    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
54    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
55
56class XMLNameChar
57{
58private:
59
60    /*  Is a given codepoint a legal NameStart character in XML 1.0 5e or XML 1.1? */
61    static inline bool isNameStart(const XMLCh codepoint)
62    {
63        if (likely(codepoint) <= 0x03FF)
64        {
65            return bit_test(NAME_START_0000_03FF, codepoint);
66        }
67        else
68        {
69            switch (codepoint >> 12)
70            {
71                case 0: case 1:
72                    return true;
73                case 2:
74                    if (codepoint >= 0x2070)
75                    {
76                        return (codepoint <= 0x218F) || ((codepoint >= 0x2C00) & (codepoint <= 0x2FEF));
77                    }
78                    else
79                    {
80                        return (codepoint >= 0x200C) & (codepoint <= 0x200D);
81                    }
82                case 3:
83                    return (codepoint >= 0x3001);
84                case 4: case 5: case 6: case 7: case 8: case 9: case 0xA: case 0xB: case 0xC:
85                    return true;
86                case 0xD:
87                    return codepoint <= 0xD7FF;
88                case 0xE:
89                    return false;
90                case 0xF:
91                    if (codepoint <= 0xFDCF)
92                        return (codepoint >= 0xF900);
93                    else
94                        return (codepoint >= 0xFDF0) & (codepoint <= 0xFFFD);
95//                default:
96//                    return codepoint <= 0xEFFFF;
97            }
98        }
99    }
100
101    /*  Is a given codepoint a legal Name character in XML 1.0 5e or XML 1.1? */
102    static inline bool isNameChar(const XMLCh codepoint)
103    {
104        if (likely(codepoint) <= 0x03FF)
105        {
106            return bit_test(NAME_CHAR_0000_03FF, codepoint);
107        }
108        else
109        {
110            switch (codepoint >> 12)
111            {
112                case 0: case 1:
113                    return true;
114                case 2:
115                    if (codepoint >= 0x2070)
116                    {
117                        return (codepoint <= 0x218F) || ((codepoint >= 0x2C00) & (codepoint <= 0x2FEF));
118                    }
119                    else if (codepoint <= 0x200D)
120                    {
121                        return codepoint >= 0x200C;
122                    }
123                    else
124                    {
125                        return (codepoint == 0x203F) | (codepoint == 0x2040);
126                    }
127                case 3:
128                    return (codepoint >= 0x3001);
129                case 4: case 5: case 6: case 7: case 8: case 9: case 0xA: case 0xB: case 0xC:
130                    return true;
131                case 0xD:
132                    return (codepoint <= 0xD7FF);
133                case 0xE:
134                    return false;
135                case 0xF:
136                    if (codepoint <= 0xFDCF)
137                        return (codepoint >= 0xF900);
138                    else
139                        return (codepoint >= 0xFDF0) & (codepoint <= 0xFFFD);
140//                default:
141//                    return codepoint <= 0xEFFFF;
142            }
143        }
144    }
145
146
147    IDISA_ALWAYS_INLINE
148    static bool bit_test(const uint8_t MAP[256], const XMLCh codepoint)
149    {
150        // invert the col order to eliminate the need for (7 - x)?
151        return (MAP[codepoint >> 3] >> (7 - (codepoint & 7))) & 1;
152    }
153
154public:
155
156    static inline bool test(const XMLCh * nameString, const XMLSize_t length)
157    {
158        XMLSize_t i = 0;
159        // test the start char
160        if (unlikely((nameString[i] >= 0xD800) && (nameString[i] <= 0xDB7F)))
161        {
162            // lead surrogate character found; the trailing character is skipped since the resultant codepoint is legal in XML 1.0/1.1
163            i = 2;
164        }
165        else
166        {
167            if (unlikely(!isNameStart(nameString[i])))
168            {
169                return 0;
170            }
171            i = 1;
172        }
173
174        // test the remaining characters
175        while (i < length)
176        {
177            if (unlikely((nameString[i] >= 0xD800) && (nameString[i] <= 0xDB7F)))
178            {
179                // lead surrogate character found; the trailing character is skipped since the resultant codepoint is legal in XML 1.0/1.1
180                i += 2;
181            }
182            else
183            {
184                if (unlikely(!isNameChar(nameString[i])))
185                {
186                    return 0;
187                }
188                i += 1;
189            }
190        }
191
192
193        return 1;
194    }
195
196};
197
198XERCES_CPP_NAMESPACE_END
199
200#endif
Note: See TracBrowser for help on using the repository browser.