]> granicus.if.org Git - graphviz/commitdiff
better support for tcl channels and string results
authorellson <devnull@localhost>
Sun, 24 Aug 2008 18:45:35 +0000 (18:45 +0000)
committerellson <devnull@localhost>
Sun, 24 Aug 2008 18:45:35 +0000 (18:45 +0000)
tclpkg/gv/Makefile.am
tclpkg/gv/gv.cpp
tclpkg/gv/gv.i
tclpkg/gv/gv_dummy_init.cpp [deleted file]
tclpkg/gv/gv_php_init.cpp [deleted file]
tclpkg/gv/gv_tcl_init.cpp [deleted file]

index 27028273fa7a822b3b6bd309bb2a1f6fdf92c95b..d698322b1ff7b1054290bfcf942b45a162f90be7 100644 (file)
@@ -23,7 +23,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) gv_dummy_init.cpp
+libgv_sharp_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_sharp_la_LIBADD = $(BASELIBS) $(SHARP_LIBS) 
 libgv_sharp_la_LDFLAGS = -module -avoid-version
 libgv_sharp_la_CPPFLAGS = $(AM_CPPFLAGS) $(SHARP_INCLUDES)
@@ -34,20 +34,20 @@ 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) gv_dummy_init.cpp
+libgv_guile_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_guile_la_LIBADD = $(BASELIBS) $(GUILE_LIBS)
 libgv_guile_la_LDFLAGS = -module -avoid-version
 libgv_guile_la_CPPFLAGS = $(AM_CPPFLAGS) $(GUILE_INCLUDES)
 $(GUILE_data): gv_guile.cpp
 gv_guile.cpp: gv.i
        $(SWIG) -c++ -guile -o gv_guile.cpp $(srcdir)/gv.i
-       $(SED) -e 's/SWIG_GUILE_INIT_STATIC void/void/' <gv_guile.cpp >t
-       mv -f t gv_guile.cpp
+       $(SED) -e 's/SWIG_GUILE_INIT_STATIC void/void/' <gv_guile.cpp >t$$
+       mv -f t$$ gv_guile.cpp
 
 pkgiodir = $(pkglibdir)/io
 IO_data = 
 nodist_libgv_io_la_SOURCES = gv_io.cpp $(IO_data)
-libgv_io_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_io_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_io_la_LIBADD = $(BASELIBS) $(IO_LIBS)
 libgv_io_la_LDFLAGS = -module -avoid-version
 libgv_io_la_CPPFLAGS = $(AM_CPPFLAGS) $(IO_INCLUDES)
@@ -58,7 +58,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)  gv_dummy_init.cpp
+libgv_java_la_SOURCES = $(BASESOURCES)  gv_dummy_init.c
 libgv_java_la_LIBADD = $(BASELIBS) $(JAVA_LIBS)
 libgv_java_la_LDFLAGS = -module -avoid-version
 libgv_java_la_CPPFLAGS = $(AM_CPPFLAGS) $(JAVA_INCLUDES)
@@ -69,7 +69,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) gv_dummy_init.cpp
+libgv_lua_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_lua_la_LIBADD = $(BASELIBS) $(LUA_LIBS)
 libgv_lua_la_LDFLAGS = -module -avoid-version
 libgv_lua_la_CPPFLAGS = $(AM_CPPFLAGS) $(LUA_INCLUDES)
@@ -83,7 +83,7 @@ if WITH_OCAMLOPT
 OCAML_data += gv.a gv.cmx gv.cmxa
 endif
 nodist_libgv_ocaml_la_SOURCES = gv_ocaml.cpp $(OCAML_data)
-libgv_ocaml_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_ocaml_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_ocaml_la_LIBADD = $(BASELIBS) @OCAML_LIBS@
 libgv_ocaml_la_LDFLAGS = -module -avoid-version
 libgv_ocaml_la_CPPFLAGS = $(AM_CPPFLAGS) $(OCAML_INCLUDES)
@@ -113,7 +113,7 @@ gv.a:       gv.cmxa
 pkgperldir = $(pkglibdir)/perl
 PERL_data = gv.pm
 nodist_libgv_perl_la_SOURCES = gv_perl.cpp $(PERL_data)
-libgv_perl_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_perl_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_perl_la_LIBADD = $(BASELIBS) $(PERL_LIBS)
 libgv_perl_la_LDFLAGS = -module -avoid-version
 libgv_perl_la_CPPFLAGS = $(AM_CPPFLAGS) $(PERL_INCLUDES)
@@ -124,7 +124,7 @@ gv_perl.cpp: gv.i
 pkgphpdir = $(pkglibdir)/php
 PHP_data = gv.php
 nodist_libgv_php_la_SOURCES = gv_php.cpp php_gv.h
