- return bool success indicator instead of void so that "func() or die()" idiom works
- Support language specific write() functions.
- Use PHPWRITE() for buffered output when PHP used from Apache
pkgsharpdir = $(pkglibdir)/sharp
SHARP_data = gv.cs gvPINVOKE.cs SWIGTYPE_p_Agraph_t.cs SWIGTYPE_p_Agnode_t.cs SWIGTYPE_p_Agedge_t.cs SWIGTYPE_p_Agsym_t.cs SWIGTYPE_p_FILE.cs
nodist_libgv_sharp_la_SOURCES = gv_sharp.cpp $(SHARP_data)
-libgv_sharp_la_SOURCES = $(BASESOURCES)
+libgv_sharp_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_sharp_la_LIBADD = $(BASELIBS) @SHARP_LIBS@
libgv_sharp_la_LDFLAGS = -module -avoid-version
$(SHARP_data): gv_sharp.cpp
pkgguiledir = $(pkglibdir)/guile
GUILE_data =
nodist_libgv_guile_la_SOURCES = gv_guile.cpp $(GUILE_data)
-libgv_guile_la_SOURCES = $(BASESOURCES)
+libgv_guile_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_guile_la_LIBADD = $(BASELIBS) @GUILE_LIBS@
libgv_guile_la_LDFLAGS = -module -avoid-version
$(GUILE_data): gv_guile.cpp
pkgiodir = $(pkglibdir)/io
IO_data =
nodist_libgv_io_la_SOURCES = gv_io.cpp $(IO_data)
-libgv_io_la_SOURCES = $(BASESOURCES)
+libgv_io_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_io_la_LIBADD = $(BASELIBS) @IO_LIBS@
libgv_io_la_LDFLAGS = -module -avoid-version
$(IO_data): gv_io.cpp
pkgjavadir = $(pkglibdir)/java
JAVA_data = gv.java gvJNI.java SWIGTYPE_p_Agraph_t.java SWIGTYPE_p_Agnode_t.java SWIGTYPE_p_Agedge_t.java SWIGTYPE_p_Agsym_t.java SWIGTYPE_p_FILE.java
nodist_libgv_java_la_SOURCES = gv_java.cpp
-libgv_java_la_SOURCES = $(BASESOURCES)
+libgv_java_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_java_la_LIBADD = $(BASELIBS) @JAVA_LIBS@
libgv_java_la_LDFLAGS = -module -avoid-version
$(JAVA_data): gv_java.cpp
pkgluadir = $(pkglibdir)/lua
LUA_data =
nodist_libgv_lua_la_SOURCES = gv_lua.cpp $(LUA_data)
-libgv_lua_la_SOURCES = $(BASESOURCES)
+libgv_lua_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_lua_la_LIBADD = $(BASELIBS) @LUA_LIBS@
libgv_lua_la_LDFLAGS = -module -avoid-version
$(LUA_data): gv_lua.cpp
pkgocamldir = $(pkglibdir)/ocaml
OCAML_data = gv.cma gv.cmi gv.cma gv.cmi gv.a gv.cmx gv.cmxa gv.mli META.gv
nodist_libgv_ocaml_la_SOURCES = gv_ocaml.cpp $(OCAML_data)
-libgv_ocaml_la_SOURCES = $(BASESOURCES)
+libgv_ocaml_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_ocaml_la_LIBADD = $(BASELIBS) @OCAML_LIBS@
libgv_ocaml_la_LDFLAGS = -module -avoid-version
gv.ml gv.mli gv_ocaml.cpp: gv.i
pkgperldir = $(pkglibdir)/perl
PERL_data = gv.pm
nodist_libgv_perl_la_SOURCES = gv_perl.cpp $(PERL_data)
-libgv_perl_la_SOURCES = $(BASESOURCES)
+libgv_perl_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_perl_la_LIBADD = $(BASELIBS) @PERL_LIBS@
libgv_perl_la_LDFLAGS = -module -avoid-version
$(PERL_data): gv_perl.cpp
pkgphpdir = $(pkglibdir)/php
PHP_data = gv.php php_gv.h
nodist_libgv_php_la_SOURCES = gv_php.cpp $(PHP_data)
-libgv_php_la_SOURCES = $(BASESOURCES)
+libgv_php_la_SOURCES = $(BASESOURCES) gv_php_init.cpp
libgv_php_la_LIBADD = $(BASELIBS) @PHP_LIBS@
libgv_php_la_LDFLAGS = -module -avoid-version
$(PHP_data): gv_php.cpp
pkgpythondir = $(pkglibdir)/python
PYTHON_data = gv.py
nodist_libgv_python_la_SOURCES = gv_python.cpp $(PYTHON_data)
-libgv_python_la_SOURCES = $(BASESOURCES)
+libgv_python_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_python_la_LIBADD = $(BASELIBS) @PYTHON_LIBS@
libgv_python_la_LDFLAGS = -module -avoid-version
gv_python.cpp $(PYTHON_data): gv.i
pkgpython23dir = $(pkglibdir)/python23
nodist_libgv_python23_la_SOURCES = $(nodist_libgv_python_la_SOURCES)
-libgv_python23_la_SOURCES = $(BASESOURCES)
+libgv_python23_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_python23_la_LIBADD = $(BASELIBS) @PYTHON23_LIBS@
libgv_python23_la_LDFLAGS = -module -avoid-version
pkgpython24dir = $(pkglibdir)/python24
nodist_libgv_python24_la_SOURCES = $(nodist_libgv_python_la_SOURCES)
-libgv_python24_la_SOURCES = $(BASESOURCES)
+libgv_python24_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_python24_la_LIBADD = $(BASELIBS) @PYTHON24_LIBS@
libgv_python24_la_LDFLAGS = -module -avoid-version
pkgpython25dir = $(pkglibdir)/python25
nodist_libgv_python25_la_SOURCES = $(nodist_libgv_python_la_SOURCES)
-libgv_python25_la_SOURCES = $(BASESOURCES)
+libgv_python25_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_python25_la_LIBADD = $(BASELIBS) @PYTHON25_LIBS@
libgv_python25_la_LDFLAGS = -module -avoid-version
pkgrubydir = $(pkglibdir)/ruby
RUBY_data =
nodist_libgv_ruby_la_SOURCES = gv_ruby.cpp $(RUBY_data)
-libgv_ruby_la_SOURCES = $(BASESOURCES)
+libgv_ruby_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_ruby_la_LIBADD = $(BASELIBS) @RUBY_LIBS@
libgv_ruby_la_LDFLAGS = -module -avoid-version
$(RUBY_data): gv_ruby.cpp
pkgtcldir = $(pkglibdir)/tcl
TCL_data =
nodist_libgv_tcl_la_SOURCES = gv_tcl.cpp $(TCL_data)
-libgv_tcl_la_SOURCES = $(BASESOURCES)
+libgv_tcl_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
libgv_tcl_la_LIBADD = $(top_builddir)/tclpkg/tclstubs/libtclstubs_C.la $(BASELIBS) @TCL_LIBS@
libgv_tcl_la_LDFLAGS = -module -avoid-version
$(TCL_data): gv_tcl.cpp
#include <string.h>
#include "gvc.h"
+extern void gv_binding_init(GVC_t *gvc);
+
static GVC_t *gvc;
+static void gv_init(void) {
+ gvc = gvContext();
+ gv_binding_init(gvc);
+}
+
Agraph_t *graph(char *name)
{
- if (!gvc)
- gvc = gvContext();
+ if (!gvc) gv_init();
return agopen(name, AGRAPH);
}
Agraph_t *digraph(char *name)
{
- if (!gvc)
- gvc = gvContext();
+ if (!gvc) gv_init();
return agopen(name, AGDIGRAPH);
}
Agraph_t *strictgraph(char *name)
{
- if (!gvc)
- gvc = gvContext();
+ if (!gvc) gv_init();
return agopen(name, AGRAPHSTRICT);
}
Agraph_t *strictdigraph(char *name)
{
- if (!gvc)
- gvc = gvContext();
+ if (!gvc) gv_init();
return agopen(name, AGDIGRAPHSTRICT);
}
Agraph_t *readstring(char *string)
{
- if (!gvc)
- gvc = gvContext();
+ if (!gvc) gv_init();
return agmemread(string);
}
Agraph_t *read(FILE *f)
{
- if (!gvc)
- gvc = gvContext();
+ if (!gvc) gv_init();
return agread(f);
}
Agraph_t *g;
f = fopen(filename, "r");
- if (!f)
- return NULL;
- if (!gvc)
- gvc = gvContext();
+ if (!f) return NULL;
+ if (!gvc) gv_init();
g = agread(f);
fclose(f);
return g;
//-------------------------------------------------
Agraph_t *graph(Agraph_t *g, char *name)
{
- if (!gvc)
- return NULL;
+ if (!gvc) gv_init();
return agsubg(g, name);
}
return g->univ->edgeattr->list[i];
}
-void rm(Agraph_t *g)
+bool rm(Agraph_t *g)
{
Agedge_t *e;
} else {
agdelete(g->meta_node->graph, g->meta_node);
}
- } else {
- fprintf(stderr, "subgraph has no meta_node\n");
+ return true;
}
+ fprintf(stderr, "subgraph has no meta_node\n");
+ return false;
}
-void rm(Agnode_t *n)
+bool rm(Agnode_t *n)
{
// removal of the protonode is not permitted
if (n->name[0] == '\001' && strcmp (n->name, "\001proto") ==0)
- return;
+ return false;
agdelete(n->graph, n);
+ return true;
}
-void rm(Agedge_t *e)
+bool rm(Agedge_t *e)
{
// removal of the protoedge is not permitted
if ((e->head->name[0] == '\001' && strcmp (e->head->name, "\001proto") == 0)
|| (e->tail->name[0] == '\001' && strcmp (e->tail->name, "\001proto") == 0))
- return;
+ return false;
agdelete(e->head->graph->root, e);
+ return true;
}
-void layout(Agraph_t *g, char *engine)
+bool layout(Agraph_t *g, char *engine)
{
int err;
- err = gvFreeLayout(gvc, g);
+ err = gvFreeLayout(gvc, g); /* ignore errors */
err = gvLayout(gvc, g, engine);
+ return (! err);
}
// annotate the graph with layout information
-void render(Agraph_t *g)
+bool render(Agraph_t *g)
{
attach_attrs(g);
+ return true;
}
// render to a filename
-void render(Agraph_t *g, char *format, char *filename)
+bool render(Agraph_t *g, char *format, char *filename)
{
int err;
err = gvRenderFilename(gvc, g, format, filename);
+ return (! err);
}
// render to stdout
-void render(Agraph_t *g, char *format)
+bool render(Agraph_t *g, char *format)
{
int err;
err = gvRender(gvc, g, format, stdout);
+ return (! err);
}
// render to a FILE
-void render(Agraph_t *g, char *format, FILE *f)
+bool render(Agraph_t *g, char *format, FILE *f)
{
int err;
err = gvRender(gvc, g, format, f);
+ return (! err);
}
// render to a data string
char *data;
err = gvRenderData(gvc, g, format, &data);
+ if (err) return NULL;
return data;
}
-void write(Agraph_t *g, FILE *f)
+bool write(Agraph_t *g, FILE *f)
{
int err;
err = agwrite(g, f);
+ return (! err);
}
-void write(Agraph_t *g, char *filename)
+bool write(Agraph_t *g, char *filename)
{
FILE *f;
int err;
f = fopen(filename, "w");
- if (!f)
- return;
+ if (!f) return false;
err = agwrite(g, f);
fclose(f);
+ return (! err);
}
extern Agsym_t *nextattr(Agnode_t *n, Agsym_t *a);
/** Remove graph objects */
-extern void rm(Agraph_t *g);
-extern void rm(Agnode_t *n);
-extern void rm(Agedge_t *e);
+extern bool rm(Agraph_t *g);
+extern bool rm(Agnode_t *n);
+extern bool rm(Agedge_t *e);
/** Layout */
/*** Annotate a graph with layout attributes and values using a specific layout engine */
-extern void layout(Agraph_t *g, char *engine);
+extern bool layout(Agraph_t *g, char *engine);
/** Render */
/*** Render a layout into attributes of the graph */
-extern void render(Agraph_t *g);
+extern bool render(Agraph_t *g);
/*** Render a layout in a specific format */
-extern void render(Agraph_t *g, char *format);
-extern void render(Agraph_t *g, char *format, char *filename);
-extern void render(Agraph_t *g, char *format, FILE *f);
+extern bool render(Agraph_t *g, char *format);
+extern bool render(Agraph_t *g, char *format, char *filename);
+extern bool render(Agraph_t *g, char *format, FILE *f);
extern char* renderdata(Agraph_t *g, char *format);
/*** Writing graph back to file */
-void write(Agraph_t *g, FILE *f);
-void write(Agraph_t *g, char *filename);
+bool write(Agraph_t *g, FILE *f);
+bool write(Agraph_t *g, char *filename);
%}