]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/gobject-introspection/gobject-introspection.factor
factor: trim using lists
[factor.git] / basis / gobject-introspection / gobject-introspection.factor
old mode 100755 (executable)
new mode 100644 (file)
index 5104f75..798f694
@@ -1,15 +1,49 @@
 ! Copyright (C) 2010 Anton Gorenko.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators gobject-introspection.common
-gobject-introspection.ffi gobject-introspection.loader
-gobject-introspection.types kernel lexer locals namespaces parser
-sequences xml ;
+USING: accessors combinators environment
+gobject-introspection.common gobject-introspection.ffi
+gobject-introspection.loader gobject-introspection.types io
+io.files io.pathnames kernel lexer 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>> join-lines ] bi
+    "\n\nUse the existing path or declare GIR_DIRS environment variable"
+    3append ;
+
 <PRIVATE
 
-:: define-gir-vocab ( file-name -- )
-    file-name file>xml xml>repository
+: 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 file-exists?
+    [ path ] [
+        current-vocab-dirs custom-gir-dirs system-gir-dirs
+        3append sift :> paths
+        paths [ path append-path file-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 ]
@@ -18,12 +52,15 @@ IN: gobject-introspection
 
 PRIVATE>
 
-SYNTAX: GIR: scan define-gir-vocab ;
+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 ;