]> gitweb.factorcode.org Git - factor.git/blob - extra/graphviz/ffi/ffi.factor
f6d84aef42993458b675bd7930f14edf73c50397
[factor.git] / extra / graphviz / ffi / ffi.factor
1 ! Copyright (C) 2011 Alex Vondrak.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.c-types alien.data
4 alien.destructors alien.libraries alien.strings alien.syntax
5 combinators debugger destructors fry graphviz io
6 io.encodings.ascii kernel libc literals locals math memoize
7 prettyprint sequences specialized-arrays splitting system ;
8 SPECIALIZED-ARRAY: void*
9 IN: graphviz.ffi
10
11 <<
12 "libgraph" {
13     { [ os macosx? ] [ "libgraph.dylib" ] }
14     { [ os unix?   ] [ "libgraph.so"    ] }
15     { [ os winnt?  ] [ "graph.dll"      ] }
16 } cond cdecl add-library
17
18 "libgvc"
19 {
20     { [ os macosx? ] [ "libgvc.dylib" ] }
21     { [ os unix?   ] [ "libgvc.so"    ] }
22     { [ os winnt?  ] [ "gvc.dll"      ] }
23 } cond cdecl add-library
24 >>
25
26 LIBRARY: libgraph
27
28 ! Types
29
30 C-TYPE: Agraph_t
31 C-TYPE: Agnode_t
32 C-TYPE: Agedge_t
33
34 ! Graphs & subgraphs
35
36 FUNCTION: Agraph_t* agopen  ( c-string name, int kind ) ;
37 FUNCTION: Agraph_t* agsubg  ( Agraph_t* g, c-string name ) ;
38 FUNCTION: void      agclose ( Agraph_t* g ) ;
39
40 DESTRUCTOR: agclose
41
42 : kind ( graph -- magic-constant )
43     [ directed?>> ] [ strict?>> ] bi
44     [ 3 2 ? ] [ 1 0 ? ] if ;
45
46 ! Nodes
47
48 FUNCTION: Agnode_t* agnode    ( Agraph_t* g, c-string name ) ;
49 FUNCTION: Agnode_t* agfstnode ( Agraph_t* g ) ;
50 FUNCTION: Agnode_t* agnxtnode ( Agraph_t* g, Agnode_t* n ) ;
51
52 <PRIVATE
53
54 : next-node ( g n -- g n' )
55     [ dup ] dip agnxtnode ; inline
56
57 : (each-node) ( Agraph_t* Agnode_t* quot -- )
58     '[ [ nip @ ] 2keep next-node dup ] loop 2drop ; inline
59
60 PRIVATE>
61
62 : each-node ( Agraph_t* quot -- )
63     [ dup agfstnode ] dip
64     over [ (each-node) ] [ 3drop ] if ; inline
65
66 ! Edges
67
68 FUNCTION: Agedge_t* agedge ( Agraph_t* g,
69                              Agnode_t* t,
70                              Agnode_t* h ) ;
71
72 ! Attributes
73
74 FUNCTION: Agnode_t* agprotonode ( Agraph_t* g ) ;
75 FUNCTION: Agedge_t* agprotoedge ( Agraph_t* g ) ;
76
77 FUNCTION: c-string  agget ( void* obj, c-string name ) ;
78
79 FUNCTION: int agsafeset ( void* obj,
80                           c-string name,
81                           c-string value,
82                           c-string default ) ;
83
84
85 LIBRARY: libgvc
86
87 ! Graphviz contexts
88
89 C-TYPE: GVC_t
90
91 FUNCTION: GVC_t* gvContext ( ) ;
92
93 <PRIVATE
94
95 FUNCTION-ALIAS: int-gvFreeContext
96     int gvFreeContext ( GVC_t* gvc ) ;
97
98 PRIVATE>
99
100 ERROR: ffi-errors n ;
101 M: ffi-errors error.
102     "Graphviz FFI indicates that " write
103     n>> pprint
104     " error(s) occurred while rendering." print
105     "(The messages were probably printed to STDERR.)" print ;
106
107 : gvFreeContext ( gvc -- )
108     int-gvFreeContext dup zero? [ drop ] [ ffi-errors ] if ;
109
110 DESTRUCTOR: gvFreeContext
111
112 ! Layout
113
114 FUNCTION: int gvLayout     ( GVC_t* gvc,
115                              Agraph_t* g,
116                              c-string engine ) ;
117 FUNCTION: int gvFreeLayout ( GVC_t* gvc, Agraph_t* g ) ;
118
119 ! Rendering
120
121 FUNCTION: int gvRenderFilename ( GVC_t* gvc,
122                                  Agraph_t* g,
123                                  c-string format,
124                                  c-string filename ) ;
125
126 ! Supported layout engines (dot, neato, etc.) and output
127 ! formats (png, jpg, etc.)
128 <PRIVATE
129
130 ENUM: api_t
131 API_render
132 API_layout
133 API_textlayout
134 API_device
135 API_loadimage ;
136
137 FUNCTION: char**
138           gvPluginList
139           ( GVC_t* gvc, c-string kind, int* size, c-string str ) ;
140
141 :: plugin-list ( kind-string -- seq )
142     [
143         gvContext &gvFreeContext
144         kind-string
145         0 int <ref> dup :> size*
146         f
147         gvPluginList &(free) :> ret
148         size* int deref :> size
149         ret size <direct-void*-array> [
150             &(free) ascii alien>string
151         ] { } map-as
152     ] with-destructors ;
153
154 PRIVATE>
155
156 MEMO: supported-engines ( -- seq ) "layout" plugin-list ;
157 MEMO: supported-formats ( -- seq ) "device" plugin-list ;
158