source: trunk/src/bytelex.h @ 23

Last change on this file since 23 was 23, checked in by cameron, 11 years ago

Version-dependent WhiteSpace?; update for CodeUnit_Base

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