diff --git a/Makefile b/Makefile
index eff14da..942c20d 100644
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,7 @@ uninstall:
-snow-chibi remove --impls=${SCHEME} ${PKG}
test-r7rs:
- echo "(import (scheme base) (scheme write) (scheme file) (scheme process-context) (retropikzel ${LIBRARY}) (srfi 64))" > test-r7rs.scm
+ echo "(import (scheme base) (scheme write) (scheme file) (scheme process-context) (foreign c) (retropikzel ${LIBRARY}) (srfi 64))" > test-r7rs.scm
cat retropikzel/${LIBRARY}/test.scm >> test-r7rs.scm
COMPILE_R7RS=${SCHEME} compile-scheme -I . -o test-r7rs test-r7rs.scm
printf "\n" | ./test-r7rs
@@ -40,7 +40,7 @@ test-r7rs-docker:
docker run -t foreign-c-library-test-${SCHEME} sh -c "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} SNOW_CHIBI_ARGS=--always-yes build install test-r7rs"
test-r6rs:
- echo "(import (rnrs) (retropikzel ${LIBRARY}) (srfi :64))" > test-r6rs.sps
+ echo "(import (rnrs) (foreign c) (retropikzel ${LIBRARY}) (srfi :64))" > test-r6rs.sps
cat retropikzel/${LIBRARY}/test.scm >> test-r6rs.sps
akku install chez-srfi akku-r7rs
COMPILE_R7RS=${SCHEME} compile-scheme -I .akku/lib -o test-r6rs test-r6rs.sps
diff --git a/retropikzel/gi-repository.scm b/retropikzel/gi-repository.scm
new file mode 100644
index 0000000..3aed587
--- /dev/null
+++ b/retropikzel/gi-repository.scm
@@ -0,0 +1,13 @@
+(define-c-library libc
+ '("stdlib.h")
+ libc-name
+ '((additional-versions ("6"))))
+(define-c-library c-gi
+ '("girepository/girepository.h")
+ "girepository-2.0"
+ '((additional-versions ("0"))))
+
+(define-c-procedure gi-repository-new c-gi 'gi_repository_new 'pointer '())
+(define-c-procedure gi-repository-require c-gi 'gi_repository_require 'pointer '(pointer pointer pointer int pointer))
+(define-c-procedure gi-repository-find-by-name c-gi 'gi_repository_find_by_name 'pointer '(pointer pointer pointer))
+(define-c-procedure gi-function-info-invoke c-gi 'gi_function_info_invoke 'int '(pointer pointer int pointer int pointer pointer))
diff --git a/retropikzel/gi-repository.sld b/retropikzel/gi-repository.sld
new file mode 100644
index 0000000..ee99592
--- /dev/null
+++ b/retropikzel/gi-repository.sld
@@ -0,0 +1,10 @@
+(define-library
+ (retropikzel gi-repository)
+ (import (scheme base)
+ (scheme write)
+ (foreign c))
+ (export gi-repository-new
+ gi-repository-require
+ gi-repository-find-by-name
+ gi-function-info-invoke)
+ (include "gi-repository.scm"))
diff --git a/retropikzel/gi-repository/LICENSE b/retropikzel/gi-repository/LICENSE
new file mode 100644
index 0000000..0a04128
--- /dev/null
+++ b/retropikzel/gi-repository/LICENSE
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
Execute a shell command.
+
+Built upon [(foreign c)](https://sr.ht/~retropikzel/foreign-c/).
+
+[Repository](https://git.sr.ht/~retropikzel/foreign-c-system)
+
+[Issue tracker](https://sr.ht/~retropikzel/foreign-c/trackers)
+
+[Maling lists](https://sr.ht/~retropikzel/foreign-c/lists)
+
+[Jenkins](https://jenkins.scheme.org/job/retropikzel/job/foreign-c-system/)
+
+
+(**system** _command_)
+
+_command_ is a string containing the command you want to run.
+
+Returns the exit code of the command.
+
+Example:
+
+ (import (scheme base)
+ (scheme write)
+ (scheme file)
+ (retropikzel system))
+
+ (define testfile "test.txt")
+ (system (apply string-append `("echo \"Hello\" > " ,testfile)))
+
+ (define text (with-input-from-file testfile (lambda () (read-line))))
+ (display text)
+ (newline)
diff --git a/retropikzel/gi-repository/README.md b/retropikzel/gi-repository/README.md
new file mode 100644
index 0000000..4e35628
--- /dev/null
+++ b/retropikzel/gi-repository/README.md
@@ -0,0 +1,33 @@
+Execute a shell command.
+
+Built upon [(foreign c)](https://sr.ht/~retropikzel/foreign-c/).
+
+[Repository](https://git.sr.ht/~retropikzel/foreign-c-system)
+
+[Issue tracker](https://sr.ht/~retropikzel/foreign-c/trackers)
+
+[Maling lists](https://sr.ht/~retropikzel/foreign-c/lists)
+
+[Jenkins](https://jenkins.scheme.org/job/retropikzel/job/foreign-c-system/)
+
+
+(**system** _command_)
+
+_command_ is a string containing the command you want to run.
+
+Returns the exit code of the command.
+
+Example:
+
+ (import (scheme base)
+ (scheme write)
+ (scheme file)
+ (retropikzel system))
+
+ (define testfile "test.txt")
+ (system (apply string-append `("echo \"Hello\" > " ,testfile)))
+
+ (define text (with-input-from-file testfile (lambda () (read-line))))
+ (display text)
+ (newline)
+
diff --git a/retropikzel/gi-repository/VERSION b/retropikzel/gi-repository/VERSION
new file mode 100644
index 0000000..781dcb0
--- /dev/null
+++ b/retropikzel/gi-repository/VERSION
@@ -0,0 +1 @@
+1.1.3
diff --git a/retropikzel/gi-repository/test.scm b/retropikzel/gi-repository/test.scm
new file mode 100644
index 0000000..0dceca1
--- /dev/null
+++ b/retropikzel/gi-repository/test.scm
@@ -0,0 +1,55 @@
+
+(test-begin "gi-repository")
+
+(define repository (gi-repository-new))
+(display repository)
+(newline)
+
+(define err (make-c-null))
+
+(call-with-address-of
+ err
+ (lambda (err-address)
+ (gi-repository-require repository
+ (string->c-utf8 "GLib")
+ (string->c-utf8 "2.0")
+ 0
+ err-address)
+ (when (not (c-null? err))
+ (error "gi-repository-require failed"))))
+
+
+(define base-info
+ (gi-repository-find-by-name repository
+ (string->c-utf8 "GLib")
+ (string->c-utf8 "assertion_message")))
+
+(when (c-null? base-info) (error "base-info failed"))
+
+(define args (make-c-bytevector (* (c-type-size 'pointer) 5)))
+
+(c-bytevector-pointer-set! args 0 (string->c-utf8 "domain"))
+(c-bytevector-pointer-set! args (c-type-size 'pointer) (string->c-utf8 "(retropikzel gi-repository)"))
+(c-bytevector-u8-set! args (* (c-type-size 'pointer) 2) 42)
+(c-bytevector-pointer-set! args (* (c-type-size 'pointer) 3) (string->c-utf8 "test.scm"))
+(c-bytevector-pointer-set! args (* (c-type-size 'pointer) 4) (string->c-utf8 "foobar"))
+
+(define return-value (make-c-bytevector (c-type-size 'int)))
+(define invoke-err (make-c-null))
+(call-with-address-of
+ invoke-err
+ (lambda (invoke-err-address)
+ (let ((return-code
+ (gi-function-info-invoke base-info
+ args
+ 5
+ (make-c-null)
+ 0
+ (make-c-null)
+ invoke-err-address)))
+ (display "HERE: ")
+ (write return-code)
+ (newline)
+ )))
+
+(test-end "gi-repository")