1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*******************************************************************************
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   Copyright (C) 2011, International Business Machines
4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   Corporation and others.  All Rights Reserved.
5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*******************************************************************************
6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   file name:  patternprops.cpp
7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   encoding:   US-ASCII
8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   tab size:   8 (not used)
9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   indentation:4
10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*
11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   created on: 2011mar13
12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   created by: Markus W. Scherer
13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/
14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h"
16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "patternprops.h"
17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_BEGIN
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * One byte per Latin-1 character.
22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Bit 0 is set if either Pattern property is true,
23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * bit 1 if Pattern_Syntax is true,
24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * bit 2 if Pattern_White_Space is true.
25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * That is, Pattern_Syntax is encoded as 3 and Pattern_White_Space as 5.
26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const uint8_t latin1[256]={
28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // WS: 9..D
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0,
30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // WS: 20  Syntax: 21..2F
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: 3A..40
34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3,
35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: 5B..5E
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0,
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: 60
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: 7B..7E
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0,
42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // WS: 85
43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: A1..A7, A9, AB, AC, AE
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3, 0, 3, 0,
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: B0, B1, B6, BB, BF
48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 3,
49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: D7
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Syntax: F7
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * One byte per 32 characters from U+2000..U+303F indexing into
59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * a small table of 32-bit data words.
60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The first two data words are all-zeros and all-ones.
61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const uint8_t index2000[130]={
63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    2, 3, 4, 0, 0, 0, 0, 0,  // 20xx
64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 5, 1, 1, 1,  // 21xx
65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 22xx
66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 23xx
67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 0, 0, 0, 0, 0,  // 24xx
68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 25xx
69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 26xx
70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 6, 7, 1, 1, 1,  // 27xx
71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 28xx
72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 29xx
73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 2Axx
74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 1, 1, 1, 1,  // 2Bxx
75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0,  // 2Cxx
76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0,  // 2Dxx
77b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1, 1, 1, 0, 0, 0, 0,  // 2Exx
78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0, 0, 0, 0, 0, 0, 0, 0,  // 2Fxx
79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    8, 9  // 3000..303F
80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * One 32-bit integer per 32 characters. Ranges of all-false and all-true
84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * are mapped to the first two values, other ranges map to appropriate bit patterns.
85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const uint32_t syntax2000[]={
87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0,
88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffffffff,
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffff0000,  // 2: 2010..201F
90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7fff00ff,  // 3: 2020..2027, 2030..203E
91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7feffffe,  // 4: 2041..2053, 2055..205E
92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffff0000,  // 5: 2190..219F
93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x003fffff,  // 6: 2760..2775
94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xfff00000,  // 7: 2794..279F
95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffffff0e,  // 8: 3001..3003, 3008..301F
96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00010001   // 9: 3020, 3030
97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Same as syntax2000, but with additional bits set for the
101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Pattern_White_Space characters 200E 200F 2028 2029.
102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const uint32_t syntaxOrWhiteSpace2000[]={
104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0,
105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffffffff,
106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffffc000,  // 2: 200E..201F
107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7fff03ff,  // 3: 2020..2029, 2030..203E
108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7feffffe,  // 4: 2041..2053, 2055..205E
109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffff0000,  // 5: 2190..219F
110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x003fffff,  // 6: 2760..2775
111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xfff00000,  // 7: 2794..279F
112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0xffffff0e,  // 8: 3001..3003, 3008..301F
113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00010001   // 9: 3020, 3030
114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::isSyntax(UChar32 c) {
118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(c<0) {
119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<=0xff) {
121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return (UBool)(latin1[c]>>1)&1;
122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<0x2010) {
123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<=0x3030) {
125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uint32_t bits=syntax2000[index2000[(c-0x2000)>>5]];
126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return (UBool)((bits>>(c&0x1f))&1);
127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(0xfd3e<=c && c<=0xfe46) {
128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return c<=0xfd3f || 0xfe45<=c;
129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::isSyntaxOrWhiteSpace(UChar32 c) {
136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(c<0) {
137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<=0xff) {
139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return (UBool)(latin1[c]&1);
140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<0x200e) {
141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<=0x3030) {
143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uint32_t bits=syntaxOrWhiteSpace2000[index2000[(c-0x2000)>>5]];
144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return (UBool)((bits>>(c&0x1f))&1);
145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(0xfd3e<=c && c<=0xfe46) {
146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return c<=0xfd3f || 0xfe45<=c;
147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::isWhiteSpace(UChar32 c) {
154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(c<0) {
155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(c<=0xff) {
157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return (UBool)(latin1[c]>>2)&1;
158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else if(0x200e<=c && c<=0x2029) {
159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return c<=0x200f || 0x2028<=c;
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst UChar *
166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::skipWhiteSpace(const UChar *s, int32_t length) {
167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while(length>0 && isWhiteSpace(*s)) {
168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ++s;
169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        --length;
170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return s;
172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst UChar *
175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::trimWhiteSpace(const UChar *s, int32_t &length) {
176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(length<=0 || (!isWhiteSpace(s[0]) && !isWhiteSpace(s[length-1]))) {
177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return s;
178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t start=0;
180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t limit=length;
181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while(start<limit && isWhiteSpace(s[start])) {
182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ++start;
183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(start<limit) {
185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // There is non-white space at start; we will not move limit below that,
186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // so we need not test start<limit in the loop.
187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while(isWhiteSpace(s[limit-1])) {
188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            --limit;
189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    length=limit-start;
192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return s+start;
193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool
196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::isIdentifier(const UChar *s, int32_t length) {
197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(length<=0) {
198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar *limit=s+length;
201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    do {
202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(isSyntaxOrWhiteSpace(*s++)) {
203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return FALSE;
204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } while(s<limit);
206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return TRUE;
207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst UChar *
210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPatternProps::skipIdentifier(const UChar *s, int32_t length) {
211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while(length>0 && !isSyntaxOrWhiteSpace(*s)) {
212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ++s;
213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        --length;
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return s;
216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_END
219