70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
! Copyright (C) 2010 Anton Gorenko.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: accessors assocs combinators environment gobject-introspection.common
 | 
						|
gobject-introspection.ffi gobject-introspection.loader
 | 
						|
gobject-introspection.types io io.files io.pathnames kernel lexer
 | 
						|
locals make namespaces parser sequences splitting summary vocabs
 | 
						|
vocabs.parser xml ;
 | 
						|
IN: gobject-introspection
 | 
						|
 | 
						|
ERROR: gir-not-found name paths ;
 | 
						|
 | 
						|
M: gir-not-found summary
 | 
						|
    [ name>> "“" "” file not found on paths:\n" surround ]
 | 
						|
    [ paths>> "\n" join ] bi
 | 
						|
    "\n\nUse the existing path or declare GIR_DIRS environment variable"
 | 
						|
    3append ;
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
: system-gir-dirs ( -- dirs )
 | 
						|
    "XDG_DATA_DIRS" os-env "/usr/local/share/:/usr/share/" or
 | 
						|
    ":" split [ "gir-1.0" append-path ] map ;
 | 
						|
 | 
						|
: custom-gir-dirs ( -- dirs )
 | 
						|
    "GIR_DIRS" os-env ":" split ;
 | 
						|
 | 
						|
: current-vocab-path ( -- path )
 | 
						|
    current-vocab vocab-name "." split "/" join vocab-path ;
 | 
						|
 | 
						|
: current-vocab-dirs ( -- dirs )
 | 
						|
    [
 | 
						|
        current-vocab-path
 | 
						|
        [ , ] [ "/ffi" ?tail [ , ] [ drop ] if ] bi
 | 
						|
    ] { } make ;
 | 
						|
 | 
						|
:: resolve-gir-path ( path -- path )
 | 
						|
    path exists?
 | 
						|
    [ path ] [
 | 
						|
        current-vocab-dirs custom-gir-dirs system-gir-dirs
 | 
						|
        3append sift :> paths
 | 
						|
        paths [ path append-path exists? ] find nip
 | 
						|
        [ path append-path ] [ path paths gir-not-found ] if*
 | 
						|
    ] if ;
 | 
						|
 | 
						|
: define-gir-vocab ( path -- )
 | 
						|
    resolve-gir-path dup "Loading " write print
 | 
						|
    file>xml xml>repository
 | 
						|
    {
 | 
						|
        [ namespace>> name>> current-namespace-name set-global ]
 | 
						|
        [ def-ffi-repository ]
 | 
						|
    } cleave
 | 
						|
    V{ } clone implement-structs set-global ;
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
SYNTAX: GIR: scan-token define-gir-vocab ;
 | 
						|
 | 
						|
SYNTAX: IMPLEMENT-STRUCTS:
 | 
						|
    ";" parse-tokens
 | 
						|
    implement-structs [ swap append! ] change-global ;
 | 
						|
 | 
						|
SYNTAX: FOREIGN-ATOMIC-TYPE:
 | 
						|
    scan-token scan-object swap register-atomic-type ;
 | 
						|
 | 
						|
SYNTAX: FOREIGN-ENUM-TYPE:
 | 
						|
    scan-token scan-object swap register-enum-type ;
 | 
						|
 | 
						|
SYNTAX: FOREIGN-RECORD-TYPE:
 | 
						|
    scan-token scan-object swap register-record-type ;
 |