14
14
// limitations under the License.
15
15
16
16
extern crate xml;
17
+ extern crate khronos_api;
17
18
18
19
use std:: collections:: hash_map:: Entry ;
19
20
use std:: collections:: BTreeSet ;
@@ -98,11 +99,15 @@ pub struct Registry {
98
99
99
100
impl Registry {
100
101
/// Generate a registry from the supplied XML string
101
- pub fn from_xml < R : io:: Read > ( data : R , api : Api , filter : Filter ) -> Registry {
102
- RegistryBuilder {
103
- api : api,
104
- reader : XmlEventReader :: new ( data) ,
105
- } . consume_registry ( filter)
102
+ pub fn new ( api : Api , filter : Filter ) -> Registry {
103
+ let src = match api {
104
+ Api :: Gl | Api :: GlCore | Api :: Gles1 | Api :: Gles2 => khronos_api:: GL_XML ,
105
+ Api :: Glx => self :: khronos_api:: GLX_XML ,
106
+ Api :: Wgl => self :: khronos_api:: WGL_XML ,
107
+ Api :: Egl => self :: khronos_api:: EGL_XML ,
108
+ } ;
109
+
110
+ RegistryParser :: parse ( src, api, filter)
106
111
}
107
112
108
113
/// Returns a set of all the types used in the supplied registry. This is useful
@@ -245,7 +250,7 @@ pub struct GlxOpcode {
245
250
pub name : Option < String > ,
246
251
}
247
252
248
- struct RegistryBuilder < R : io:: Read > {
253
+ struct RegistryParser < R : io:: Read > {
249
254
pub api : Api ,
250
255
pub reader : XmlEventReader < R > ,
251
256
}
@@ -259,7 +264,7 @@ pub struct Filter {
259
264
}
260
265
261
266
/// A big, ugly, imperative impl with methods that accumulates a Registry struct
262
- impl < R : io:: Read > RegistryBuilder < R > {
267
+ impl < R : io:: Read > RegistryParser < R > {
263
268
fn next ( & mut self ) -> XmlEvent {
264
269
loop {
265
270
let event = self . reader . next ( ) ;
@@ -308,8 +313,13 @@ impl<R: io::Read> RegistryBuilder<R> {
308
313
}
309
314
}
310
315
311
- fn consume_registry ( & mut self , filter : Filter ) -> Registry {
312
- self . expect_start_element ( "registry" ) ;
316
+ fn parse ( src : R , api : Api , filter : Filter ) -> Registry {
317
+ let mut parser = RegistryParser {
318
+ api : api,
319
+ reader : XmlEventReader :: new ( src) ,
320
+ } ;
321
+
322
+ parser. expect_start_element ( "registry" ) ;
313
323
314
324
let mut enums = Vec :: new ( ) ;
315
325
let mut cmds = Vec :: new ( ) ;
@@ -318,35 +328,35 @@ impl<R: io::Read> RegistryBuilder<R> {
318
328
let mut aliases = HashMap :: new ( ) ;
319
329
320
330
loop {
321
- match self . next ( ) {
331
+ match parser . next ( ) {
322
332
// ignores
323
333
XmlEvent :: Characters ( _) | XmlEvent :: Comment ( _) => ( ) ,
324
- XmlEvent :: StartElement { ref name, .. } if name. local_name == "comment" => self . skip_to_end ( "comment" ) ,
325
- XmlEvent :: StartElement { ref name, .. } if name. local_name == "types" => self . skip_to_end ( "types" ) ,
326
- XmlEvent :: StartElement { ref name, .. } if name. local_name == "groups" => self . skip_to_end ( "groups" ) ,
334
+ XmlEvent :: StartElement { ref name, .. } if name. local_name == "comment" => parser . skip_to_end ( "comment" ) ,
335
+ XmlEvent :: StartElement { ref name, .. } if name. local_name == "types" => parser . skip_to_end ( "types" ) ,
336
+ XmlEvent :: StartElement { ref name, .. } if name. local_name == "groups" => parser . skip_to_end ( "groups" ) ,
327
337
328
338
// add enum namespace
329
339
XmlEvent :: StartElement { ref name, ..} if name. local_name == "enums" => {
330
- enums. extend ( self . consume_enums ( ) . into_iter ( ) ) ;
340
+ enums. extend ( parser . consume_enums ( ) . into_iter ( ) ) ;
331
341
}
332
342
333
343
// add command namespace
334
344
XmlEvent :: StartElement { ref name, ..} if name. local_name == "commands" => {
335
- let ( new_cmds, new_aliases) = self . consume_cmds ( ) ;
345
+ let ( new_cmds, new_aliases) = parser . consume_cmds ( ) ;
336
346
cmds. extend ( new_cmds. into_iter ( ) ) ;
337
347
merge_map ( & mut aliases, new_aliases) ;
338
348
}
339
349
340
350
XmlEvent :: StartElement { ref name, ref attributes, ..} if name. local_name == "feature" => {
341
351
debug ! ( "Parsing feature: {:?}" , attributes) ;
342
- features. push ( Feature :: convert ( self , & attributes) ) ;
352
+ features. push ( Feature :: convert ( & mut parser , & attributes) ) ;
343
353
}
344
354
345
355
XmlEvent :: StartElement { ref name, ..} if name. local_name == "extensions" => {
346
356
loop {
347
- match self . next ( ) {
357
+ match parser . next ( ) {
348
358
XmlEvent :: StartElement { ref name, ref attributes, ..} if name. local_name == "extension" => {
349
- extensions. push ( Extension :: convert ( self , & attributes) ) ;
359
+ extensions. push ( Extension :: convert ( & mut parser , & attributes) ) ;
350
360
}
351
361
XmlEvent :: EndElement { ref name} if name. local_name == "extensions" => break ,
352
362
msg => panic ! ( "Unexpected message {:?}" , msg) ,
@@ -430,7 +440,7 @@ impl<R: io::Read> RegistryBuilder<R> {
430
440
} ;
431
441
432
442
Registry {
433
- api : self . api ,
443
+ api : api,
434
444
enums : enums. into_iter ( ) . filter ( is_desired_enum) . collect ( ) ,
435
445
cmds : cmds. into_iter ( ) . filter ( is_desired_cmd) . collect ( ) ,
436
446
aliases : if filter. fallbacks == Fallbacks :: None { HashMap :: new ( ) } else { aliases } ,
@@ -625,11 +635,11 @@ fn get_attribute(a: &[OwnedAttribute], name: &str) -> Option<String> {
625
635
}
626
636
627
637
trait FromXml {
628
- fn convert < R : io:: Read > ( r : & mut RegistryBuilder < R > , a : & [ OwnedAttribute ] ) -> Self ;
638
+ fn convert < R : io:: Read > ( r : & mut RegistryParser < R > , a : & [ OwnedAttribute ] ) -> Self ;
629
639
}
630
640
631
641
impl FromXml for Require {
632
- fn convert < R : io:: Read > ( r : & mut RegistryBuilder < R > , _: & [ OwnedAttribute ] ) -> Require {
642
+ fn convert < R : io:: Read > ( r : & mut RegistryParser < R > , _: & [ OwnedAttribute ] ) -> Require {
633
643
debug ! ( "Doing a FromXml on Require" ) ;
634
644
let ( enums, commands) = r. consume_two ( "enum" , "command" , "require" ) ;
635
645
Require {
@@ -640,7 +650,7 @@ impl FromXml for Require {
640
650
}
641
651
642
652
impl FromXml for Remove {
643
- fn convert < R : io:: Read > ( r : & mut RegistryBuilder < R > , a : & [ OwnedAttribute ] ) -> Remove {
653
+ fn convert < R : io:: Read > ( r : & mut RegistryParser < R > , a : & [ OwnedAttribute ] ) -> Remove {
644
654
debug ! ( "Doing a FromXml on Remove" ) ;
645
655
let profile = get_attribute ( a, "profile" ) . unwrap ( ) ;
646
656
let profile = Profile :: from_str ( & * profile) . unwrap ( ) ;
@@ -655,7 +665,7 @@ impl FromXml for Remove {
655
665
}
656
666
657
667
impl FromXml for Feature {
658
- fn convert < R : io:: Read > ( r : & mut RegistryBuilder < R > , a : & [ OwnedAttribute ] ) -> Feature {
668
+ fn convert < R : io:: Read > ( r : & mut RegistryParser < R > , a : & [ OwnedAttribute ] ) -> Feature {
659
669
debug ! ( "Doing a FromXml on Feature" ) ;
660
670
let api = get_attribute ( a, "api" ) . unwrap ( ) ;
661
671
let api = Api :: from_str ( & * api) . unwrap ( ) ;
@@ -677,7 +687,7 @@ impl FromXml for Feature {
677
687
}
678
688
679
689
impl FromXml for Extension {
680
- fn convert < R : io:: Read > ( r : & mut RegistryBuilder < R > , a : & [ OwnedAttribute ] ) -> Extension {
690
+ fn convert < R : io:: Read > ( r : & mut RegistryParser < R > , a : & [ OwnedAttribute ] ) -> Extension {
681
691
debug ! ( "Doing a FromXml on Extension" ) ;
682
692
let name = get_attribute ( a, "name" ) . unwrap ( ) ;
683
693
let supported = get_attribute ( a, "supported" ) . unwrap ( )
@@ -705,7 +715,7 @@ impl FromXml for Extension {
705
715
}
706
716
707
717
impl FromXml for String {
708
- fn convert < R : io:: Read > ( _: & mut RegistryBuilder < R > , a : & [ OwnedAttribute ] ) -> String {
718
+ fn convert < R : io:: Read > ( _: & mut RegistryParser < R > , a : & [ OwnedAttribute ] ) -> String {
709
719
get_attribute ( a, "name" ) . unwrap ( )
710
720
}
711
721
}
0 commit comments