69 lines
1.9 KiB
Factor
69 lines
1.9 KiB
Factor
! Copyright (C) 2010 Anton Gorenko.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors 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 xdg 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 [ "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 ;
|