-libgv_php_la_SOURCES = $(BASESOURCES) gv_php_init.cpp
+libgv_php_la_SOURCES = $(BASESOURCES) gv_php_init.c
 libgv_php_la_LIBADD = $(BASELIBS) $(PHP_LIBS)
 libgv_php_la_LDFLAGS = -module -avoid-version
 libgv_php_la_CPPFLAGS = $(AM_CPPFLAGS) $(PHP_INCLUDES)
@@ -136,7 +136,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) gv_dummy_init.cpp
+libgv_python_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_python_la_LIBADD = $(BASELIBS) $(PYTHON_LIBS)
 libgv_python_la_LDFLAGS = -module -avoid-version
 libgv_python_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_INCLUDES)
@@ -146,21 +146,21 @@ gv_python.cpp: gv.i
 
 pkgpython23dir = $(pkglibdir)/python23
 nodist_libgv_python23_la_SOURCES = $(nodist_libgv_python_la_SOURCES)
-libgv_python23_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_python23_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_python23_la_LIBADD = $(BASELIBS) $(PYTHON23_LIBS)
 libgv_python23_la_LDFLAGS = -module -avoid-version
 libgv_python23_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON23_INCLUDES)
 
 pkgpython24dir = $(pkglibdir)/python24
 nodist_libgv_python24_la_SOURCES = $(nodist_libgv_python_la_SOURCES)
-libgv_python24_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_python24_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_python24_la_LIBADD = $(BASELIBS) $(PYTHON24_LIBS)
 libgv_python24_la_LDFLAGS = -module -avoid-version
 libgv_python24_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON24_INCLUDES)
 
 pkgpython25dir = $(pkglibdir)/python25
 nodist_libgv_python25_la_SOURCES = $(nodist_libgv_python_la_SOURCES)
-libgv_python25_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_python25_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_python25_la_LIBADD = $(BASELIBS) $(PYTHON25_LIBS)
 libgv_python25_la_LDFLAGS = -module -avoid-version
 libgv_python25_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON25_INCLUDES)
@@ -168,7 +168,7 @@ libgv_python25_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON25_INCLUDES)
 pkgRdir = $(pkglibdir)/R
 R_data = 
 nodist_libgv_R_la_SOURCES = gv_R.cpp $(R_data)
-libgv_R_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_R_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_R_la_LIBADD = $(BASELIBS) $(R_LIBS)
 libgv_R_la_LDFLAGS = -module -avoid-version
 libgv_R_la_CPPFLAGS = $(AM_CPPFLAGS) $(R_CFLAGS)
@@ -179,7 +179,7 @@ gv_R.cpp: gv.i
 pkgrubydir = $(pkglibdir)/ruby
 RUBY_data = 
 nodist_libgv_ruby_la_SOURCES = gv_ruby.cpp $(RUBY_data)
-libgv_ruby_la_SOURCES = $(BASESOURCES) gv_dummy_init.cpp
+libgv_ruby_la_SOURCES = $(BASESOURCES) gv_dummy_init.c
 libgv_ruby_la_LIBADD = $(BASELIBS) $(RUBY_LIBS)
 libgv_ruby_la_LDFLAGS = -module -avoid-version
 libgv_ruby_la_CPPFLAGS = $(AM_CPPFLAGS) $(RUBY_INCLUDES)
@@ -190,7 +190,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) gv_tcl_init.cpp
+libgv_tcl_la_SOURCES = $(BASESOURCES) gv_tcl_init.c
 libgv_tcl_la_LIBADD = $(top_builddir)/tclpkg/tclstubs/libtclstubs_C.la $(BASELIBS) $(TCL_LIBS)
 libgv_tcl_la_LDFLAGS = -module -avoid-version
 libgv_tcl_la_CPPFLAGS = $(AM_CPPFLAGS) $(TCL_INCLUDES)
index 8ea8a658380259b00da61a20b6453d51658a2c3b..b2ee04f80a70572cf3c98fa52b627d8cd3b725a4 100644 (file)
 #include <string.h>
 #include "gvc.h"
 
+extern "C" {
 extern void gv_string_writer_init(GVC_t *gvc);
 extern void gv_channel_writer_init(GVC_t *gvc);
+}
 
 static char emptystring[] = {'\0'};
 
@@ -868,35 +870,34 @@ bool render(Agraph_t *g, char *format)
 
     if (!g)
         return false;
-    gv_channel_writer_init(gvc);
     err = gvRender(gvc, g, format, stdout);
     return (! err);
 }
 
-// render to a FILE
+// render to an open FILE
 bool render(Agraph_t *g, char *format, FILE *f)
 {
     int err;
 
     if (!g)
         return false;
-    gv_channel_writer_init(gvc);
     err = gvRender(gvc, g, format, f);
     return (! err);
 }
 
-// render to string result, using binding-dependent gv_string_writer()
-void renderresult(Agraph_t *g, char *format)
+// render to an open channel  
+bool renderchannel(Agraph_t *g, char *format, char *channelname)
 {
     int err;
 
     if (!g)
-        return;
-    gv_string_writer_init(gvc);
-    err = gvRender(gvc, g, format, stdout); /* FIXME - stdout used as flag only */
+        return false;
+    gv_channel_writer_init(gvc);
+    err = gvRender(gvc, g, format, (FILE*)channelname);
+    return (! err);
 }
 
-// render to a filename --deprecated (not very portable)
+// render to a filename 
 bool render(Agraph_t *g, char *format, char *filename)
 {
     int err;
@@ -907,8 +908,18 @@ bool render(Agraph_t *g, char *format, char *filename)
     return (! err);
 }
 
+// render to string result, using binding-dependent gv_string_writer()
+void renderresult(Agraph_t *g, char *format, char *outdata)
+{
+    int err;
+
+    if (!g)
+        return;
+    gv_string_writer_init(gvc);
+    err = gvRender(gvc, g, format, (FILE*)outdata);
+}
 
-// render to a malloc'ed data string, to be free'd by caller. --deprecated (too easy to leak memory)
+// render to a malloc'ed data string, to be free'd by caller.
 char* renderdata(Agraph_t *g, char *format)
 {
     int err;
index eb807af3f66b6f203a074acba5cc0aa57dc4b4b3..e54e66c94531e49fbb38a326478d774c75b139b2 100644 (file)
 **********************************************************/
 
 %module gv
-%{
 
+#ifdef SWIGTCL
+// A typemap telling SWIG to ignore an argument for input
+// However, we still need to pass a pointer to the C function
+%typemap(in,numinputs=0) char *outdata (Tcl_Obj *o) {
+     o = Tcl_NewStringObj(NULL, -1);
+     $1 = (char*)o;
+}
+// A typemap defining how to return an argument by appending it to the result
+%typemap(argout) char *outdata {
+     Tcl_ListObjAppendElement(interp,$result,(Tcl_Obj*)$1);
+}
+
+// A typemap telling SWIG to map char *channelname to Tcl_Channel *chan
+%typemap(in) char *channelname (int mode) {
+    $1 = (char*)Tcl_GetChannel(interp, Tcl_GetString($input), &mode);
+// FIXME - need to error if chan is NULL or mode not TCL_WRITABLE
+}
+#endif
+
+%{
 /* some language headers (e.g. php.h, ruby.h) leave these defined */
 #undef PACKAGE_BUGREPORT
 #undef PACKAGE_STRING
@@ -38,7 +57,7 @@ extern Agraph_t *strictdigraph(char *name);
 /*** New graph from a dot-syntax string or file */
 extern Agraph_t *readstring(char *string);
 extern Agraph_t *read(char *filename);
-extern Agraph_t *read(FILE *f);        
+extern Agraph_t *read(FILE *f);
 /*** Add new subgraph to existing graph */
 extern Agraph_t *graph(Agraph_t *g, char *name);
 
@@ -187,16 +206,19 @@ extern bool layout(Agraph_t *g, char *engine);
 extern bool render(Agraph_t *g); 
 /*** Render a layout to stdout */
 extern bool render(Agraph_t *g, char *format);
-/*** Render to an open file or channel */
-extern bool render(Agraph_t *g, char *format, FILE *f);
-/*** Render to a string result */
-extern void renderresult(Agraph_t *g, char *format);
+/*** Render to an open file */
+extern bool render(Agraph_t *g, char *format, FILE *fout);
 /*** Render a layout to an unopened file by name */
 extern bool render(Agraph_t *g, char *format, char *filename);
-
+/*** Render to an open channel */
+extern bool renderchannel(Agraph_t *g, char *format, char *channelname);
+/*** Render to a string result */
+extern void renderresult(Agraph_t *g, char *format, char *outdata);
+#if 0
 /*** Render a layout to a malloc'ed string, to be free'd by the caller */
 /*** (deprecated - too easy to leak memory) */
 extern char* renderdata(Agraph_t *g, char *format);
+#endif
 
 
 /*** Writing graph back to file */
@@ -216,7 +238,7 @@ extern Agraph_t *strictdigraph(char *name);
 /*** New graph from a dot-syntax string or file */
 extern Agraph_t *readstring(char *string);
 extern Agraph_t *read(char *filename);
-extern Agraph_t *read(FILE *f);        
+extern Agraph_t *read(FILE *f);
 /*** Add new subgraph to existing graph */
 extern Agraph_t *graph(Agraph_t *g, char *name);
 
@@ -365,34 +387,23 @@ extern bool layout(Agraph_t *g, char *engine);
 extern bool render(Agraph_t *g); 
 /*** Render a layout to stdout */
 extern bool render(Agraph_t *g, char *format);
-/*** Render to an open file or channel */
-extern bool render(Agraph_t *g, char *format, FILE *f);
-/*** Render to a string result */
-extern void renderresult(Agraph_t *g, char *format);
+/*** Render to an open file */
+extern bool render(Agraph_t *g, char *format, FILE *fout);
 /*** Render a layout to an unopened file by name */
 extern bool render(Agraph_t *g, char *format, char *filename);
-
+/*** Render to an open channel */
+extern bool renderchannel(Agraph_t *g, char *format, char *channelname);
+/*** Render to a string result */
+extern void renderresult(Agraph_t *g, char *format, char *outdata);
+#if 0
 /*** Render a layout to a malloc'ed string, to be free'd by the caller */
 /*** (deprecated - too easy to leak memory) */
 extern char* renderdata(Agraph_t *g, char *format);
+#endif
 
 
 /*** Writing graph back to file */
 extern bool write(Agraph_t *g, char *filename);
 extern bool write(Agraph_t *g, FILE *f);
 
-
-#ifdef SWIGTCL
-// A typemap telling SWIG to ignore an argument for input
-// However, we still need to pass a pointer to the C function
-%typemap(in,numinputs=0) char *outdata (char *temp) {
-     $1 = &temp;
-}
-// A typemap defining how to return an argument by appending it to the result
-%typemap(argout) char *outdata {
-     Tcl_Obj *o = Tcl_NewStringObj($1);
-     Tcl_ListObjAppendElement(interp,$result,o);
-}
-#endif
-
 %}
diff --git a/tclpkg/gv/gv_dummy_init.cpp b/tclpkg/gv/gv_dummy_init.cpp
deleted file mode 100644 (file)
index 096f2a9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <gvc.h>
-
-void gv_string_writer_init (GVC_t *gvc) {}
-void gv_channel_writer_init (GVC_t *gvc) {}
diff --git a/tclpkg/gv/gv_php_init.cpp b/tclpkg/gv/gv_php_init.cpp
deleted file mode 100644 (file)
index a5f6c65..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ $Revision$ */
-/* vim:set shiftwidth=4 ts=8: */
-
-/**********************************************************
-*      This software is part of the graphviz package      *
-*                http://www.graphviz.org/                 *
-*                                                         *
-*            Copyright (c) 1994-2008 AT&T Corp.           *
-*                and is licensed under the                *
-*            Common Public License, Version 1.0           *
-*                      by AT&T Corp.                      *
-*                                                         *
-*        Information and Software Systems Research        *
-*              AT&T Research, Florham Park NJ             *
-**********************************************************/
-
-#include <php.h>
-#include "gvc.h"
-#include "gvplugin.h"
-#include "gvcjob.h"
-#include "gvcint.h"
-
-static size_t gv_string_writer (GVJ_t *job, const char *s, int len)
-{
-    return PHPWRITE(s, len);
-}
-
-static size_t gv_channel_writer (GVJ_t *job, const char *s, int len)
-{
-    return PHPWRITE(s, len);
-}
-
-void gv_string_writer_init(GVC_t *gvc)
-{
-        gvc->write_fn = gv_string_writer;
-}
-
-void gv_channel_writer_init(GVC_t *gvc)
-{
-        gvc->write_fn = gv_channel_writer;
-}
-
diff --git a/tclpkg/gv/gv_tcl_init.cpp b/tclpkg/gv/gv_tcl_init.cpp
deleted file mode 100644 (file)
index cf9d90d..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Id$ $Revision$ */
-/* vim:set shiftwidth=4 ts=8: */
-
-/**********************************************************
-*      This software is part of the graphviz package      *
-*                http://www.graphviz.org/                 *
-*                                                         *
-*            Copyright (c) 1994-2008 AT&T Corp.           *
-*                and is licensed under the                *
-*            Common Public License, Version 1.0           *
-*                      by AT&T Corp.                      *
-*                                                         *
-*        Information and Software Systems Research        *
-*              AT&T Research, Florham Park NJ             *
-**********************************************************/
-
-#include <tcl.h>
-#include "gvc.h"
-#include "gvplugin.h"
-#include "gvcjob.h"
-#include "gvcint.h"
-
-static size_t gv_string_writer(GVJ_t *job, const char *s, int len)
-{
-    Tcl_AppendResult((Tcl_Interp*)(job->context), s, (char *) NULL);
-    return len;
-}
-
-static size_t gv_channel_writer(GVJ_t *job, const char *s, int len)
-{
-    return Tcl_Write((Tcl_Channel)(job->output_file), s, len);
-}
-
-void gv_string_writer_init(GVC_t *gvc)
-{
-    gvc->write_fn = gv_string_writer;
-}
-
-void gv_channel_writer_init(GVC_t *gvc)
-{
-    gvc->write_fn = gv_channel_writer;
-}