Commit 00c76b07 authored by Thierry Martinez's avatar Thierry Martinez

Graphviz

parent e94dad9d
...@@ -2,9 +2,9 @@ MODULES=$(shell sed -n -E 's/^- (.*\.pl)$$/\1/p' toc.org) ...@@ -2,9 +2,9 @@ MODULES=$(shell sed -n -E 's/^- (.*\.pl)$$/\1/p' toc.org)
# load_test_files/1 should make this useless, but I cannot find how to use it # load_test_files/1 should make this useless, but I cannot find how to use it
TEST_MODULES=$(wildcard $(MODULES:.pl=.plt)) TEST_MODULES=$(wildcard $(MODULES:.pl=.plt))
all: biocham biocham_debug tests doc all: biocham biocham_debug test doc
.PHONY: tests doc clean .PHONY: test doc clean
biocham: $(MODULES) toc.org Makefile biocham: $(MODULES) toc.org Makefile
@echo $(MODULES) @echo $(MODULES)
...@@ -13,7 +13,7 @@ biocham: $(MODULES) toc.org Makefile ...@@ -13,7 +13,7 @@ biocham: $(MODULES) toc.org Makefile
biocham_debug: $(MODULES) $(TEST_MODULES) toc.org Makefile biocham_debug: $(MODULES) $(TEST_MODULES) toc.org Makefile
swipl -o biocham_debug --goal=initialize -c $(MODULES) $(TEST_MODULES) swipl -o biocham_debug --goal=initialize -c $(MODULES) $(TEST_MODULES)
tests: biocham_tests test: biocham_tests
./biocham_tests ./biocham_tests
doc: biocham doc: biocham
......
CC=swipl-ld
LDFLAGS=-shared
all: graphviz_swiprolog test
.PHONY: clean test
clean:
rm -f graphviz_swiprolog graphviz_swiprolog.so graphviz_swiprolog.o
graphviz_swiprolog: graphviz_swiprolog.o
swipl-ld -shared -o graphviz_swiprolog graphviz_swiprolog.o
mv graphviz_swiprolog.so graphviz_swiprolog
graphviz_swiprolog.o: graphviz_swiprolog.c
test:
swipl -g "\
call_cleanup((['graphviz.plt'], run_tests, halt(0)), halt(1))\
"
:- module(
graphviz,
[
agclose/1,
agread/2,
gvFreeLayout/1,
gvLayout/2,
gvRender/3
]
).
:- use_foreign_library(foreign(graphviz_swiprolog)).
:- use_module(library(plunit)).
:- use_module(graphviz).
:- begin_tests(graphviz).
test(say_hello) :-
say_hello('Hello world.').
:- end_tests(graphviz).
#include <stdio.h>
#include <SWI-Prolog.h> #include <SWI-Prolog.h>
#include <gvc.h>
GVC_t *gvc;
static foreign_t
pl_agclose(term_t graph_term) {
Agraph_t *graph;
if (!PL_get_pointer(graph_term, &graph)) {
PL_fail;
}
agclose(graph);
PL_succeed;
}
static foreign_t
pl_agread(term_t filename_term, term_t graph_term) {
char *filename;
FILE *file;
Agraph_t *graph;
if (!PL_get_atom_chars(filename_term, &filename)) {
PL_fail;
}
file = fopen(filename, "r");
graph = agread(file);
fclose(file);
if (!PL_put_pointer(graph_term, graph)) {
agclose(graph);
PL_fail;
}
PL_succeed;
}
static foreign_t static foreign_t
pl_say_hello(term_t to) { pl_gvFreeLayout(term_t graph_term) {
char *a; Agraph_t *graph;
if (!PL_get_pointer(graph_term, &graph)) {
PL_fail;
}
gvFreeLayout(gvc, graph);
PL_succeed;
}
if (PL_get_atom_chars(to, &a)) { static foreign_t
PL_succeed; pl_gvLayout(term_t graph_term, term_t engine_term) {
Agraph_t *graph;
char *engine;
if (!PL_get_pointer(graph_term, &graph)) {
PL_fail;
} }
if (!PL_get_atom_chars(engine_term, &engine)) {
PL_fail;
}
gvLayout(gvc, graph, engine);
PL_succeed;
}
PL_fail; static foreign_t
pl_gvRender(term_t graph_term, term_t format_term, term_t filename) {
Agraph_t *graph;
char *format;
FILE *file;
if (!PL_get_pointer(graph_term, &graph)) {
PL_fail;
}
if (!PL_get_atom_chars(format_term, &format)) {
PL_fail;
}
if (!PL_get_atom_chars(filename_term, &filename)) {
PL_fail;
}
file = fopen(filename, "w");
gvRender(gvc, graph, format, file);
PL_succeed;
} }
install_t install_t
install_mylib() { install_graphviz_swiprolog() {
PL_register_foreign("say_hello", 1, pl_say_hello, 0); gvc = gvContext();
PL_register_foreign("agclose", 1, pl_agclose, 0);
PL_register_foreign("agread", 2, pl_agread, 0);
PL_register_foreign("gvFreeLayout", 1, pl_gvFreeLayout, 0);
PL_register_foreign("gvLayout", 2, pl_gvLayout, 0);
PL_register_foreign("gvRender", 3, pl_gvRender, 0);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment