Compare commits
21 Commits
main
...
gi-reposit
| Author | SHA1 | Date |
|---|---|---|
|
|
f507ff1059 | |
|
|
2f8166a779 | |
|
|
cf5c702387 | |
|
|
7570aeab0f | |
|
|
b7d7015005 | |
|
|
e34987ae8c | |
|
|
be0bd6f609 | |
|
|
e8f0cd374b | |
|
|
7bf3b69fd3 | |
|
|
4501ccac4b | |
|
|
8492575a65 | |
|
|
619dfb8ad6 | |
|
|
975b851e9e | |
|
|
1c60967772 | |
|
|
f020fc525f | |
|
|
376ad49ded | |
|
|
41191af6cc | |
|
|
9eebd513d9 | |
|
|
0a16717d1d | |
|
|
da149e080b | |
|
|
1adaa618ca |
|
|
@ -24,3 +24,4 @@ example.sps
|
||||||
example
|
example
|
||||||
venv
|
venv
|
||||||
foreign
|
foreign
|
||||||
|
tmp
|
||||||
|
|
|
||||||
46
Dockerfile
46
Dockerfile
|
|
@ -1,46 +0,0 @@
|
||||||
ARG SCHEME=chibi
|
|
||||||
ARG IMAGE=${SCHEME}:head
|
|
||||||
FROM debian:trixie AS build
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
git ca-certificates make gcc libffi-dev libffi-dev wget xz-utils libcurl4
|
|
||||||
RUN mkdir ${HOME}/.snow && echo "()" > ${HOME}/.snow/config.scm
|
|
||||||
WORKDIR /build
|
|
||||||
RUN wget https://gitlab.com/-/project/6808260/uploads/094ce726ce3c6cf8c14560f1e31aaea0/akku-1.1.0.amd64-linux.tar.xz \
|
|
||||||
&& tar -xf akku-1.1.0.amd64-linux.tar.xz \
|
|
||||||
&& mv akku-1.1.0.amd64-linux akku
|
|
||||||
RUN git clone https://github.com/ashinn/chibi-scheme.git --depth=1
|
|
||||||
RUN git clone https://codeberg.org/retropikzel/compile-scheme.git --depth=1
|
|
||||||
WORKDIR /build/chibi-scheme
|
|
||||||
RUN make
|
|
||||||
RUN make install
|
|
||||||
WORKDIR /build/compile-scheme
|
|
||||||
RUN make build-gauche
|
|
||||||
WORKDIR /build
|
|
||||||
RUN git clone https://codeberg.org/foreign-c/foreign-c.git --depth=2
|
|
||||||
|
|
||||||
ARG SCHEME=chibi
|
|
||||||
ARG IMAGE=${SCHEME}:head
|
|
||||||
FROM schemers/${IMAGE}
|
|
||||||
RUN apt-get update && apt-get install -y make gcc libffi-dev libcurl4 gauche
|
|
||||||
RUN mkdir ${HOME}/.snow && echo "()" > ${HOME}/.snow/config.scm
|
|
||||||
COPY --from=build /build /build
|
|
||||||
ARG SCHEME=chibi
|
|
||||||
WORKDIR /build/compile-scheme
|
|
||||||
RUN make install
|
|
||||||
WORKDIR /build/chibi-scheme
|
|
||||||
RUN make install
|
|
||||||
WORKDIR /build/chibi-scheme
|
|
||||||
RUN make install
|
|
||||||
WORKDIR /build/akku
|
|
||||||
RUN bash install.sh
|
|
||||||
ENV PATH=/root/.local/bin:${PATH}
|
|
||||||
RUN akku update
|
|
||||||
WORKDIR /build/foreign-c
|
|
||||||
RUN timeout 30 snow-chibi install --impls=${SCHEME} --always-yes "(srfi 64)" || true
|
|
||||||
RUN timeout 30 snow-chibi install --impls=${SCHEME} --always-yes "(foreign c)" || true
|
|
||||||
RUN make SCHEME=${SCHEME} build install
|
|
||||||
WORKDIR /workdir
|
|
||||||
RUN cp -r /build/foreign-c/foreign .
|
|
||||||
COPY Makefile .
|
|
||||||
COPY retropikzel retropikzel/
|
|
||||||
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
FROM debian:trixie-slim
|
FROM alpine
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apk add make docker git
|
||||||
make ca-certificates git docker.io gauche time mit-scheme
|
RUN git clone https://codeberg.org/retropikzel/test-r7rs.git --depth=1
|
||||||
WORKDIR /cache
|
RUN cd test-r7rs && ./configure && make && make install
|
||||||
RUN git clone https://codeberg.org/retropikzel/compile-scheme.git --depth=1
|
COPY --from=schemers/chibi:alpine-head /usr/local /usr/local
|
||||||
WORKDIR /cache/compile-scheme
|
|
||||||
RUN make build-gauche
|
|
||||||
RUN make install
|
|
||||||
|
|
|
||||||
|
|
@ -15,45 +15,33 @@ pipeline {
|
||||||
parameters {
|
parameters {
|
||||||
string(name: 'R7RS_SCHEMES', defaultValue: 'chibi chicken gauche guile kawa mosh racket sagittarius stklos ypsilon', description: '')
|
string(name: 'R7RS_SCHEMES', defaultValue: 'chibi chicken gauche guile kawa mosh racket sagittarius stklos ypsilon', description: '')
|
||||||
string(name: 'R6RS_SCHEMES', defaultValue: 'chezscheme guile ikarus ironscheme mosh racket sagittarius ypsilon', description: '')
|
string(name: 'R6RS_SCHEMES', defaultValue: 'chezscheme guile ikarus ironscheme mosh racket sagittarius ypsilon', description: '')
|
||||||
string(name: 'LIBRARIES', defaultValue: 'system shell', description: '')
|
string(name: 'LIBRARIES', defaultValue: 'system named-pipes shell requests', description: '')
|
||||||
}
|
}
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
stage('Tests') {
|
stage('Test R6RS Debian') {
|
||||||
parallel {
|
|
||||||
stage('R6RS') {
|
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
params.LIBRARIES.split().each { LIBRARY ->
|
params.LIBRARIES.split().each { LIBRARY ->
|
||||||
stage("${LIBRARY}") {
|
params.R6RS_SCHEMES.split().each { SCHEME ->
|
||||||
parallel params.R6RS_SCHEMES.split().collectEntries { SCHEME ->
|
stage("${SCHEME} ${LIBRARY}") {
|
||||||
[(SCHEME): {
|
|
||||||
def IMG="${SCHEME}:head"
|
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
sh "timeout 600 make SCHEME=${SCHEME} LIBRARY=${LIBRARY} test-r6rs-docker"
|
sh "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} RNRS=r6rs test-docker"
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('R7RS') {
|
}
|
||||||
|
stage('Test R7RS Debian') {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
params.LIBRARIES.split().each { LIBRARY ->
|
params.LIBRARIES.split().each { LIBRARY ->
|
||||||
stage("${LIBRARY}") {
|
params.R7RS_SCHEMESsplit().each { SCHEME ->
|
||||||
parallel params.R7RS_SCHEMES.split().collectEntries() { SCHEME ->
|
stage("${SCHEME} ${LIBRARY}") {
|
||||||
[(SCHEME): {
|
|
||||||
def IMG="${SCHEME}:head"
|
|
||||||
if("${SCHEME}" == "chicken") {
|
|
||||||
IMG="${SCHEME}:5"
|
|
||||||
}
|
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
sh "timeout 600 make SCHEME=${SCHEME} LIBRARY=${LIBRARY} test-r7rs-docker"
|
sh "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} RNRS=r7rs test-docker"
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -62,6 +50,9 @@ pipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
cleanWs()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
120
Makefile
120
Makefile
|
|
@ -1,4 +1,6 @@
|
||||||
SCHEME=chibi
|
SCHEME=chibi
|
||||||
|
DOCKER_TAG=latest
|
||||||
|
IMAGE=${SCHEME}:${DOCKER_TAG}
|
||||||
RNRS=r7rs
|
RNRS=r7rs
|
||||||
LIBRARY=system
|
LIBRARY=system
|
||||||
EXAMPLE=editor
|
EXAMPLE=editor
|
||||||
|
|
@ -13,84 +15,68 @@ TESTFILE=retropikzel/${LIBRARY}/test.scm
|
||||||
|
|
||||||
PKG=retropikzel-${LIBRARY}-${VERSION}.tgz
|
PKG=retropikzel-${LIBRARY}-${VERSION}.tgz
|
||||||
|
|
||||||
DOCKERIMG=${SCHEME}:head
|
SFX=scm
|
||||||
ifeq "${SCHEME}" "chicken"
|
SNOW=snow-chibi --impls=${SCHEME} install --always-yes
|
||||||
DOCKERIMG="chicken:5"
|
LIB_PATHS=
|
||||||
|
ifeq "${RNRS}" "r6rs"
|
||||||
|
SNOW=snow-chibi --impls=${SCHEME} install --always-yes --install-source-dir=. --install-library-dir=.
|
||||||
|
SFX=sps
|
||||||
|
LIB_PATHS=-I .akku/lib
|
||||||
|
endif
|
||||||
|
|
||||||
|
APT_PACKAGES=
|
||||||
|
CSC_OPTIONS=
|
||||||
|
ifeq "${LIBRARY}" "gi-repository"
|
||||||
|
APT_PACKAGES=libgirepository-2.0-dev
|
||||||
|
CSC_OPTIONS=-L -lgirepository-2.0 -L -lgobject-2.0 -L -lglib-2.0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: build
|
all: build
|
||||||
|
|
||||||
build: retropikzel/${LIBRARY}/LICENSE retropikzel/${LIBRARY}/VERSION
|
build: retropikzel/${LIBRARY}/LICENSE retropikzel/${LIBRARY}/VERSION
|
||||||
rm -rf *.tgz
|
|
||||||
echo "<pre>$$(cat retropikzel/${LIBRARY}/README.md)</pre>" > ${README}
|
echo "<pre>$$(cat retropikzel/${LIBRARY}/README.md)</pre>" > ${README}
|
||||||
snow-chibi package --version=${VERSION} --authors=${AUTHOR} --doc=${README} --description="${DESCRIPTION}" ${LIBRARY_FILE}
|
snow-chibi package \
|
||||||
|
--always-yes \
|
||||||
|
--version=${VERSION} \
|
||||||
|
--authors=${AUTHOR} \
|
||||||
|
--doc=${README} \
|
||||||
|
--description="${DESCRIPTION}" \
|
||||||
|
${LIBRARY_FILE}
|
||||||
|
|
||||||
install:
|
install:
|
||||||
snow-chibi install --impls=${SCHEME} ${SNOW_CHIBI_ARGS} ${PKG}
|
snow-chibi install --impls=${SCHEME} --always-yes ${PKG}
|
||||||
|
|
||||||
uninstall:
|
testfiles: build
|
||||||
-snow-chibi remove --impls=${SCHEME} ${PKG}
|
rm -rf .tmp
|
||||||
|
mkdir -p .tmp
|
||||||
|
cp -r retropikzel .tmp/
|
||||||
|
cp ${PKG} .tmp/
|
||||||
|
# R6RS testfiles
|
||||||
|
printf "#!r6rs\n(import (except (rnrs) remove) (srfi :64) (foreign c) (retropikzel ${LIBRARY}))" > .tmp/test.sps
|
||||||
|
cat ${TESTFILE} >> .tmp/test.sps
|
||||||
|
# R7RS testfiles
|
||||||
|
echo "(import (scheme base) (scheme write) (scheme read) (scheme char) (scheme file) (scheme process-context) (srfi 64) (foreign c) (retropikzel ${LIBRARY}))" > .tmp/test.scm
|
||||||
|
cat ${TESTFILE} >> .tmp/test.scm
|
||||||
|
|
||||||
init-venv: build
|
test: testfiles
|
||||||
rm -rf venv
|
cd .tmp && \
|
||||||
scheme-venv ${SCHEME} ${RNRS} venv
|
COMPILE_R7RS=${SCHEME} \
|
||||||
echo "(import (scheme base) (scheme write) (scheme read) (scheme char) (scheme file) (scheme process-context) (srfi 64) (retropikzel ${LIBRARY}))" > venv/test.scm
|
CSC_OPTIONS="${CSC_OPTIONS}" \
|
||||||
printf "#!r6rs\n(import (except (rnrs) remove) (srfi :64) (retropikzel ${LIBRARY}))" > venv/test.sps
|
compile-r7rs \
|
||||||
cat ${TESTFILE} >> venv/test.scm
|
-o test-program \
|
||||||
cat ${TESTFILE} >> venv/test.sps
|
test.${SFX}
|
||||||
if [ "${RNRS}" = "r6rs" ]; then if [ -d ../foreign-c ]; then cp -r ../foreign-c/foreign venv/lib/; fi; fi
|
cd .tmp && ./test-program
|
||||||
if [ "${RNRS}" = "r6rs" ]; then cp -r retropikzel venv/lib/; fi
|
|
||||||
#if [ "${SCHEME}" = "chezscheme" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
|
|
||||||
#if [ "${SCHEME}" = "ikarus" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
|
|
||||||
#if [ "${SCHEME}" = "ironscheme" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
|
|
||||||
#if [ "${SCHEME}" = "racket" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
|
|
||||||
if [ "${RNRS}" = "r6rs" ]; then ./venv/bin/akku install akku-r7rs chez-srfi; fi
|
|
||||||
if [ "${SCHEME}" = "chicken" ]; then ./venv/bin/snow-chibi install --always-yes srfi.64; fi
|
|
||||||
if [ "${SCHEME}-${RNRS}" = "mosh-r7rs" ]; then ./venv/bin/snow-chibi install --always-yes srfi.64; fi
|
|
||||||
if [ "${RNRS}" = "r7rs" ]; then ./venv/bin/snow-chibi install ${PKG}; fi
|
|
||||||
|
|
||||||
run-test: init-venv
|
test-docker: testfiles
|
||||||
if [ "${RNRS}" = "r6rs" ]; then ./venv/bin/scheme-compile venv/test.sps; fi
|
cd .tmp && \
|
||||||
if [ "${RNRS}" = "r7rs" ]; then CSC_OPTIONS="-L -lcurl -L -lSDL2 -L -lSDL2_image" ./venv/bin/scheme-compile venv/test.scm; fi
|
COMPILE_R7RS=${SCHEME} \
|
||||||
./venv/test
|
CSC_OPTIONS="${CSC_OPTIONS}" \
|
||||||
|
SNOW_PACKAGES="srfi.64 foreign.c" \
|
||||||
test-r7rs:
|
APT_PACKAGES="${APT_PACKAGES}" \
|
||||||
echo "(import (scheme base) (scheme write) (scheme file) (scheme process-context) (foreign c) (retropikzel ${LIBRARY}) (srfi 64))" > test-r7rs.scm
|
test-r7rs \
|
||||||
cat retropikzel/${LIBRARY}/test.scm >> test-r7rs.scm
|
-o test-program \
|
||||||
COMPILE_R7RS=${SCHEME} timeout 60 compile-scheme -I . -o test-r7rs test-r7rs.scm
|
test.${SFX} \
|
||||||
printf "\n" | timeout 60 ./test-r7rs
|
${PKG}
|
||||||
|
|
||||||
test-r7rs-docker:
|
|
||||||
echo "Building docker image..."
|
|
||||||
docker build --build-arg IMAGE=${DOCKERIMG} --build-arg SCHEME=${SCHEME} --tag=foreign-c-library-test-${SCHEME} --quiet .
|
|
||||||
docker run -t foreign-c-library-test-${SCHEME} sh -c "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} SNOW_CHIBI_ARGS=--always-yes build install test-r7rs"
|
|
||||||
|
|
||||||
example.scm: ${EXAMPLE_FILE}.scm
|
|
||||||
cp ${EXAMPLE_FILE}.scm example.scm
|
|
||||||
|
|
||||||
example-r7rs: example.scm
|
|
||||||
COMPILE_R7RS=${SCHEME} compile-scheme -I . -o example example.scm
|
|
||||||
./example
|
|
||||||
|
|
||||||
test-r6rs:
|
|
||||||
echo "(import (except (rnrs) remove) (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} timeout 60 compile-scheme -I .akku/lib -o test-r6rs test-r6rs.sps
|
|
||||||
timeout 60 ./test-r6rs
|
|
||||||
|
|
||||||
test-r6rs-docker:
|
|
||||||
echo "Building docker image..."
|
|
||||||
docker build --build-arg IMAGE=${DOCKERIMG} --build-arg SCHEME=${SCHEME} --tag=foreign-c-library-test-${SCHEME} --quiet .
|
|
||||||
docker run -t foreign-c-library-test-${SCHEME} sh -c "make SCHEME=${SCHEME} LIBRARY=${LIBRARY} test-r6rs"
|
|
||||||
|
|
||||||
example.sps: ${EXAMPLE_FILE}.sps
|
|
||||||
cp ${EXAMPLE_FILE}.scm example.sps
|
|
||||||
|
|
||||||
example-r6rs: example.sps
|
|
||||||
akku install akku-r7rs "(foreign c)"
|
|
||||||
COMPILE_R7RS=${SCHEME} compile-scheme -I .akku/lib -o example example.sps
|
|
||||||
./example
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
git clean -X -f
|
git clean -X -f
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,437 @@
|
||||||
(define-c-library libc
|
(define-c-library libc '("stdlib.h") #f '())
|
||||||
'("stdlib.h")
|
(define-c-procedure c-perror libc 'perror 'void '(pointer))
|
||||||
libc-name
|
|
||||||
'((additional-versions ("6"))))
|
|
||||||
(define-c-library c-gi
|
(define-c-library c-gi
|
||||||
'("girepository/girepository.h")
|
'("girepository/girepository.h")
|
||||||
"girepository-2.0"
|
"girepository-2.0"
|
||||||
'((additional-versions ("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 c-gi-repository-new c-gi 'gi_repository_new 'pointer '())
|
||||||
(define-c-procedure gi-function-info-invoke c-gi 'gi_function_info_invoke 'int '(pointer pointer int pointer int pointer pointer))
|
(define-c-procedure c-gi-repository-require c-gi 'gi_repository_require 'pointer '(pointer pointer pointer int pointer))
|
||||||
|
(define-c-procedure c-gi-repository-find-by-name c-gi 'gi_repository_find_by_name 'pointer '(pointer pointer pointer))
|
||||||
|
(define-c-procedure c-gi-repository-c-prefix c-gi 'gi_repository_get_c_prefix 'pointer '(pointer pointer))
|
||||||
|
(define-c-procedure c-gi-repository-get-loaded-namespaces c-gi 'gi_repository_get_loaded_namespaces 'pointer '(pointer pointer))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-base-info-get-name c-gi 'gi_base_info_get_name 'pointer '(pointer))
|
||||||
|
(define-c-procedure c-gi-base-info-get-namespace c-gi 'gi_base_info_get_namespace 'pointer '(pointer))
|
||||||
|
(define-c-procedure c-gi-base-info-get-typelib c-gi 'gi_base_info_get_typelib 'pointer '(pointer))
|
||||||
|
(define-c-procedure c-gi-base-info-get-attribute c-gi 'gi_base_info_get_attribute 'pointer '(pointer pointer))
|
||||||
|
(define-c-procedure c-gi-base-info-get-namespace c-gi 'gi_base_info_get_namespace 'pointer '(pointer))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-function-info-invoke c-gi 'gi_function_info_invoke 'int '(pointer pointer int pointer int pointer pointer))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-callable-info-get-return-type c-gi 'gi_callable_info_get_return_type 'pointer '(pointer))
|
||||||
|
(define-c-procedure c-gi-callable-info-get-n-args c-gi 'gi_callable_info_get_n_args 'uint '(pointer))
|
||||||
|
(define-c-procedure c-gi-callable-info-get-arg c-gi 'gi_callable_info_get_arg 'pointer '(pointer uint))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-arg-info-get-type-info c-gi 'gi_arg_info_get_type_info 'pointer '(pointer))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-type-info-get-tag c-gi 'gi_type_info_get_tag 'uint '(pointer))
|
||||||
|
(define-c-procedure c-gi-type-info-get-interface c-gi 'gi_type_info_get_interface 'pointer '(pointer))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-struct-info-find-method c-gi 'gi_struct_info_find_method 'pointer '(pointer pointer))
|
||||||
|
|
||||||
|
(define-c-procedure c-gi-object-info-find-method c-gi 'gi_object_info_find_method 'pointer '(pointer pointer))
|
||||||
|
(define-c-procedure c-gi-object-info-find-signal c-gi 'gi_object_info_find_signal 'pointer '(pointer pointer))
|
||||||
|
|
||||||
|
(define-c-struct-type gerror '((domain u32) (code int) (message pointer)))
|
||||||
|
|
||||||
|
(define GI-TYPE-TAG-VOID 0)
|
||||||
|
(define GI-TYPE-TAG-BOOLEAN 1)
|
||||||
|
(define GI-TYPE-TAG-INT8 2)
|
||||||
|
(define GI-TYPE-TAG-UINT8 3)
|
||||||
|
(define GI-TYPE-TAG-INT16 4)
|
||||||
|
(define GI-TYPE-TAG-UINT16 5)
|
||||||
|
(define GI-TYPE-TAG-INT32 6)
|
||||||
|
(define GI-TYPE-TAG-UINT32 7)
|
||||||
|
(define GI-TYPE-TAG-INT64 8)
|
||||||
|
(define GI-TYPE-TAG-UINT64 9)
|
||||||
|
(define GI-TYPE-TAG-FLOAT 10)
|
||||||
|
(define GI-TYPE-TAG-DOUBLE 11)
|
||||||
|
(define GI-TYPE-TAG-GTYPE 12)
|
||||||
|
(define GI-TYPE-TAG-UTF8 13)
|
||||||
|
(define GI-TYPE-TAG-FILENAME 14)
|
||||||
|
(define GI-TYPE-TAG-ARRAY 15)
|
||||||
|
(define GI-TYPE-TAG-INTERFACE 16)
|
||||||
|
(define GI-TYPE-TAG-GLIST 17)
|
||||||
|
(define GI-TYPE-TAG-GSLIST 18)
|
||||||
|
(define GI-TYPE-TAG-GHASH 19)
|
||||||
|
(define GI-TYPE-TAG-ERROR 20)
|
||||||
|
(define GI-TYPE-TAG-UNICHAR 21)
|
||||||
|
|
||||||
|
(define (gi-type->foreign-c-type type-info)
|
||||||
|
(let* ((tag (c-gi-type-info-get-tag type-info))
|
||||||
|
(result (cond ((= tag GI-TYPE-TAG-VOID)
|
||||||
|
;; FIXME
|
||||||
|
'callback)
|
||||||
|
((= tag GI-TYPE-TAG-BOOLEAN) 'int)
|
||||||
|
((= tag GI-TYPE-TAG-INT8) 'i8)
|
||||||
|
((= tag GI-TYPE-TAG-UINT8) 'u8)
|
||||||
|
((= tag GI-TYPE-TAG-INT16) 'i16)
|
||||||
|
((= tag GI-TYPE-TAG-UINT16) 'u16)
|
||||||
|
((= tag GI-TYPE-TAG-INT32) 'i32)
|
||||||
|
((= tag GI-TYPE-TAG-UINT32) 'u32)
|
||||||
|
((= tag GI-TYPE-TAG-INT64) 'i64)
|
||||||
|
((= tag GI-TYPE-TAG-UINT64) 'u64)
|
||||||
|
((= tag GI-TYPE-TAG-FLOAT) 'float)
|
||||||
|
((= tag GI-TYPE-TAG-DOUBLE) 'double)
|
||||||
|
((= tag GI-TYPE-TAG-GTYPE) 'int)
|
||||||
|
((= tag GI-TYPE-TAG-UTF8) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-FILENAME) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-ARRAY) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-INTERFACE)
|
||||||
|
;(display "HERE: interface name ")
|
||||||
|
;(write (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))))
|
||||||
|
;(newline)
|
||||||
|
;; FIXME Read type from type-info somehow
|
||||||
|
(cond ((or
|
||||||
|
(string=? (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))) "ApplicationFlags")
|
||||||
|
(string=? (c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))) "WindowType"))
|
||||||
|
'int)
|
||||||
|
(else 'pointer)))
|
||||||
|
((= tag GI-TYPE-TAG-GLIST) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-GSLIST) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-GHASH) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-ERROR) 'pointer)
|
||||||
|
((= tag GI-TYPE-TAG-UNICHAR) 'int)
|
||||||
|
(else (error "gi-type->foreign-c-type: Unknown gi-type"
|
||||||
|
(c-bytevector->string (c-gi-base-info-get-name (c-gi-type-info-get-interface type-info))))))))
|
||||||
|
result))
|
||||||
|
|
||||||
|
(define-record-type <gi-repository>
|
||||||
|
(make-gi-repository name cbv)
|
||||||
|
gi-repository?
|
||||||
|
(name gi-repository-name)
|
||||||
|
(cbv gi-repository-cbv))
|
||||||
|
|
||||||
|
(define (gi-repository name version)
|
||||||
|
(let ((repository (c-gi-repository-new))
|
||||||
|
(err (c-bytevector-null)))
|
||||||
|
(call-with-address-of
|
||||||
|
err
|
||||||
|
(lambda (err-address)
|
||||||
|
(c-gi-repository-require repository
|
||||||
|
(string->c-bytevector name)
|
||||||
|
(string->c-bytevector version)
|
||||||
|
0
|
||||||
|
err-address)))
|
||||||
|
(when (not (c-bytevector-null? err))
|
||||||
|
(let* ((error-list (c-bytevector->list err gerror))
|
||||||
|
(msg (c-bytevector->string (cdr (assoc 'message error-list)))))
|
||||||
|
(c-bytevector-free (cdr (assoc 'message error-list)))
|
||||||
|
(c-bytevector-free repository)
|
||||||
|
(error (string-append "load-gi-repository: " msg)
|
||||||
|
(car error-list)
|
||||||
|
(cadr error-list))))
|
||||||
|
(make-gi-repository name repository)))
|
||||||
|
|
||||||
|
(define (gi-repository-info repository)
|
||||||
|
(let*
|
||||||
|
((cbv (gi-repository-cbv repository))
|
||||||
|
(c-prefix (c-bytevector->string
|
||||||
|
(c-gi-repository-c-prefix cbv
|
||||||
|
(string->c-bytevector
|
||||||
|
(gi-repository-name repository)))))
|
||||||
|
(loaded-namespaces
|
||||||
|
(letrec* ((count-cbv (make-c-bytevector (c-type-size 'int)))
|
||||||
|
(namespaces (c-gi-repository-get-loaded-namespaces cbv count-cbv))
|
||||||
|
(count (c-bytevector-ref count-cbv 'int 0))
|
||||||
|
(looper
|
||||||
|
(lambda (index result)
|
||||||
|
(if (= index count)
|
||||||
|
result
|
||||||
|
(looper (+ index 1)
|
||||||
|
(append result
|
||||||
|
(list
|
||||||
|
(c-bytevector->string (c-bytevector-ref namespaces
|
||||||
|
'pointer
|
||||||
|
(* (c-type-size 'pointer) index))))))))))
|
||||||
|
(looper 0 '())
|
||||||
|
))
|
||||||
|
)
|
||||||
|
`((c-prefix . ,c-prefix)
|
||||||
|
(loaded-namespaces . ,loaded-namespaces)
|
||||||
|
)))
|
||||||
|
|
||||||
|
(define (gi-function-info repository function-name)
|
||||||
|
(let ((info (c-gi-repository-find-by-name
|
||||||
|
(gi-repository-cbv repository)
|
||||||
|
(string->c-bytevector (gi-repository-name repository))
|
||||||
|
(string->c-bytevector function-name))))
|
||||||
|
(if (c-bytevector-null? info)
|
||||||
|
#f
|
||||||
|
(letrec*
|
||||||
|
((return-info (c-gi-callable-info-get-return-type info))
|
||||||
|
(return-type (gi-type->foreign-c-type return-info))
|
||||||
|
(argument-count (c-gi-callable-info-get-n-args info))
|
||||||
|
(argument-types-loop
|
||||||
|
(lambda (index result)
|
||||||
|
(if (= index argument-count)
|
||||||
|
result
|
||||||
|
(argument-types-loop
|
||||||
|
(+ index 1)
|
||||||
|
(append
|
||||||
|
result
|
||||||
|
(list
|
||||||
|
(let* ((arg-info (c-gi-callable-info-get-arg info index))
|
||||||
|
(type-info (c-gi-arg-info-get-type-info arg-info))
|
||||||
|
(type (gi-type->foreign-c-type type-info)))
|
||||||
|
`((type . ,type)
|
||||||
|
(index . ,index)))))))))
|
||||||
|
(argument-types (argument-types-loop 0 '())))
|
||||||
|
`((namespace . ,(gi-repository-name repository))
|
||||||
|
(function-name . ,function-name)
|
||||||
|
(return-type . ,return-type)
|
||||||
|
(argument-count . ,argument-count)
|
||||||
|
(argument-types . ,argument-types)
|
||||||
|
(info-cbv . ,info))))))
|
||||||
|
|
||||||
|
(define (gi-invoke repository name . args)
|
||||||
|
(when (not (gi-repository? repository))
|
||||||
|
(error "gi-invoke: repository argument must be gi-repository" repository))
|
||||||
|
(when (not (string? name))
|
||||||
|
(error "gi-invoke: name argument must be string" name))
|
||||||
|
(letrec*
|
||||||
|
((function-info
|
||||||
|
(let ((function-info
|
||||||
|
(c-gi-repository-find-by-name
|
||||||
|
(gi-repository-cbv repository)
|
||||||
|
(string->c-bytevector (gi-repository-name repository))
|
||||||
|
(string->c-bytevector name))))
|
||||||
|
(when (c-bytevector-null? function-info)
|
||||||
|
(error "gi-invoke: Repository has not function"
|
||||||
|
(gi-repository-name repository)
|
||||||
|
name))
|
||||||
|
function-info))
|
||||||
|
(function-return-info (c-gi-callable-info-get-return-type function-info))
|
||||||
|
(return-type (gi-type->foreign-c-type function-return-info))
|
||||||
|
(n-args (let ((n-args (c-gi-callable-info-get-n-args function-info)))
|
||||||
|
(when (not (= n-args (length args)))
|
||||||
|
(error
|
||||||
|
(string-append "gi-invoke: Argument count mismatch, got "
|
||||||
|
(number->string (length args))
|
||||||
|
", wanted "
|
||||||
|
(number->string n-args))
|
||||||
|
;(gi-object-namespace object)
|
||||||
|
;(gi-object-name object)
|
||||||
|
name))
|
||||||
|
n-args))
|
||||||
|
(arg-info-looper
|
||||||
|
(lambda (index result)
|
||||||
|
(if (or (= index n-args)
|
||||||
|
(= index (length args)))
|
||||||
|
result
|
||||||
|
(arg-info-looper
|
||||||
|
(+ index 1)
|
||||||
|
(append
|
||||||
|
result
|
||||||
|
(list
|
||||||
|
(let* ((arg-info (c-gi-callable-info-get-arg function-info index))
|
||||||
|
(type-info (c-gi-arg-info-get-type-info arg-info))
|
||||||
|
(type (gi-type->foreign-c-type type-info)))
|
||||||
|
(cons type (list-ref args index)))))))))
|
||||||
|
(arg-info (arg-info-looper 0 '()))
|
||||||
|
(arg-cbv (make-c-bytevector 1024))
|
||||||
|
(arg-cbv-offset 0)
|
||||||
|
(invoke-error (c-bytevector-null))
|
||||||
|
(return-value (make-c-bytevector 1024)))
|
||||||
|
(for-each
|
||||||
|
(lambda (arg)
|
||||||
|
(c-bytevector-set! arg-cbv
|
||||||
|
(car arg)
|
||||||
|
arg-cbv-offset
|
||||||
|
(if (string? (cdr arg))
|
||||||
|
(string->c-bytevector (cdr arg))
|
||||||
|
(cdr arg)))
|
||||||
|
(set! arg-cbv-offset (+ arg-cbv-offset (c-type-size (car arg)))))
|
||||||
|
arg-info)
|
||||||
|
(c-gi-function-info-invoke function-info
|
||||||
|
arg-cbv
|
||||||
|
n-args
|
||||||
|
(c-bytevector-null)
|
||||||
|
0
|
||||||
|
return-value
|
||||||
|
invoke-error)
|
||||||
|
(when (not (symbol=? return-type 'void))
|
||||||
|
(c-bytevector-ref return-value return-type 0))))
|
||||||
|
|
||||||
|
(define (gi-struct repository namespace name)
|
||||||
|
(let ((base-info
|
||||||
|
(c-gi-repository-find-by-name (gi-repository-cbv repository)
|
||||||
|
(string->c-bytevector namespace)
|
||||||
|
(string->c-bytevector name))))
|
||||||
|
(when (c-bytevector-null? base-info)
|
||||||
|
(c-perror (string->c-bytevector "(C perror) gi-object"))
|
||||||
|
(error "gi-object: ERROR" namespace name base-info))
|
||||||
|
base-info))
|
||||||
|
|
||||||
|
(define (gi-struct-method-info struct method-name)
|
||||||
|
(let ((info (c-gi-struct-info-find-method struct (string->c-bytevector method-name))))
|
||||||
|
(if (c-bytevector-null? info)
|
||||||
|
#f
|
||||||
|
(letrec*
|
||||||
|
((return-info (c-gi-callable-info-get-return-type info))
|
||||||
|
(return-type (gi-type->foreign-c-type return-info))
|
||||||
|
(argument-count (c-gi-callable-info-get-n-args info))
|
||||||
|
(argument-types-loop
|
||||||
|
(lambda (index result)
|
||||||
|
(if (= index argument-count)
|
||||||
|
result
|
||||||
|
(argument-types-loop
|
||||||
|
(+ index 1)
|
||||||
|
(append
|
||||||
|
result
|
||||||
|
(list
|
||||||
|
(let* ((arg-info (c-gi-callable-info-get-arg info index))
|
||||||
|
(type-info (c-gi-arg-info-get-type-info arg-info))
|
||||||
|
(type (gi-type->foreign-c-type type-info)))
|
||||||
|
`((type . ,type)
|
||||||
|
(index . ,index)))))))))
|
||||||
|
(argument-types (argument-types-loop 0 '())))
|
||||||
|
`((namespace . ,(gi-info-namespace struct))
|
||||||
|
(struct-name . ,(gi-info-name struct))
|
||||||
|
(method-name . ,method-name)
|
||||||
|
(return-type . ,return-type)
|
||||||
|
(argument-count . ,argument-count)
|
||||||
|
(argument-types . ,argument-types)
|
||||||
|
(info-cbv . ,info))))))
|
||||||
|
|
||||||
|
(define (gi-struct-invoke struct method-name . args)
|
||||||
|
(let ((method-info (gi-struct-method-info struct method-name)))
|
||||||
|
(when (not method-info)
|
||||||
|
(error "gi-struct-invoke: Struct has no method" struct method-name))
|
||||||
|
(when (not (= (cdr (assoc 'argument-count method-info)) (length args)))
|
||||||
|
(error
|
||||||
|
(string-append "gi-struct-invoke: Argument count mismatch, got "
|
||||||
|
(number->string (length args))
|
||||||
|
", wanted "
|
||||||
|
(number->string (cdr (assoc 'argument-count method-info))))
|
||||||
|
(gi-struct-namespace struct)
|
||||||
|
(gi-struct-name struct)
|
||||||
|
method-name))
|
||||||
|
(let
|
||||||
|
((info-cbv (cdr (assoc 'info-cbv method-info)))
|
||||||
|
(arg-cbv (make-c-bytevector 1024))
|
||||||
|
(arg-cbv-offset 0)
|
||||||
|
(invoke-error (c-bytevector-null))
|
||||||
|
(return-value (make-c-bytevector 1024)))
|
||||||
|
(for-each
|
||||||
|
(lambda (arg)
|
||||||
|
(let ((value (list-ref args (cdr (assoc 'index arg)))))
|
||||||
|
(c-bytevector-set! arg-cbv
|
||||||
|
(cdr (assoc 'type arg))
|
||||||
|
arg-cbv-offset
|
||||||
|
(if (string? value)
|
||||||
|
(string->c-bytevector value)
|
||||||
|
value))
|
||||||
|
(set! arg-cbv-offset (+ arg-cbv-offset (c-type-size (cdr (assoc 'type arg)))))))
|
||||||
|
(cdr (assoc 'argument-types method-info)))
|
||||||
|
(c-gi-function-info-invoke info-cbv
|
||||||
|
arg-cbv
|
||||||
|
(cdr (assoc 'argument-count method-info))
|
||||||
|
(c-bytevector-null)
|
||||||
|
0
|
||||||
|
return-value
|
||||||
|
invoke-error)
|
||||||
|
(if (not (symbol=? (cdr (assoc 'return-type method-info)) 'void))
|
||||||
|
(c-bytevector-ref return-value
|
||||||
|
(cdr (assoc 'return-type method-info))
|
||||||
|
0)))))
|
||||||
|
|
||||||
|
(define (gi-object repository namespace name)
|
||||||
|
(let ((base-info
|
||||||
|
(c-gi-repository-find-by-name (gi-repository-cbv repository)
|
||||||
|
(string->c-bytevector namespace)
|
||||||
|
(string->c-bytevector name))))
|
||||||
|
(when (c-bytevector-null? base-info)
|
||||||
|
(c-perror (string->c-bytevector "(C perror) gi-object"))
|
||||||
|
(error "gi-object: ERROR" namespace name base-info))
|
||||||
|
base-info))
|
||||||
|
|
||||||
|
(define (gi-info-namespace info)
|
||||||
|
(c-bytevector->string (c-gi-base-info-get-namespace info)))
|
||||||
|
(define gi-object-namespace gi-info-namespace)
|
||||||
|
(define gi-struct-namespace gi-info-namespace)
|
||||||
|
|
||||||
|
(define (gi-info-name info)
|
||||||
|
(c-bytevector->string (c-gi-base-info-get-name info)))
|
||||||
|
(define gi-object-name gi-info-name)
|
||||||
|
(define gi-struct-name gi-info-name)
|
||||||
|
|
||||||
|
(define (gi-object-method-info object method-name)
|
||||||
|
(let ((info (c-gi-object-info-find-method object (string->c-bytevector method-name))))
|
||||||
|
(if (c-bytevector-null? info)
|
||||||
|
#f
|
||||||
|
(letrec*
|
||||||
|
((return-info (c-gi-callable-info-get-return-type info))
|
||||||
|
(return-type (gi-type->foreign-c-type return-info))
|
||||||
|
(argument-count (c-gi-callable-info-get-n-args info))
|
||||||
|
(argument-types-loop
|
||||||
|
(lambda (index result)
|
||||||
|
(if (= index argument-count)
|
||||||
|
result
|
||||||
|
(argument-types-loop
|
||||||
|
(+ index 1)
|
||||||
|
(append
|
||||||
|
result
|
||||||
|
(list
|
||||||
|
(let* ((arg-info (c-gi-callable-info-get-arg info index))
|
||||||
|
(type-info (c-gi-arg-info-get-type-info arg-info))
|
||||||
|
(type (gi-type->foreign-c-type type-info)))
|
||||||
|
`((type . ,type)
|
||||||
|
(index . ,index)))))))))
|
||||||
|
(argument-types (argument-types-loop 0 '())))
|
||||||
|
`((namespace . ,(gi-info-namespace object))
|
||||||
|
(object-name . ,(gi-info-name object))
|
||||||
|
(method-name . ,method-name)
|
||||||
|
(return-type . ,return-type)
|
||||||
|
(argument-count . ,argument-count)
|
||||||
|
(argument-types . ,argument-types)
|
||||||
|
(info-cbv . ,info))))))
|
||||||
|
|
||||||
|
(define (gi-object-invoke object method-name . args)
|
||||||
|
(let ((method-info (gi-object-method-info object method-name)))
|
||||||
|
(when (not method-info)
|
||||||
|
(error "gi-object-invoke: Object has no method" object method-name))
|
||||||
|
(when (not (= (cdr (assoc 'argument-count method-info)) (length args)))
|
||||||
|
(error
|
||||||
|
(string-append "gi-object-invoke: Argument count mismatch, got "
|
||||||
|
(number->string (length args))
|
||||||
|
", wanted "
|
||||||
|
(number->string (cdr (assoc 'argument-count method-info))))
|
||||||
|
(gi-object-namespace object)
|
||||||
|
(gi-object-name object)
|
||||||
|
method-name))
|
||||||
|
(let
|
||||||
|
((info-cbv (cdr (assoc 'info-cbv method-info)))
|
||||||
|
(arg-cbv (make-c-bytevector 1024))
|
||||||
|
(arg-cbv-offset 0)
|
||||||
|
(invoke-error (c-bytevector-null))
|
||||||
|
(return-value (make-c-bytevector 1024)))
|
||||||
|
(for-each
|
||||||
|
(lambda (arg)
|
||||||
|
(display "HERE: arg ")
|
||||||
|
(write arg)
|
||||||
|
(newline)
|
||||||
|
(let ((value (list-ref args (cdr (assoc 'index arg)))))
|
||||||
|
(c-bytevector-set! arg-cbv
|
||||||
|
(cdr (assoc 'type arg))
|
||||||
|
arg-cbv-offset
|
||||||
|
(if (string? value)
|
||||||
|
(string->c-bytevector value)
|
||||||
|
value))
|
||||||
|
(set! arg-cbv-offset (+ arg-cbv-offset (c-type-size (cdr (assoc 'type arg)))))))
|
||||||
|
(cdr (assoc 'argument-types method-info)))
|
||||||
|
(c-gi-function-info-invoke info-cbv
|
||||||
|
arg-cbv
|
||||||
|
(cdr (assoc 'argument-count method-info))
|
||||||
|
(c-bytevector-null)
|
||||||
|
0
|
||||||
|
return-value
|
||||||
|
invoke-error)
|
||||||
|
(if (not (symbol=? (cdr (assoc 'return-type method-info)) 'void))
|
||||||
|
(c-bytevector-ref return-value
|
||||||
|
(cdr (assoc 'return-type method-info))
|
||||||
|
0)))))
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,24 @@
|
||||||
(import (scheme base)
|
(import (scheme base)
|
||||||
(scheme write)
|
(scheme write)
|
||||||
(foreign c))
|
(foreign c))
|
||||||
(export gi-repository-new
|
(export gi-repository
|
||||||
gi-repository-require
|
gi-repository-info
|
||||||
gi-repository-find-by-name
|
gi-function-info
|
||||||
gi-function-info-invoke)
|
gi-invoke
|
||||||
|
|
||||||
|
gi-struct
|
||||||
|
gi-struct-method-info
|
||||||
|
gi-struct-namespace
|
||||||
|
gi-struct-name
|
||||||
|
gi-struct-invoke
|
||||||
|
|
||||||
|
gi-object
|
||||||
|
gi-object-info
|
||||||
|
gi-object-namespace
|
||||||
|
gi-object-name
|
||||||
|
gi-object-method-info
|
||||||
|
gi-object-invoke
|
||||||
|
gi-info-namespace
|
||||||
|
|
||||||
|
)
|
||||||
(include "gi-repository.scm"))
|
(include "gi-repository.scm"))
|
||||||
|
|
|
||||||
|
|
@ -1,55 +1,44 @@
|
||||||
|
|
||||||
(test-begin "gi-repository")
|
;(test-begin "gi-repository")
|
||||||
|
(define-c-library libc '("stdlib.h" "stdio.h" "string.h" "stdio.h") #f ())
|
||||||
|
(define-c-procedure c-puts libc 'puts 'int '(pointer))
|
||||||
|
|
||||||
(define repository (gi-repository-new))
|
(define gtk (gi-repository "Gtk" "4.0"))
|
||||||
(display repository)
|
(define gtk-application (gi-object gtk "Gtk" "Application"))
|
||||||
|
(define gtk-window (gi-object gtk "Gtk" "ApplicationWindow"))
|
||||||
|
|
||||||
|
(define gobject (gi-repository "GObject" "2.0"))
|
||||||
|
(define gobject-object (gi-object gtk "GObject" "Object"))
|
||||||
|
(define gobject-closure (gi-struct gtk "GObject" "Closure"))
|
||||||
|
|
||||||
|
(define gio (gi-repository "Gio" "2.0"))
|
||||||
|
(define gio-application (gi-object gio "Gio" "Application"))
|
||||||
|
|
||||||
|
(define app (gi-object-invoke gtk-application "new" "org.hello.world" 0))
|
||||||
|
|
||||||
|
;(display "HERE: method-info ")
|
||||||
|
;(write (gi-object-method-info gtk-window "new"))
|
||||||
|
;(newline)
|
||||||
|
|
||||||
|
(define-c-callback
|
||||||
|
closure-process
|
||||||
|
'void
|
||||||
|
'(pointer pointer int pointer pointer pointer)
|
||||||
|
(lambda (closure return-value n-param-values param-values invocation-hint marshal-data)
|
||||||
|
;(c-puts (string->c-bytevector "HERE IN CLOSURE"))
|
||||||
|
(display "HERE: in closure")
|
||||||
|
(newline)
|
||||||
|
))
|
||||||
|
(define closure (gi-struct-invoke gobject-closure "new_simple" 128 closure-process))
|
||||||
|
|
||||||
|
(gi-invoke gobject "signal_connect_closure" app "activate" closure 0)
|
||||||
|
(display "HERE: method-info ")
|
||||||
|
(write (gi-object-method-info gio-application "run"))
|
||||||
(newline)
|
(newline)
|
||||||
|
|
||||||
(define err (make-c-null))
|
(display (gi-object-invoke gio-application "run" app 0 (c-bytevector-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)
|
(newline)
|
||||||
)))
|
|
||||||
|
|
||||||
(test-end "gi-repository")
|
|
||||||
|
;|#
|
||||||
|
;(test-end "gi-repository")
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
# requests
|
Scheme library to make https requests. Built with (foreign c) and libcurl.
|
||||||
|
|
||||||
Scheme library to make https requests. Built with
|
|
||||||
[foreign c](https://sr.ht/~retropikzel/foreign-c/) and libcurl.
|
|
||||||
|
|
||||||
[Repository](https://git.sr.ht/~retropikzel/foreign-c-requests)
|
[Repository](https://git.sr.ht/~retropikzel/foreign-c-requests)
|
||||||
|
|
||||||
|
|
@ -9,15 +6,11 @@ Scheme library to make https requests. Built with
|
||||||
|
|
||||||
[Jenkins](https://jenkins.scheme.org/job/foreign_c/job/foreign-c-requests/)
|
[Jenkins](https://jenkins.scheme.org/job/foreign_c/job/foreign-c-requests/)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Caveats
|
## Caveats
|
||||||
|
|
||||||
- Not yet working on Mosh
|
- Not yet working on Mosh
|
||||||
- No cookie reading support yet
|
- No cookie reading support yet
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
Depends on libcurl, on Debian/Ubuntu:
|
Depends on libcurl, on Debian/Ubuntu:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
(define exit? #f)
|
(define exit? #f)
|
||||||
(define scale-x 1.0)
|
(define scale-x 1.0)
|
||||||
(define scale-y 1.0)
|
(define scale-y 1.0)
|
||||||
(define events (list))
|
(define events '())
|
||||||
(define current-bitmap-font #f)
|
(define current-bitmap-font #f)
|
||||||
(define current-line-size 1)
|
(define current-line-size 1)
|
||||||
(define draw-color-r 0)
|
(define draw-color-r 0)
|
||||||
|
|
@ -51,31 +51,21 @@
|
||||||
(define event* (make-c-bytevector 4000))
|
(define event* (make-c-bytevector 4000))
|
||||||
(define draw-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
|
(define draw-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
|
||||||
(define draw-slice-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
|
(define draw-slice-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
|
||||||
(define fill-triangle-vertex-size 128) ;(+ (* (c-type-size 'int) 6) (* (c-type-size 'float) 2))
|
(define fill-triangle-vertex-size (+ (* (c-type-size 'int) 6) (* (c-type-size 'float) 2)))
|
||||||
(define fill-triangle-vertex1* (make-c-bytevector fill-triangle-vertex-size 0))
|
(define fill-triangle-vertex1* (make-c-bytevector fill-triangle-vertex-size 0))
|
||||||
(define fill-triangle-vertex2* (make-c-bytevector fill-triangle-vertex-size 0))
|
(define fill-triangle-vertex2* (make-c-bytevector fill-triangle-vertex-size 0))
|
||||||
(define fill-triangle-vertex3* (make-c-bytevector fill-triangle-vertex-size 0))
|
(define fill-triangle-vertex3* (make-c-bytevector fill-triangle-vertex-size 0))
|
||||||
(define fill-triangle-vertexes* (make-c-bytevector (* fill-triangle-vertex-size 3 0)))
|
(define fill-triangle-vertexes* (make-c-bytevector (* fill-triangle-vertex-size 3 0)))
|
||||||
(c-bytevector-set! fill-triangle-vertexes*
|
(c-bytevector-set!
|
||||||
'pointer
|
fill-triangle-vertexes* 'pointer (* fill-triangle-vertex-size 0) fill-triangle-vertex1*)
|
||||||
(* fill-triangle-vertex-size 0)
|
(c-bytevector-set!
|
||||||
fill-triangle-vertex1*)
|
fill-triangle-vertexes* 'pointer (* fill-triangle-vertex-size 1) fill-triangle-vertex2*)
|
||||||
(c-bytevector-set! fill-triangle-vertexes*
|
(c-bytevector-set!
|
||||||
'pointer
|
fill-triangle-vertexes* 'pointer (* fill-triangle-vertex-size 2) fill-triangle-vertex3*)
|
||||||
(* fill-triangle-vertex-size 1)
|
|
||||||
fill-triangle-vertex2*)
|
|
||||||
(c-bytevector-set! fill-triangle-vertexes*
|
|
||||||
'pointer
|
|
||||||
(* fill-triangle-vertex-size 2)
|
|
||||||
fill-triangle-vertex3*)
|
|
||||||
|
|
||||||
(define update-procedure #f)
|
|
||||||
(define draw-procedure #f)
|
|
||||||
|
|
||||||
(define main-loop-start-time 0)
|
(define main-loop-start-time 0)
|
||||||
(define delta-time 0)
|
(define delta-time 0)
|
||||||
(define main-loop
|
(define (main-loop update-procedure draw-procedure)
|
||||||
(lambda ()
|
|
||||||
(set! main-loop-start-time (current-jiffy))
|
(set! main-loop-start-time (current-jiffy))
|
||||||
(sdl2-events-get)
|
(sdl2-events-get)
|
||||||
(update-procedure delta-time (poll-events!))
|
(update-procedure delta-time (poll-events!))
|
||||||
|
|
@ -83,7 +73,7 @@
|
||||||
(draw-procedure)
|
(draw-procedure)
|
||||||
(render-present)
|
(render-present)
|
||||||
(set! delta-time (/ (- (current-jiffy) main-loop-start-time) (jiffies-per-second)))
|
(set! delta-time (/ (- (current-jiffy) main-loop-start-time) (jiffies-per-second)))
|
||||||
(unless exit? (main-loop))))
|
(unless exit? (main-loop update-procedure draw-procedure)))
|
||||||
|
|
||||||
(define sdl2-event->spite-event
|
(define sdl2-event->spite-event
|
||||||
(lambda (event)
|
(lambda (event)
|
||||||
|
|
@ -304,13 +294,11 @@
|
||||||
(cons 'y (c-bytevector-ref y 'float 0))))))
|
(cons 'y (c-bytevector-ref y 'float 0))))))
|
||||||
|
|
||||||
(define spite-start
|
(define spite-start
|
||||||
(lambda (new-update-procedure new-draw-procedure)
|
(lambda (update-procedure draw-procedure)
|
||||||
(set! update-procedure new-update-procedure)
|
|
||||||
(set! draw-procedure new-draw-procedure)
|
|
||||||
(cond
|
(cond
|
||||||
((not started?)
|
((not started?)
|
||||||
(set! started? #t)
|
(set! started? #t)
|
||||||
(main-loop)))))
|
(main-loop update-procedure draw-procedure)))))
|
||||||
|
|
||||||
(define spite-init
|
(define spite-init
|
||||||
(lambda (title width height)
|
(lambda (title width height)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue