aboutsummaryrefslogtreecommitdiff
path: root/src/xmlreader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmlreader.cpp')
-rw-r--r--src/xmlreader.cpp175
1 files changed, 167 insertions, 8 deletions
diff --git a/src/xmlreader.cpp b/src/xmlreader.cpp
index 432ecc1..bd241cf 100644
--- a/src/xmlreader.cpp
+++ b/src/xmlreader.cpp
@@ -29,10 +29,10 @@ void Bu::XmlReader::burn( int nAmnt )
29 lookahead( nAmnt ); 29 lookahead( nAmnt );
30 } 30 }
31 31
32 sBuf.remove( nAmnt ); 32 //sBuf.remove( nAmnt );
33} 33}
34 34
35void Bu::XmlNode::checkString( const char *str, int nLen ) 35void Bu::XmlReader::checkString( const char *str, int nLen )
36{ 36{
37 if( !strncmp( str, lookahead( nLen ), nLen ) ) 37 if( !strncmp( str, lookahead( nLen ), nLen ) )
38 { 38 {
@@ -57,14 +57,66 @@ void Bu::XmlReader::prolog()
57void Bu::XmlReader::XMLDecl() 57void Bu::XmlReader::XMLDecl()
58{ 58{
59 checkString("<?xml", 5 ); 59 checkString("<?xml", 5 );
60 S();
60 VersionInfo(); 61 VersionInfo();
61 EncodingDecl(); 62 EncodingDecl();
62 SDDecl(); 63 SDDecl();
63 S(); 64 Sq();
65 checkString("?>", 2 );
64} 66}
65 67
66void Bu::XmlReader::Misc() 68void Bu::XmlReader::Misc()
67{ 69{
70 for(;;)
71 {
72 S();
73 if( !strncmp("<!--", lookahead( 4 ), 4 ) )
74 {
75 Comment();
76 }
77 else if( !strncmp("<?", lookahead( 2 ), 2 ) )
78 {
79 PI();
80 }
81 else
82 {
83 return;
84 }
85 }
86}
87
88void Bu::XmlReader::Comment()
89{
90 checkString("<!--", 4 );
91 for(;;)
92 {
93 unsigned char c = *lookahead(1);
94 if( c == '-' )
95 {
96 if( lookahead(2)[1] == '-' )
97 {
98 checkString("-->", 3 );
99 return;
100 }
101 }
102 burn( 1 );
103 }
104}
105
106void Bu::XmlReader::PI()
107{
108 checkString("<?", 2 );
109 FString sName = Name();
110 printf("PI: %s\n---\n", sName.getStr() );
111 S();
112 for(int j = 0;; j++ )
113 {
114 if( !strncmp( "?>", lookahead(j+2)+j, 2 ) )
115 {
116 burn( j+2 );
117 return;
118 }
119 }
68} 120}
69 121
70void Bu::XmlReader::S() 122void Bu::XmlReader::S()
@@ -75,12 +127,12 @@ void Bu::XmlReader::S()
75 if( c == 0x20 || c == 0x9 || c == 0xD || c == 0xA ) 127 if( c == 0x20 || c == 0x9 || c == 0xD || c == 0xA )
76 continue; 128 continue;
77 if( j == 0 ) 129 if( j == 0 )
78 printf("Error, expected whitespace!\n"); 130 throw ExceptionBase("Expected whitespace.");
79 return; 131 return;
80 } 132 }
81} 133}
82 134
83void Bu::XmlReader::S() 135void Bu::XmlReader::Sq()
84{ 136{
85 for(;;) 137 for(;;)
86 { 138 {
@@ -93,9 +145,19 @@ void Bu::XmlReader::S()
93 145
94void Bu::XmlReader::VersionInfo() 146void Bu::XmlReader::VersionInfo()
95{ 147{
96 S(); 148 try
97 checkString("version", 7 ); 149 {
98 150 S();
151 checkString("version", 7 );
152 }
153 catch( ExceptionBase &e )
154 {
155 return;
156 }
157 Eq();
158 Bu::FString ver = AttValue();
159 if( ver != "1.1" )
160 throw ExceptionBase("Currently we only support xml version 1.1\n");
99} 161}
100 162
101void Bu::XmlReader::Eq() 163void Bu::XmlReader::Eq()
@@ -105,4 +167,101 @@ void Bu::XmlReader::Eq()
105 Sq(); 167 Sq();
106} 168}
107 169
170void Bu::XmlReader::EncodingDecl()
171{
172 S();
173 try
174 {
175 checkString("encoding", 8 );
176 }
177 catch( ExceptionBase &e )
178 {
179 return;
180 }
181
182 Eq();
183 AttValue();
184}
185
186void Bu::XmlReader::SDDecl()
187{
188 S();
189 try
190 {
191 checkString("standalone", 10 );
192 }
193 catch( ExceptionBase &e )
194 {
195 return;
196 }
197
198 Eq();
199 AttValue();
200}
201
202Bu::FString Bu::XmlReader::AttValue()
203{
204 char q = *lookahead(1);
205 if( q == '\"' )
206 {
207 for( int j = 2;; j++ )
208 {
209 if( lookahead(j)[j-1] == '\"' )
210 {
211 Bu::FString ret( lookahead(j)+1, j-2 );
212 burn( j );
213 return ret;
214 }
215 }
216 }
217 else if( q == '\'' )
218 {
219 for( int j = 2;; j++ )
220 {
221 if( lookahead(j)[j-1] == '\'' )
222 {
223 Bu::FString ret( lookahead(j)+1, j-2 );
224 burn( j );
225 return ret;
226 }
227 }
228 }
229
230 throw ExceptionBase("Excpected either \' or \".\n");
231}
232
233Bu::FString Bu::XmlReader::Name()
234{
235 unsigned char c = *lookahead( 1 );
236 if( c != ':' && c != '_' &&
237 (c < 'A' || c > 'Z') &&
238 (c < 'a' || c > 'z') &&
239 (c < 0xC0 || c > 0xD6 ) &&
240 (c < 0xD8 || c > 0xF6 ) &&
241 (c < 0xF8))
242 {
243 throw ExceptionBase("Invalid entity name starting character.");
244 }
245
246 for( int j = 1;; j++ )
247 {
248 unsigned char c = lookahead(j+1)[j];
249 if( isS( c ) )
250 {
251 FString ret( lookahead(j+1), j+1 );
252 burn( j+1 );
253 return ret;
254 }
255 if( c != ':' && c != '_' && c != '-' && c != '.' && c != 0xB7 &&
256 (c < 'A' || c > 'Z') &&
257 (c < 'a' || c > 'z') &&
258 (c < '0' || c > '9') &&
259 (c < 0xC0 || c > 0xD6 ) &&
260 (c < 0xD8 || c > 0xF6 ) &&
261 (c < 0xF8))
262 {
263 throw ExceptionBase("Invalid character in name.");
264 }
265 }
266}
108 267