| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | ! Copyright (C) 2010 Anton Gorenko. | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2011-03-06 03:06:00 -05:00
										 |  |  | USING: accessors ascii combinators gobject-introspection.common | 
					
						
							|  |  |  | gobject-introspection.repository kernel literals math.parser | 
					
						
							|  |  |  | sequences splitting xml.data xml.traversal ;
 | 
					
						
							| 
									
										
										
										
											2010-07-17 07:17:03 -04:00
										 |  |  | IN: gobject-introspection.loader | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>simple-type ( xml -- type )
 | 
					
						
							|  |  |  |     [ simple-type new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             "type" tags-named | 
					
						
							|  |  |  |             [ xml>simple-type ] map f like >>element-types | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>varargs-type ( xml -- type )
 | 
					
						
							|  |  |  |     drop varargs-type new ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>array-type ( xml -- type )
 | 
					
						
							|  |  |  |     [ array-type new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "zero-terminated" attr "0" = not >>zero-terminated? ] | 
					
						
							|  |  |  |         [ "length" attr string>number >>length ] | 
					
						
							|  |  |  |         [ "fixed-size" attr string>number >>fixed-size ] | 
					
						
							|  |  |  |         [ "type" tag-named xml>simple-type >>element-type ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>inner-callback-type ( xml -- type )
 | 
					
						
							|  |  |  |     [ inner-callback-type new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>type ( xml -- type )
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     dup name>> main>> { | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         { "type" [ xml>simple-type ] } | 
					
						
							|  |  |  |         { "array"[ xml>array-type ] } | 
					
						
							|  |  |  |         { "callback" [ xml>inner-callback-type ] } | 
					
						
							|  |  |  |         { "varargs" [ xml>varargs-type ] } | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } case ;
 | 
					
						
							| 
									
										
										
										
											2010-08-31 13:01:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | CONSTANT: type-tags | 
					
						
							|  |  |  |     $[ { "array" "type" "callback" "varargs" } [ <null-name> ] map ] | 
					
						
							| 
									
										
										
										
											2010-08-31 13:01:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : child-type-tag ( xml -- type-tag )
 | 
					
						
							|  |  |  |     children-tags [ | 
					
						
							|  |  |  |         type-tags [ swap tag-named? ] with any?
 | 
					
						
							|  |  |  |     ] find nip ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>alias ( xml -- alias )
 | 
					
						
							|  |  |  |     [ alias new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "type" attr >>c-type ] | 
					
						
							|  |  |  |         [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>const ( xml -- const )
 | 
					
						
							|  |  |  |     [ const new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "value" attr >>value ] | 
					
						
							|  |  |  |         [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | : load-type ( type xml -- type )
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ [ "type" attr ] [ "type-name" attr ] bi or >>c-type ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "get-type" attr >>get-type ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>member ( xml -- member )
 | 
					
						
							|  |  |  |     [ enum-member new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "identifier" attr >>c-identifier ] | 
					
						
							|  |  |  |         [ "value" attr string>number >>value ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>enum ( xml -- enum )
 | 
					
						
							|  |  |  |     [ enum new ] dip { | 
					
						
							|  |  |  |         [ load-type ] | 
					
						
							|  |  |  |         [ "member" tags-named [ xml>member ] map >>members ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : load-parameter ( param xml -- param )
 | 
					
						
							|  |  |  |     [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |     [ "transfer-ownership" attr >>transfer-ownership ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | : xml>parameter ( xml -- parameter )
 | 
					
						
							|  |  |  |     [ parameter new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "direction" attr dup "in" ? >>direction ] | 
					
						
							|  |  |  |         [ "allow-none" attr "1" = >>allow-none? ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |         [ "transfer-ownership" attr >>transfer-ownership ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>return ( xml -- return )
 | 
					
						
							|  |  |  |     [ return new ] dip { | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |         [ "transfer-ownership" attr >>transfer-ownership ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |     | 
					
						
							|  |  |  | : load-callable ( callable xml -- callable )
 | 
					
						
							|  |  |  |     [ "return-value" tag-named xml>return >>return ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         "parameters" tag-named "parameter" tags-named | 
					
						
							|  |  |  |         [ xml>parameter ] map >>parameters | 
					
						
							|  |  |  |     ] bi ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : xml>function ( xml -- function )
 | 
					
						
							|  |  |  |     [ function new ] dip { | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "name" attr >>name ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "identifier" attr >>identifier ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ load-callable ] | 
					
						
							|  |  |  |         [ "throws" attr "1" = >>throws? ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : load-functions ( xml tag-name -- functions )
 | 
					
						
							|  |  |  |     tags-named [ xml>function ] map ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>field ( xml -- field )
 | 
					
						
							|  |  |  |     [ field new ] dip { | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "writable" attr "1" = >>writable? ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "bits" attr string>number >>bits ] | 
					
						
							|  |  |  |         [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>record ( xml -- record )
 | 
					
						
							|  |  |  |     [ record new ] dip { | 
					
						
							|  |  |  |         [ load-type ] | 
					
						
							| 
									
										
										
										
											2011-03-06 03:06:00 -05:00
										 |  |  |         [ | 
					
						
							|  |  |  |             over c-type>> implement-struct? | 
					
						
							|  |  |  |             [ "field" tags-named [ xml>field ] map >>fields ] | 
					
						
							|  |  |  |             [ drop ] if
 | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "constructor" load-functions >>constructors ] | 
					
						
							|  |  |  |         [ "method" load-functions >>methods ] | 
					
						
							|  |  |  |         [ "function" load-functions >>functions ] | 
					
						
							|  |  |  |         [ "disguised" attr "1" = >>disguised? ] | 
					
						
							| 
									
										
										
										
											2011-03-05 14:05:02 -05:00
										 |  |  |         [ "is-gtype-struct-for" attr >>struct-for ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>union ( xml -- union )
 | 
					
						
							|  |  |  |     [ union new ] dip { | 
					
						
							|  |  |  |         [ load-type ] | 
					
						
							|  |  |  |         [ "field" tags-named [ xml>field ] map >>fields ] | 
					
						
							|  |  |  |         [ "constructor" load-functions >>constructors ] | 
					
						
							|  |  |  |         [ "method" load-functions >>methods ] | 
					
						
							|  |  |  |         [ "function" load-functions >>functions ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>callback ( xml -- callback )
 | 
					
						
							|  |  |  |     [ callback new ] dip { | 
					
						
							|  |  |  |         [ load-type ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ load-callable ] | 
					
						
							|  |  |  |         [ "throws" attr "1" = >>throws? ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>signal ( xml -- signal )
 | 
					
						
							|  |  |  |     [ signal new ] dip { | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ load-callable ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>property ( xml -- property )
 | 
					
						
							|  |  |  |     [ property new ] dip { | 
					
						
							|  |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "writable" attr "1" = >>writable? ] | 
					
						
							|  |  |  |         [ "readable" attr "0" = not >>readable? ] | 
					
						
							|  |  |  |         [ "construct" attr "1" = >>construct? ] | 
					
						
							|  |  |  |         [ "construct-only" attr "1" = >>construct-only? ] | 
					
						
							|  |  |  |         [ child-type-tag xml>type >>type ] | 
					
						
							|  |  |  |     } cleave ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : xml>class ( xml -- class )
 | 
					
						
							|  |  |  |     [ class new ] dip { | 
					
						
							|  |  |  |         [ load-type ] | 
					
						
							|  |  |  |         [ "abstract" attr "1" = >>abstract? ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "parent" attr >>parent ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "type-struct" attr >>type-struct ] | 
					
						
							|  |  |  |         [ "constructor" load-functions >>constructors ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "method" load-functions >>methods ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "function" load-functions >>functions ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "signal" tags-named [ xml>signal ] map >>signals ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : xml>interface ( xml -- interface )
 | 
					
						
							|  |  |  |     [ interface new ] dip { | 
					
						
							|  |  |  |         [ load-type ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "method" load-functions >>methods ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "function" load-functions >>functions ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "signal" tags-named [ xml>signal ] map >>signals ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |     } cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  | : xml>boxed ( xml -- boxed )
 | 
					
						
							|  |  |  |     [ boxed new ] dip
 | 
					
						
							|  |  |  |         load-type ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-06 03:06:00 -05:00
										 |  |  | : fix-conts ( namespace -- )
 | 
					
						
							|  |  |  |     [ symbol-prefixes>> first >upper "_" append ] [ consts>> ] bi
 | 
					
						
							|  |  |  |     [ [ name>> append ] keep c-identifier<< ] with each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : postprocess-namespace ( namespace -- )
 | 
					
						
							|  |  |  |     fix-conts ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | : xml>namespace ( xml -- namespace )
 | 
					
						
							|  |  |  |     [ namespace new ] dip { | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "name" attr >>name ] | 
					
						
							|  |  |  |         [ "identifier-prefixes" attr "," split >>identifier-prefixes ] | 
					
						
							|  |  |  |         [ "symbol-prefixes" attr "," split >>symbol-prefixes ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "alias" tags-named [ xml>alias ] map >>aliases ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "constant" tags-named [ xml>const ] map >>consts ] | 
					
						
							|  |  |  |         [ "enumeration" tags-named [ xml>enum ] map >>enums ] | 
					
						
							|  |  |  |         [ "bitfield" tags-named [ xml>enum ] map >>bitfields ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "record" tags-named [ xml>record ] map >>records ] | 
					
						
							|  |  |  |         [ "union" tags-named [ xml>union ] map >>unions ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "boxed" tags-named [ xml>boxed ] map >>boxeds ] | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  |         [ "callback" tags-named [ xml>callback ] map >>callbacks ] | 
					
						
							|  |  |  |         [ "class" tags-named [ xml>class ] map >>classes ] | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |         [ "interface" tags-named [ xml>interface ] map >>interfaces ] | 
					
						
							| 
									
										
										
										
											2010-05-26 14:17:14 -04:00
										 |  |  |         [ "function" load-functions >>functions ] | 
					
						
							| 
									
										
										
										
											2011-03-06 03:06:00 -05:00
										 |  |  |     } cleave [ postprocess-namespace ] keep ;
 | 
					
						
							| 
									
										
										
										
											2010-05-09 13:21:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : xml>repository ( xml -- repository )
 | 
					
						
							| 
									
										
										
										
											2010-09-29 05:08:31 -04:00
										 |  |  |     [ repository new ] dip
 | 
					
						
							|  |  |  |     "namespace" tag-named xml>namespace >>namespace ;
 |