]> granicus.if.org Git - graphviz/commitdiff
PHP binding fixes:
authorellson <devnull@localhost>
Fri, 16 Nov 2007 20:20:49 +0000 (20:20 +0000)
committerellson <devnull@localhost>
Fri, 16 Nov 2007 20:20:49 +0000 (20:20 +0000)
   - 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

tclpkg/gv/Makefile.am
tclpkg/gv/gv.cpp
tclpkg/gv/gv.i

index 990e640a79f65110005d62a775ba25de22614eef..c52ea616fee8157dcc2221328f68e4a98fce786e 100644 (file)
@@ -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
index 2c37a6e2c65cb4e595bb3682ecb219e489db893e..38614b618ec5ccf4b23e41d41c35d46626145f2d 100644 (file)
 #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);
 }
 
@@ -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);
 }
index 9fdae98f8da0cd026f954ac13f35ec632f38dd07..4ddb774f1eb8637352de3ad2131d0917c7ce4490 100644 (file)
@@ -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);
 
 %}