source: trunk/src/bytelex.h @ 20

Last change on this file since 20 was 19, checked in by cameron, 12 years ago

Refactoring byte-space lexical recognizers => bytelex.h

File size: 5.1 KB
Line 
1/*  bytelex.h - XML lexical recognizers for pseudo-ASCII or
2    EBCDIC-family byte streams
3    Copyright (c) 2008, Robert D. Cameron.
4    Licensed to the public under the Open Software License 3.0.
5    Licensed to International Characters, Inc., under the Academic
6    Free License 3.0.
7*/
8#ifndef BYTELEX_H
9#define BYTELEX_H
10
11
12#include "multiliteral.h"
13
14template<CharBase C, unsigned char c>
15inline bool AtChar(unsigned char x8data[]) {
16  return x8data[0] == Ord<C, c>::value;
17}
18
19// Specific ASCII/EBCDIC versions are hard-coded here, because
20// the Ord metafunction currently only works for printable characters.
21// Could be improved.
22template<CharBase C>
23inline bool at_WhiteSpace(unsigned char x8data[]);
24
25template<>
26inline bool at_WhiteSpace<ASCII>(unsigned char x8data[]) {
27  unsigned char ch = x8data[0];
28  return (ch == Ord<ASCII, ' '>::value) || 
29         (ch == 0x0A) || (ch == 0x0D) || (ch == 0x09);
30}
31
32template<>
33inline bool at_WhiteSpace<EBCDIC>(unsigned char x8data[]) {
34  unsigned char ch = x8data[0];
35  return (ch == Ord<EBCDIC, ' '>::value) || 
36         (ch == 0x25) || (ch == 0x0D) || (ch == 0x05);
37}
38
39
40
41template<CharBase C>
42inline bool at_EndTag_Start(unsigned char x8data[]) {
43  return s2int16(x8data) == c2int16<C, '<', '/'>::value;
44}
45
46template<CharBase C>
47inline bool at_Comment_Start(unsigned char x8data[]) {
48  return s4int32(x8data) == c4int32<C, '<', '!', '-', '-'>::value;
49}
50
51template<CharBase C>
52inline bool at_DoubleHyphen(unsigned char x8data[]) {
53  return s2int16(x8data) == c2int16<C, '-', '-'>::value;
54}
55
56template<CharBase C>
57inline bool at_Comment_End(unsigned char x8data[]) {
58  return s3int32(x8data) == c3int32<C, '-', '-', '>'>::value;
59}
60
61template<CharBase C>
62inline bool at_CDATA_Start(unsigned char x8data[]) {
63  return s8int64(x8data) == 
64         c8int64<C, '<', '!', '[', 'C', 'D', 'A', 'T', 'A'>::value;
65}
66
67template<CharBase C>
68inline bool at_CDATA_End(unsigned char x8data[]) {
69  return s3int32(x8data) == c3int32<C, ']', ']', '>'>::value;
70}
71
72template<CharBase C>
73inline bool at_PI_Start(unsigned char x8data[]) {
74  return s2int16(x8data) == c2int16<C, '<', '?'>::value;
75}
76
77template<CharBase C>
78inline bool at_PI_End(unsigned char x8data[]) {
79  return s2int16(x8data) == c2int16<C, '?', '>'>::value;
80}
81
82template<CharBase C>
83inline bool at_EqualsDQuote(unsigned char x8data[]) {
84  return s2int16(x8data) == c2int16<C, '=', '"'>::value;
85}
86
87template<CharBase C>
88inline bool at_EqualsSQuote(unsigned char x8data[]) {
89  return s2int16(x8data) == c2int16<C, '=', '\''>::value;
90}
91
92template<CharBase C>
93inline bool at_xmlns(unsigned char x8data[]) {
94  return s5int64(x8data) == c5int64<C, 'x', 'm', 'l', 'n', 's'>::value; 
95}
96
97template<CharBase C>
98inline bool at_EmptyElementDelim(unsigned char x8data[]) {
99  return s2int16(x8data) == c2int16<C, '/', '>'>::value;
100}
101
102template<CharBase C>
103inline bool at_XmlDecl_start(unsigned char x8data[]) {
104  return (s5int64(x8data) == c5int64<C, '<', '?', 'x', 'm', 'l'>::value) &&
105         at_WhiteSpace<C>(&x8data[5]);
106}
107
108template<CharBase C>
109inline bool at_version(unsigned char x8data[]) {
110  return s7int64(x8data) == c7int64<C, 'v', 'e', 'r', 's', 'i', 'o', 'n'>::value;
111}
112
113template<CharBase C>
114inline bool at_1_0(unsigned char x8data[]) {
115  return (s5int64(x8data) == c5int64<C, '"', '1', '.', '0', '"'>::value) ||
116         (s5int64(x8data) == c5int64<C, '\'', '1', '.', '0', '\''>::value);
117}
118
119template<CharBase C>
120inline bool at_1_1(unsigned char x8data[]) {
121  return (s5int64(x8data) == c5int64<C, '"', '1', '.', '1', '"'>::value) ||
122         (s5int64(x8data) == c5int64<C, '\'', '1', '.', '1', '\''>::value);
123}
124
125template<CharBase C>
126inline bool at_encoding(unsigned char x8data[]) {
127  return s8int64(x8data) == c8int64<C, 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g'>::value;
128}
129
130template<CharBase C>
131inline bool at_standalone(unsigned char x8data[]) {
132  return (s8int64(x8data) == c8int64<C, 's', 't', 'a', 'n', 'd', 'a', 'l', 'o'>::value) &
133         (s2int16(&x8data[8]) == c2int16<C, 'n', 'e'>::value);
134}
135
136template<CharBase C>
137inline bool at_yes(unsigned char x8data[]) {
138  return (s5int64(x8data) == c5int64<C, '"', 'y', 'e', 's', '"'>::value) |
139         (s5int64(x8data) == c5int64<C, '\'', 'y', 'e', 's', '\''>::value);
140}
141
142template<CharBase C>
143inline bool at_no(unsigned char x8data[]) {
144  return (s4int32(x8data) == c4int32<C, '"', 'n', 'o', '"'>::value) |
145         (s4int32(x8data) == c4int32<C, '\'', 'n', 'o', '\''>::value);
146}
147
148template<CharBase C>
149inline bool at_XxMmLll_WS(unsigned char x8data[]) {
150  uint32_t case_mask = 
151    c3int32<Native, CaseFoldBit<C>::value, CaseFoldBit<C>::value, CaseFoldBit<C>::value>::value;
152  return ((s3int32(x8data) | case_mask) == (c3int32<C, 'x', 'm', 'l'>::value | case_mask)) &&
153         at_WhiteSpace<C>(&x8data[3]);
154}
155
156
157/* The at_ElementTag_Start recognizer rules out '<!', '<?', '</'
158   combinations while returning true for '<' followed by any NameStrt
159   character.
160
161   The following is ugly and works only for ASCII.
162*/
163template<CharBase C>
164inline bool at_ElementTag_Start(unsigned char x8data[]);
165
166template<>
167inline bool at_ElementTag_Start<ASCII>(unsigned char x8data[]) {
168  return (x8data[0] == Ord<ASCII, '<'>::value) &
169         ((x8data[1] & 0xE1) != 0x21);
170}
171#endif
Note: See TracBrowser for help on using the repository browser.