228 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2010 Anton Gorenko.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: accessors ascii combinators gobject-introspection.common
 | |
| gobject-introspection.repository kernel literals math.parser
 | |
| sequences splitting xml.data xml.traversal ;
 | |
| IN: gobject-introspection.loader
 | |
| 
 | |
| : xml>simple-type ( xml -- type )
 | |
|     [ simple-type new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|         [
 | |
|             "type" tags-named
 | |
|             [ xml>simple-type ] map f like >>element-types
 | |
|         ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>varargs-type ( xml -- type )
 | |
|     drop varargs-type new ;
 | |
| 
 | |
| : 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 ;
 | |
| 
 | |
| : xml>inner-callback-type ( xml -- type )
 | |
|     [ inner-callback-type new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>type ( xml -- type )
 | |
|     dup name>> main>> {
 | |
|         { "type" [ xml>simple-type ] }
 | |
|         { "array"[ xml>array-type ] }
 | |
|         { "callback" [ xml>inner-callback-type ] }
 | |
|         { "varargs" [ xml>varargs-type ] }
 | |
|     } case ;
 | |
| 
 | |
| CONSTANT: type-tags
 | |
|     $[ { "array" "type" "callback" "varargs" } [ <null-name> ] map ]
 | |
| 
 | |
| : child-type-tag ( xml -- type-tag )
 | |
|     children-tags [
 | |
|         type-tags [ swap tag-named? ] with any?
 | |
|     ] find nip ;
 | |
| 
 | |
| : 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 ;
 | |
| 
 | |
| : load-type ( type xml -- type )
 | |
|     {
 | |
|         [ "name" attr >>name ]
 | |
|         [ [ "type" attr ] [ "type-name" attr ] bi or >>c-type ]
 | |
|         [ "get-type" attr >>get-type ]
 | |
|     } cleave ;
 | |
| 
 | |
| : 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 ;
 | |
| 
 | |
| : xml>parameter ( xml -- parameter )
 | |
|     [ parameter new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|         [ "direction" attr dup "in" ? >>direction ]
 | |
|         [ "allow-none" attr "1" = >>allow-none? ]
 | |
|         [ child-type-tag xml>type >>type ]
 | |
|         [ "transfer-ownership" attr >>transfer-ownership ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>return ( xml -- return )
 | |
|     [ return new ] dip {
 | |
|         [ child-type-tag xml>type >>type ]
 | |
|         [ "transfer-ownership" attr >>transfer-ownership ]
 | |
|     } cleave ;
 | |
| 
 | |
| : load-callable ( callable xml -- callable )
 | |
|     [ "return-value" tag-named xml>return >>return ]
 | |
|     [
 | |
|         "parameters" tag-named "parameter" tags-named
 | |
|         [ xml>parameter ] map >>parameters
 | |
|     ] bi ;
 | |
| 
 | |
| : xml>function ( xml -- function )
 | |
|     [ function new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|         [ "identifier" attr >>identifier ]
 | |
|         [ load-callable ]
 | |
|         [ "throws" attr "1" = >>throws? ]
 | |
|     } cleave ;
 | |
| 
 | |
| : load-functions ( xml tag-name -- functions )
 | |
|     tags-named [ xml>function ] map ;
 | |
| 
 | |
| : xml>field ( xml -- field )
 | |
|     [ field new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|         [ "writable" attr "1" = >>writable? ]
 | |
|         [ "bits" attr string>number >>bits ]
 | |
|         [ child-type-tag xml>type >>type ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>record ( xml -- record )
 | |
|     [ record new ] dip {
 | |
|         [ load-type ]
 | |
|         [
 | |
|             over c-type>> implement-struct?
 | |
|             [ "field" tags-named [ xml>field ] map >>fields ]
 | |
|             [ drop ] if
 | |
|         ]
 | |
|         [ "constructor" load-functions >>constructors ]
 | |
|         [ "method" load-functions >>methods ]
 | |
|         [ "function" load-functions >>functions ]
 | |
|         [ "disguised" attr "1" = >>disguised? ]
 | |
|         [ "is-gtype-struct-for" attr >>struct-for ]
 | |
|     } 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 ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>callback ( xml -- callback )
 | |
|     [ callback new ] dip {
 | |
|         [ load-type ]
 | |
|         [ load-callable ]
 | |
|         [ "throws" attr "1" = >>throws? ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>signal ( xml -- signal )
 | |
|     [ signal new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|         [ load-callable ]
 | |
|     } cleave ;
 | |
| 
 | |
| : 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 ;
 | |
| 
 | |
| : xml>class ( xml -- class )
 | |
|     [ class new ] dip {
 | |
|         [ load-type ]
 | |
|         [ "abstract" attr "1" = >>abstract? ]
 | |
|         [ "parent" attr >>parent ]
 | |
|         [ "type-struct" attr >>type-struct ]
 | |
|         [ "constructor" load-functions >>constructors ]
 | |
|         [ "method" load-functions >>methods ]
 | |
|         [ "function" load-functions >>functions ]
 | |
|         [ "signal" tags-named [ xml>signal ] map >>signals ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>interface ( xml -- interface )
 | |
|     [ interface new ] dip {
 | |
|         [ load-type ]
 | |
|         [ "method" load-functions >>methods ]
 | |
|         [ "function" load-functions >>functions ]
 | |
|         [ "signal" tags-named [ xml>signal ] map >>signals ]
 | |
|     } cleave ;
 | |
| 
 | |
| : xml>boxed ( xml -- boxed )
 | |
|     [ boxed new ] dip
 | |
|         load-type ;
 | |
| 
 | |
| : fix-conts ( namespace -- )
 | |
|     [ symbol-prefixes>> first >upper "_" append ] [ consts>> ] bi
 | |
|     [ [ name>> append ] keep c-identifier<< ] with each ;
 | |
| 
 | |
| : postprocess-namespace ( namespace -- )
 | |
|     fix-conts ;
 | |
| 
 | |
| : xml>namespace ( xml -- namespace )
 | |
|     [ namespace new ] dip {
 | |
|         [ "name" attr >>name ]
 | |
|         [ "identifier-prefixes" attr "," split >>identifier-prefixes ]
 | |
|         [ "symbol-prefixes" attr "," split >>symbol-prefixes ]
 | |
|         [ "alias" tags-named [ xml>alias ] map >>aliases ]
 | |
|         [ "constant" tags-named [ xml>const ] map >>consts ]
 | |
|         [ "enumeration" tags-named [ xml>enum ] map >>enums ]
 | |
|         [ "bitfield" tags-named [ xml>enum ] map >>bitfields ]
 | |
|         [ "record" tags-named [ xml>record ] map >>records ]
 | |
|         [ "union" tags-named [ xml>union ] map >>unions ]
 | |
|         [ "boxed" tags-named [ xml>boxed ] map >>boxeds ]
 | |
|         [ "callback" tags-named [ xml>callback ] map >>callbacks ]
 | |
|         [ "class" tags-named [ xml>class ] map >>classes ]
 | |
|         [ "interface" tags-named [ xml>interface ] map >>interfaces ]
 | |
|         [ "function" load-functions >>functions ]
 | |
|     } cleave [ postprocess-namespace ] keep ;
 | |
| 
 | |
| : xml>repository ( xml -- repository )
 | |
|     [ repository new ] dip
 | |
|     "namespace" tag-named xml>namespace >>namespace ;
 |