From: ellson Date: Fri, 16 Nov 2007 20:20:49 +0000 (+0000) Subject: PHP binding fixes: X-Git-Tag: LAST_LIBGRAPH~32^2~5019 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5534998b7954b78631ef7bb10995bcef6ceb7e1;p=graphviz PHP binding fixes: - 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 --- diff --git a/tclpkg/gv/Makefile.am b/tclpkg/gv/Makefile.am index 990e640a7..c52ea616f 100644 --- a/tclpkg/gv/Makefile.am +++ b/tclpkg/gv/Makefile.am @@ -19,7 +19,7 @@ BASELIBS = $(top_builddir)/lib/gvc/libgvc.la 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 @@ -29,7 +29,7 @@ gv_sharp.cpp: gv.i 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 @@ -41,7 +41,7 @@ gv_guile.cpp: gv.i 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 @@ -51,7 +51,7 @@ gv_io.cpp: gv.i 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 @@ -61,7 +61,7 @@ gv_java.cpp: gv.i 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 @@ -71,7 +71,7 @@ gv_lua.cpp: gv.i 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 @@ -98,7 +98,7 @@ gv.cmxa gv.a: gv.cma 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 @@ -108,7 +108,7 @@ gv_perl.cpp: gv.i 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 @@ -118,7 +118,7 @@ gv_php.cpp: gv.i 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 @@ -126,26 +126,26 @@ 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 @@ -155,7 +155,7 @@ gv_ruby.cpp: gv.i 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 diff --git a/tclpkg/gv/gv.cpp b/tclpkg/gv/gv.cpp index 2c37a6e2c..38614b618 100644 --- a/tclpkg/gv/gv.cpp +++ b/tclpkg/gv/gv.cpp @@ -17,47 +17,48 @@ #include #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); } @@ -67,10 +68,8 @@ Agraph_t *read(char *filename) 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; @@ -79,8 +78,7 @@ Agraph_t *read(char *filename) //------------------------------------------------- Agraph_t *graph(Agraph_t *g, char *name) { - if (!gvc) - return NULL; + if (!gvc) gv_init(); return agsubg(g, name); } @@ -788,7 +786,7 @@ Agsym_t *nextattr(Agedge_t *e, Agsym_t *a) return g->univ->edgeattr->list[i]; } -void rm(Agraph_t *g) +bool rm(Agraph_t *g) { Agedge_t *e; @@ -802,64 +800,72 @@ void rm(Agraph_t *g) } 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 @@ -869,24 +875,26 @@ char* renderdata(Agraph_t *g, char *format) 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); } diff --git a/tclpkg/gv/gv.i b/tclpkg/gv/gv.i index 9fdae98f8..4ddb774f1 100644 --- a/tclpkg/gv/gv.i +++ b/tclpkg/gv/gv.i @@ -174,26 +174,26 @@ extern Agsym_t *firstattr(Agnode_t *n); 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); %}