source: icXML/icXML-devel/src/icxercesc/util/XMLChar.hpp

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

A few more updates missing from the last check-in

File size: 12.9 KB
Line 
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * $Id: XMLChar.hpp 932887 2010-04-11 13:04:59Z borisk $
20 */
21
22#if !defined(XERCESC_INCLUDE_GUARD_XMLCHAR_HPP)
23#define XERCESC_INCLUDE_GUARD_XMLCHAR_HPP
24
25#include <xercesc/util/XMLUniDefs.hpp>
26#include <icxmlc/XMLNameChars.hpp>
27
28XERCES_CPP_NAMESPACE_BEGIN
29
30// ---------------------------------------------------------------------------
31//  This file defines Char and utility that conforms to XML 1.0 and XML 1.1
32// ---------------------------------------------------------------------------
33// Masks for the fgCharCharsTable1_0 array
34const XMLByte   gNCNameCharMask             = 0x1;
35const XMLByte   gFirstNameCharMask          = 0x2;
36const XMLByte   gNameCharMask               = 0x4;
37const XMLByte   gPlainContentCharMask       = 0x8;
38const XMLByte   gSpecialStartTagCharMask    = 0x10;
39const XMLByte   gControlCharMask            = 0x20;
40const XMLByte   gXMLCharMask                = 0x40;
41const XMLByte   gWhitespaceCharMask         = 0x80;
42
43// ---------------------------------------------------------------------------
44//  This class is for XML 1.0
45// ---------------------------------------------------------------------------
46class XMLUTIL_EXPORT XMLChar1_0
47{
48public:
49    // -----------------------------------------------------------------------
50    //  Public, static methods, check the string
51    // -----------------------------------------------------------------------
52    static bool isAllSpaces
53    (
54        const   XMLCh* const    toCheck
55        , const XMLSize_t       count
56    );
57
58    static bool containsWhiteSpace
59    (
60        const   XMLCh* const    toCheck
61        , const XMLSize_t       count
62    );
63
64    static bool isValidNmtoken
65    (
66        const   XMLCh*        const    toCheck
67      , const   XMLSize_t              count
68    );
69
70    static bool isValidName
71    (
72        const   XMLCh* const    toCheck
73        , const XMLSize_t       count
74    );
75
76    static bool isValidName
77    (
78        const   XMLCh* const    toCheck
79    );
80
81    static bool isValidNCName
82    (
83        const   XMLCh* const    toCheck
84        , const XMLSize_t       count
85    );
86
87    static bool isValidQName
88    (
89        const   XMLCh* const    toCheck
90        , const XMLSize_t       count
91    );
92
93    // -----------------------------------------------------------------------
94    //  Public, static methods, check the XMLCh
95    //  surrogate pair is assumed if second parameter is not null
96    // -----------------------------------------------------------------------
97    static bool isXMLLetter(const XMLCh toCheck, const XMLCh toCheck2 = 0);
98    static bool isFirstNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
99    static bool isNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
100    static bool isPlainContentChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
101    static bool isSpecialStartTagChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
102    static bool isXMLChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
103    static bool isWhitespace(const XMLCh toCheck);
104    static bool isWhitespace(const XMLCh toCheck, const XMLCh toCheck2);
105    static bool isControlChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
106
107    static bool isPublicIdChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
108    static bool isFirstNCNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
109    static bool isNCNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
110
111    // -----------------------------------------------------------------------
112    //  Special Non-conformant Public, static methods
113    // -----------------------------------------------------------------------
114    /**
115      * Return true if NEL (0x85) and LSEP (0x2028) to be treated as white space char.
116      */
117    static bool isNELRecognized();
118
119    /**
120      * Method to enable NEL (0x85) and LSEP (0x2028) to be treated as white space char.
121      */
122    static void enableNELWS();
123
124private:
125    // -----------------------------------------------------------------------
126    //  Unimplemented constructors and operators
127    // -----------------------------------------------------------------------
128    XMLChar1_0();
129
130    static bool isSurrogate(const XMLCh toCheck, const XMLCh toCheck2);
131
132    // -----------------------------------------------------------------------
133    //  Static data members
134    //
135    //  fNEL
136    //      Flag to represents whether NEL and LSEP newline recognition is enabled
137    //      or disabled
138    // -----------------------------------------------------------------------
139    static XMLByte fgCharCharsTable1_0[1];
140    static bool enableNEL;
141
142    friend class XMLReader;
143};
144
145
146// ---------------------------------------------------------------------------
147//  XMLReader: Public, static methods
148// ---------------------------------------------------------------------------
149inline bool XMLChar1_0::isXMLLetter(const XMLCh toCheck, const XMLCh toCheck2)
150{
151    // An XML letter is a FirstNameChar minus ':' and '_'.
152    if (toCheck2 == 0)
153    {
154        return XMLNameChar::isNameStart(toCheck) && (toCheck != chColon) && (toCheck != chUnderscore);
155    }
156    return false;
157}
158
159inline bool XMLChar1_0::isFirstNameChar(const XMLCh toCheck, const XMLCh toCheck2)
160{
161    if (likely(toCheck2 == 0))
162    {
163        return XMLNameChar::isNameStart(toCheck);
164    }
165    else
166    {
167        return isSurrogate(toCheck, toCheck2);
168    }
169}
170
171inline bool XMLChar1_0::isFirstNCNameChar(const XMLCh toCheck, const XMLCh toCheck2)
172{
173    if (likely(toCheck2 == 0))
174    {
175        return XMLNameChar::isNameStart(toCheck) && (toCheck != chColon);
176    }
177    else
178    {
179        return isSurrogate(toCheck, toCheck2);
180    }
181}
182
183inline bool XMLChar1_0::isNameChar(const XMLCh toCheck, const XMLCh toCheck2)
184{
185    if (likely(toCheck2 == 0))
186    {
187        return XMLNameChar::isNameChar(toCheck);
188    }
189    else
190    {
191        return isSurrogate(toCheck, toCheck2);
192    }
193}
194
195inline bool XMLChar1_0::isNCNameChar(const XMLCh toCheck, const XMLCh toCheck2)
196{
197    if (likely(toCheck2 == 0))
198    {
199        return XMLNameChar::isNameChar(toCheck) && (toCheck != chColon);
200    }
201    else
202    {
203        return isSurrogate(toCheck, toCheck2);
204    }
205}
206
207inline bool XMLChar1_0::isPlainContentChar(const XMLCh, const XMLCh)
208{
209    DEPRECATED_FEATURE_IN_ICXML;
210}
211
212
213inline bool XMLChar1_0::isSpecialStartTagChar(const XMLCh, const XMLCh)
214{
215    DEPRECATED_FEATURE_IN_ICXML;
216}
217
218inline bool XMLChar1_0::isXMLChar(const XMLCh toCheck, const XMLCh toCheck2)
219{
220    if (likely(toCheck2 == 0))
221    {
222        return XMLNameChar::isXMLChar(toCheck, true);
223    }
224    else
225    {
226        return isSurrogate(toCheck, toCheck2);
227    }
228}
229
230inline bool XMLChar1_0::isWhitespace(const XMLCh toCheck)
231{
232    return XMLNameChar::isWhitespace(toCheck, !enableNEL);
233}
234
235inline bool XMLChar1_0::isWhitespace(const XMLCh toCheck, const XMLCh toCheck2)
236{
237    if (likely(toCheck2 == 0))
238    {
239        return XMLNameChar::isWhitespace(toCheck, !enableNEL);
240    }
241    return false;
242}
243
244inline bool XMLChar1_0::isControlChar(const XMLCh toCheck, const XMLCh toCheck2)
245{
246    if (likely(toCheck2 == 0))
247    {
248        return (toCheck < 0x20) && XMLNameChar::isXMLChar(toCheck, true);
249    }
250    return false;
251}
252
253inline bool XMLChar1_0::isNELRecognized() {
254
255    return enableNEL;
256}
257
258inline bool XMLChar1_0::isSurrogate(const XMLCh toCheck, const XMLCh toCheck2)
259{
260    if ((toCheck >= 0xD800) && (toCheck <= 0xDB7F))
261    {
262        if (unlikely((toCheck2 < 0xDC00) || (toCheck2 > 0xDFFF)))
263        {
264            return 0;
265        }
266        return 1;
267    }
268    return 0;
269}
270
271// ---------------------------------------------------------------------------
272//  This class is for XML 1.1
273// ---------------------------------------------------------------------------
274class XMLUTIL_EXPORT XMLChar1_1
275{
276public:
277    // -----------------------------------------------------------------------
278    //  Public, static methods, check the string
279    // -----------------------------------------------------------------------
280    static bool isAllSpaces
281    (
282        const   XMLCh* const    toCheck
283        , const XMLSize_t       count
284    );
285
286    static bool containsWhiteSpace
287    (
288        const   XMLCh* const    toCheck
289        , const XMLSize_t       count
290    );
291
292    static bool isValidNmtoken
293    (
294        const   XMLCh*        const    toCheck
295      , const   XMLSize_t              count
296    );
297
298    static bool isValidName
299    (
300        const   XMLCh* const    toCheck
301        , const XMLSize_t       count
302    );
303
304    static bool isValidName
305    (
306        const   XMLCh* const    toCheck
307    );
308
309    static bool isValidNCName
310    (
311        const   XMLCh* const    toCheck
312        , const XMLSize_t       count
313    );
314
315    static bool isValidQName
316    (
317        const   XMLCh* const    toCheck
318        , const XMLSize_t       count
319    );
320
321    // -----------------------------------------------------------------------
322    //  Public, static methods, check the XMLCh
323    // -----------------------------------------------------------------------
324    static bool isXMLLetter(const XMLCh toCheck, const XMLCh toCheck2 = 0);
325    static bool isFirstNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
326    static bool isNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
327    static bool isPlainContentChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
328    static bool isSpecialStartTagChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
329    static bool isXMLChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
330    static bool isWhitespace(const XMLCh toCheck, const XMLCh toCheck2 = 0);
331    static bool isControlChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
332
333    static bool isPublicIdChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
334    static bool isFirstNCNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
335    static bool isNCNameChar(const XMLCh toCheck, const XMLCh toCheck2 = 0);
336
337private:
338    // -----------------------------------------------------------------------
339    //  Unimplemented constructors and operators
340    // -----------------------------------------------------------------------
341    XMLChar1_1();
342
343    static XMLByte fgCharCharsTable1_1[1];
344
345    static bool isSurrogate(const XMLCh toCheck, const XMLCh toCheck2);
346
347    friend class XMLReader;
348};
349
350
351// ---------------------------------------------------------------------------
352//  XMLReader: Public, static methods
353// ---------------------------------------------------------------------------
354inline bool XMLChar1_1::isXMLLetter(const XMLCh toCheck, const XMLCh toCheck2)
355{
356    /** XML 1.1 does not define a letter, so we use the 1.0 definition */
357    return XMLChar1_0::isXMLLetter(toCheck, toCheck2);
358}
359
360inline bool XMLChar1_1::isFirstNameChar(const XMLCh toCheck, const XMLCh toCheck2)
361{
362    return XMLChar1_0::isFirstNameChar(toCheck, toCheck2);
363}
364
365inline bool XMLChar1_1::isFirstNCNameChar(const XMLCh toCheck, const XMLCh toCheck2)
366{
367    return XMLChar1_0::isFirstNCNameChar(toCheck, toCheck2);
368}
369
370inline bool XMLChar1_1::isNameChar(const XMLCh toCheck, const XMLCh toCheck2)
371{
372    return XMLChar1_0::isNameChar(toCheck, toCheck2);
373}
374
375inline bool XMLChar1_1::isNCNameChar(const XMLCh toCheck, const XMLCh toCheck2)
376{
377    return XMLChar1_0::isNCNameChar(toCheck, toCheck2);
378}
379
380inline bool XMLChar1_1::isPlainContentChar(const XMLCh, const XMLCh)
381{
382    DEPRECATED_FEATURE_IN_ICXML;
383}
384
385
386inline bool XMLChar1_1::isSpecialStartTagChar(const XMLCh, const XMLCh)
387{
388    DEPRECATED_FEATURE_IN_ICXML;
389}
390
391inline bool XMLChar1_1::isXMLChar(const XMLCh toCheck, const XMLCh toCheck2)
392{
393    if (likely(toCheck2 == 0))
394    {
395        return XMLNameChar::isXMLChar(toCheck, false);
396    }
397    else
398    {
399        return isSurrogate(toCheck, toCheck2);
400    }
401}
402
403inline bool XMLChar1_1::isWhitespace(const XMLCh toCheck, const XMLCh toCheck2)
404{
405    if (toCheck2 == 0)
406    {
407        return XMLNameChar::isWhitespace(toCheck, false);
408    }
409    return false;
410}
411
412inline bool XMLChar1_1::isControlChar(const XMLCh toCheck, const XMLCh toCheck2)
413{
414    if (likely(toCheck2 == 0))
415    {
416        return (toCheck2 < 0x20) && XMLNameChar::isXMLChar(toCheck, false);
417    }
418    return false;
419}
420
421inline bool XMLChar1_1::isSurrogate(const XMLCh toCheck, const XMLCh toCheck2)
422{
423    if ((toCheck >= 0xD800) && (toCheck <= 0xDB7F))
424    {
425        if (unlikely((toCheck2 < 0xDC00) || (toCheck2 > 0xDFFF)))
426        {
427            return 0;
428        }
429        return 1;
430    }
431    return 0;
432}
433
434XERCES_CPP_NAMESPACE_END
435
436#endif
Note: See TracBrowser for help on using the repository browser.