]> granicus.if.org Git - graphviz/commitdiff
some docs
authorellson <devnull@localhost>
Mon, 24 Oct 2005 19:29:18 +0000 (19:29 +0000)
committerellson <devnull@localhost>
Mon, 24 Oct 2005 19:29:18 +0000 (19:29 +0000)
tclpkg/gv/.cvsignore
tclpkg/gv/Makefile.am
tclpkg/gv/demo/modgraph.lua
tclpkg/gv/demo/modgraph.py
tclpkg/gv/demo/modgraph.rb [new file with mode: 0755]
tclpkg/gv/demo/modgraph.tcl
tclpkg/gv/gv.i
tclpkg/gv/gv_doc_langs.tcl [new file with mode: 0644]
tclpkg/gv/gv_doc_template.tcl [new file with mode: 0644]
tclpkg/gv/gv_doc_writer.tcl [new file with mode: 0755]

index d302f6d23a5a2dc39146bec3b3369b088d545b7d..e55f37e8fecb3869bc264b6266f3742f1ab165fd 100644 (file)
@@ -7,14 +7,12 @@ Makefile.in
 pkgIndex.tcl
 *.pdf
 gv_*.cpp
-SWIGTYPE_p_Agedge_t.cs
-SWIGTYPE_p_Agedge_t.java
-SWIGTYPE_p_Agnode_t.cs
-SWIGTYPE_p_Agnode_t.java
-SWIGTYPE_p_Agraph_t.cs
-SWIGTYPE_p_Agraph_t.java
+gv_*.man
+SWIGTYPE_p_*
 gv.cs
 gv.java
+gv.ml
+gv.mli
 gv.php
 gv.pm
 gv.py
@@ -22,13 +20,4 @@ gv.pyc
 gvJNI.java
 gvPINVOKE.cs
 php_gv.h
-test_csharp
-test_guile
-test_io
-test_java
-test_ocaml
-test_perl
-test_php
-test_python
-test_ruby
-test_tcl
+test_*
index d96a7ef34eed3f3ad2ddce87864222d005fd97bd..1f67dd3629a842344a434bf5746818f032aedff3 100644 (file)
@@ -13,7 +13,6 @@ LIBS =  @LIBS@ -lc
 BASESOURCES = gv.cpp
 BASELIBS = $(top_builddir)/lib/gvc/libgvc.la
 
-
 pkgcsharpdir = $(pkglibdir)/csharp
 CSHARP_hdr = gv.cs gvPINVOKE.cs SWIGTYPE_p_Agraph_t.cs SWIGTYPE_p_Agnode_t.cs SWIGTYPE_p_Agedge_t.cs
 libgv_csharp_la_SOURCES = $(BASESOURCES) gv_csharp.cpp $(CSHARP_hdr)
@@ -82,9 +81,9 @@ gv_php.cpp $(PHP_hdr): gv.i
 
 pkgpythondir = $(pkglibdir)/python
 PYTHON_hdr = gv.py
-_gv_la_SOURCES = $(BASESOURCES) gv_python.cpp $(PYTHON_hdr)
-_gv_la_LIBADD = $(BASELIBS) @PYTHON_LIBS@
-_gv_la_LDFLAGS = -module
+libgv_python_la_SOURCES = $(BASESOURCES) gv_python.cpp $(PYTHON_hdr)
+libgv_python_la_LIBADD = $(BASELIBS) @PYTHON_LIBS@
+libgv_python_la_LDFLAGS = -module
 gv_python.cpp $(PYTHON_hdr): gv.i
        $(SWIG) -c++ -python -o gv_python.cpp gv.i
 
@@ -108,57 +107,57 @@ pkginclude_DATA = gv.i gv.cpp
 pkglib_LTLIBRARIES = 
 TESTS =
 if WITH_CSHARP
-pkgcsharp_DATA = $(CSHARP_hdr)
+pkgcsharp_DATA = $(CSHARP_hdr) gv_csharp.man
 pkgcsharp_LTLIBRARIES = libgv_csharp.la
 TESTS += test_csharp
 endif
 if WITH_GUILE
-pkgguile_DATA = $(GUILE_hdr)
+pkgguile_DATA = $(GUILE_hdr) gv_guile.man
 pkgguile_LTLIBRARIES = libgv_guile.la
 TESTS += test_guile
 endif
 #if WITH_IO
-#pkgio_DATA += $(IO_hdr)
-#pkgio_LTLIBRARIES += libgv_io.la
+#pkgio_DATA = $(IO_hdr) gv_io.man
+#pkgio_LTLIBRARIES = libgv_io.la
 #TESTS += test_io
 #endif
 if WITH_JAVA
-pkgjava_DATA = $(JAVA_hdr)
+pkgjava_DATA = $(JAVA_hdr) gv_java.man
 pkgjava_LTLIBRARIES = libgv_java.la
 TESTS += test_java
 endif
 if WITH_LUA
-pkglua_DATA = $(LUA_hdr)
+pkglua_DATA = $(LUA_hdr) gv_lua.man
 pkglua_LTLIBRARIES = libgv_lua.la
 TESTS += test_lua
 endif
 if WITH_OCAML
-pkgocaml_DATA = $(OCAML_hdr)
+pkgocaml_DATA = $(OCAML_hdr) gv_ocaml.man
 pkgocaml_LTLIBRARIES = libgv_ocaml.la
 TESTS += test_ocaml
 endif
 if WITH_PERL
-pkgperl_DATA = $(PERL_hdr)
+pkgperl_DATA = $(PERL_hdr) gv_perl.man
 pkgperl_LTLIBRARIES = libgv_perl.la
 TESTS += test_perl
 endif
 if WITH_PHP
-pkgphp_DATA = $(PHP_hdr)
+pkgphp_DATA = $(PHP_hdr) gv_php.man
 pkgphp_LTLIBRARIES = libgv_php.la
 TESTS += test_php
 endif
 if WITH_PYTHON
-pkgpython_DATA = $(PYTHON_hdr)
-pkgpython_LTLIBRARIES = _gv.la
+pkgpython_DATA = $(PYTHON_hdr) gv_python.man
+pkgpython_LTLIBRARIES = libgv_python.la
 TESTS += test_python
 endif
 if WITH_RUBY
-pkgruby_DATA = $(RUBY_hdr)
+pkgruby_DATA = $(RUBY_hdr) gv_ruby.man
 pkgruby_LTLIBRARIES = libgv_ruby.la
 TESTS += test_ruby
 endif
 if WITH_TCL
-pkgtcl_DATA = $(TCL_hdr)
+pkgtcl_DATA = $(TCL_hdr) gv_tcl.man
 pkgtcl_LTLIBRARIES = libgv_tcl.la
 TESTS += test_tcl
 
@@ -168,6 +167,21 @@ pkgIndex.tcl: libgv_tcl.la
        sh $(top_srcdir)/tclpkg/mkpkgindex.sh libgv_tcl.la gv $(VERSION)
 endif
 
+gv_csharp.man gv_guile.man gv_io.man gv_java.man gv_ocaml.man gv_perl.man gv_php.man gv_python.man gv_ruby.man gv_tcl.man: gv.i gv_doc_writer.tcl gv_doc_template.tcl gv_doc_langs.tcl
+       tclsh ./gv_doc_writer.tcl
+
+install-exec-hook:
+       (cd $(DESTDIR)$(pkgperldir);   rm -f gv.so;  $(LN_S) libgv_perl.so gv.so;)
+       (cd $(DESTDIR)$(pkgpythondir); rm -f _gv.so; $(LN_S) libgv_python.so _gv.so;)
+       (cd $(DESTDIR)$(pkgrubydir);   rm -f gv.so;  $(LN_S) libgv_ruby.so gv.so;)
+       (cd $(DESTDIR)$(pkgtcldir);    rm -f gv.so;  $(LN_S) libgv_tcl.so gv.so;)
+
+uninstall-hook:
+       (cd $(DESTDIR)$(pkgperldir);   rm -f gv.so;)
+       (cd $(DESTDIR)$(pkgpythondir); rm -f _gv.so;)
+       (cd $(DESTDIR)$(pkgrubydir);   rm -f gv.so;)
+       (cd $(DESTDIR)$(pkgtcldir);    rm -f gv.so;)
+
 test: $(TESTS)
 
 .PHONY: test_csharp
@@ -232,14 +246,15 @@ test_php: libgv_php.la
 .PHONY: test_python
 test_python: _gv.la
        -(mkdir -p test_python; cd test_python; \
-               ln -fs ../.libs/_gv.so ../*.dot ../*.py .; \
+               ln -fs ../.libs/libgv_python.so _gv.so; \
+               ln -fs ../*.dot ../*.py .; \
                PYTHONPATH=. $(PYTHON) test.py)
 
 .PHONY: test_ruby
-test_ruby: libgv_ruby.la
+test_ruby: gv.la
        -(mkdir -p test_ruby; cd test_ruby; \
                ln -fs ../.libs/libgv_ruby.so gv.so; \
-               ln -fs ../*.dot ../*.rb .; \
+               ln -fs ../.libs/gv.so ../*.dot ../*.rb .; \
                $(RUBY) test.rb)
 
 .PHONY: test_tcl
@@ -249,9 +264,9 @@ test_tcl: libgv_tcl.la
                ln -fs ../*.dot ../*.tcl .; \
                $(TCLSH) ./test.tcl)
 
-EXTRA_DIST = demo/* gv.cpp gv.i
+EXTRA_DIST = demo/* gv.cpp gv.i gv_doc_*.tcl
 
-CLEANFILES = test_*/* \
+CLEANFILES = test_*/* gv_*.man \
        gv_csharp.cpp $(CSHARP_hdr) \
        gv_guile.cpp $(GUILE_hdr) \
        gv_io.cpp $(IO_hdr) \
index 6920ae244d3cfdeb8f4af6ed6e8054362d3ede74..36e02656e48aea9439cde181794daa2450a2ffc3 100755 (executable)
@@ -4,7 +4,8 @@
 
 -- author: John Ellson <ellson@research.att.com>
 
-lib = loadlib('/usr/lib64/graphviz/lua/libgv_lua.so','Gv_Init')
+lib = loadlib('/usr/lib/graphviz/lua/libgv_lua.so','Gv_Init')
+-- lib = loadlib('/usr/lib64/graphviz/lua/libgv_lua.so','Gv_Init')
 assert(lib)()
 
 modules = io.lines('/proc/modules') 
index 0376f4e461ce995bebf619a122ff5cf2c4e3b992..eaa50341d0a24f084678a37e0264bb333c8caf53 100755 (executable)
@@ -6,8 +6,8 @@
 #  based on: modgraph.tcl by John Ellson <ellson@research.att.com>
 
 import sys
-sys.path.append('/usr/lib/graphviz/python')
-sys.path.append('/usr/lib64/graphviz/python')
+sys.path.append('/usr/lib/graphviz/python')
+sys.path.append('/usr/lib64/graphviz/python')
 import gv
 
 modules = open("/proc/modules", 'r').readlines()
diff --git a/tclpkg/gv/demo/modgraph.rb b/tclpkg/gv/demo/modgraph.rb
new file mode 100755 (executable)
index 0000000..26ba762
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/ruby
+
+# display the kernel module dependencies
+
+# author: John Ellson <ellson@research.att.com>
+
+require 'gv'
+
+G = Gv.digraph("G")
+Gv.setv(G, 'rankdir', 'LR')
+Gv.setv(G, 'nodesep', '0.05')
+Gv.setv(G, 'node', 'shape', 'box')
+Gv.setv(G, 'node', 'width', '0')
+Gv.setv(G, 'node', 'height', '0')
+Gv.setv(G, 'node', 'margin', '.03')
+Gv.setv(G, 'node', 'fontsize', '8')
+Gv.setv(G, 'node', 'fontname', 'helvetica')
+Gv.setv(G, 'edge', 'arrowsize', '.4')
+
+# for rec in modules do
+#    for mod, usedbylist in string.gfind(rec, "([_%w]+) %w+ %w+ ([-,_%w]+)") do
+#       n = gv.node(G, mod)
+#       for usedby in string.gfind(usedbylist, "([-_%w]+)") do
+#          if (usedby ~= '-') and (usedby ~= '') then
+#             gv.edge(n, gv.node(G, usedby))
+#          end
+#       end
+#    end
+# end
+
+Gv.layout(G, 'dot')
+Gv.render(G, 'gtk')
index f04d85c27a72de2327396d7d24906d23c5eaa926..f7f0848349e1fb37c8028b886d0a231f0b1f3448 100755 (executable)
@@ -4,7 +4,11 @@
 
 # author: John Ellson <ellson@research.att.com>
 
-package require gv
+#package require gv
+
+load /usr/lib/graphviz/tcl/gv.so
+#load /usr/lib64/graphviz/tcl/gv.so
+#load $env(PREFIX)/lib/graphviz/tcl/gv.so
 
 set f [open /proc/modules r]
 set modules [read -nonewline $f]
index 5f79fb112503033493ff03683c303922bde23022..8db08acdb8143a1be5be9edb8ee46fb1e3a0fb22 100644 (file)
@@ -41,7 +41,7 @@ extern Agedge_t *edge(Agraph_t *g, char *tname, char *hname);/* add edge between
 
 /* set/get attribute of graph/node/edge */
 extern char *setv(Agraph_t *g, char *attr, char *val);
-extern char *setv(Agraph_t *g, char *gne, char *att, char *val);
+extern char *setv(Agraph_t *g, char *gne, char *attr, char *val);
 extern char *setv(Agnode_t *n, char *attr, char *val);
 extern char *setv(Agedge_t *e, char *attr, char *val);
 
diff --git a/tclpkg/gv/gv_doc_langs.tcl b/tclpkg/gv/gv_doc_langs.tcl
new file mode 100644 (file)
index 0000000..2ed7c72
--- /dev/null
@@ -0,0 +1,261 @@
+array set LANGS {
+       csharp {
+               TYPES {
+                       Agraph_t* SWIGTYPE_p_Agraph_t
+                       Agnode_t* SWIGTYPE_p_Agnode_t
+                       Agedge_t* SWIGTYPE_p_Agedge_t
+                       Agsym_t* SWIGTYPE_p_Agsym_t
+                       char* string
+                       FILE* SWIGTYPE_p_FILE
+                       bool bool
+                       void** SWIGTYPE_p_p_void
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+               }
+               USAGE {
+               }
+       }
+       guile {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+                       {(load-extension "./libgv.so" "SWIG_init")}
+               }
+               USAGE {
+               }
+       }
+       io {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+               }
+               USAGE {
+               }
+       }
+       java {
+               TYPES {
+                       Agraph_t* SWIGTYPE_p_Agraph_t
+                       Agnode_t* SWIGTYPE_p_Agnode_t
+                       Agedge_t* SWIGTYPE_p_Agedge_t
+                       Agsym_t* SWIGTYPE_p_Agsym_t
+                       char* string
+                       FILE* SWIGTYPE_p_FILE
+                       bool bool
+                       void** SWIGTYPE_p_p_void
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+                       {System.loadLibrary("gv");}
+               }
+               USAGE {
+               }
+       }
+       lua {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+                       {#!/usr/bin/lua}
+                       {lib=loadlib('/usr/lib/graphviz/lua/libgv_lua.so','Gv_Init')}
+                       {assert(lib)()}
+               }
+               USAGE {
+               }
+       }
+       ocaml {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+               }
+               USAGE {
+               }
+       }
+       perl {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv:: (  ,   {);}
+               }
+               SYNOPSIS {
+                       {#!/usr/bin/perl}
+                       {use gv;}
+               }
+               USAGE {
+               }
+       }
+       php {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv:: (  ,   {);}
+               }
+               SYNOPSIS {
+                       {dl("libgv_php.so");}
+                       {include("gv.php")}
+               }
+               USAGE {
+               }
+       }
+       python {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+                       {#!/usr/bin/python}
+                       {import sys}
+                       {sys.path.append('/usr/lib/graphviz/python')}
+                       {import gv}
+               }
+               USAGE {
+               }
+       }
+       ruby {
+               TYPES {
+                       Agraph_t* graph_handle
+                       Agnode_t* node_handle
+                       Agedge_t* edge_handle
+                       Agsym_t* attribute_handle
+                       char* string
+                       FILE* channel
+                       bool bool
+                       void** data_handle
+                       void {}
+               }
+               SYNTAX {
+                       Gv.  (  ,   {);}
+               }
+               SYNOPSIS {
+                       {export RUBYLIB=/usr/lib/graphviz/ruby}
+                       {}
+                       {#!/usr/bin/ruby}
+                       {require 'gv'}
+               }
+               USAGE {
+               }
+       }
+       tcl {
+               TYPES {
+                       {Agraph_t* g} <graph_handle>
+                       {Agraph_t* sg} <subgraph_handle>
+                       {Agnode_t* n} <node_handle>
+                       {Agnode_t* t} <tail_node_handle>
+                       {Agnode_t* h} <head_node_handle>
+                       {Agedge_t* e} <edge_handle>
+                       {Agsym_t* a} <attr_handle>
+                       {char* gne} <type>
+                       {char* name} <name>
+                       {char* tname} <tail_name>
+                       {char* hname} <head_name>
+                       {char* attr} <attr_name>
+                       {char* val} <attr_value>
+                       {char* filename} <filename>
+                       {char* engine} <engine>
+                       {char* string} <string>
+                       {char* format} <format>
+                       {FILE* f} <channel>
+                       {void** data} <data_handle>
+                       Agraph_t* <graph_handle>
+                       Agnode_t* <node_handle>
+                       Agedge_t* <edge_handle>
+                       Agsym_t* <attr_handle>
+                       char* <string>
+                       FILE* <channel>
+                       bool <boolean_string>
+                       void** <data_handle>
+                       void {}
+               }
+               SYNTAX {
+                       gv:: {} { } {}
+               }
+               SYNOPSIS {
+                       {#!/usr/bin/tclsh}
+                       {load /usr/lib/graphviz/tcl/gv.so}
+               }
+               USAGE {
+                       {Requires tcl7.6 or later.}
+               }
+       }
+}
diff --git a/tclpkg/gv/gv_doc_template.tcl b/tclpkg/gv/gv_doc_template.tcl
new file mode 100644 (file)
index 0000000..02ceb32
--- /dev/null
@@ -0,0 +1,100 @@
+.TH GV_[string toupper $lang] N \"[clock format [clock seconds] -format "%d %B %Y"]\"
+
+.SH NAME
+
+gv_$lang \- graph manipulation in $lang
+
+.SH SYNOPSIS
+
+[gv_doc_synopsis]
+
+.SH USAGE
+
+[gv_doc_usage]
+
+.SH INTRODUCTION
+
+.B gv_$lang
+is a dynamically loaded extension for
+.B $lang
+that provides access to the graph facilities of
+.B graphviz.
+
+.SH COMMANDS
+.PP
+Graph creation commands:
+
+[gv_doc_command digraph]
+[gv_doc_command graph]
+[gv_doc_command strictdigraph]
+[gv_doc_command strictgraph]
+[gv_doc_command read]
+[gv_doc_command readstring]
+.PP
+Node creation commands:
+
+[gv_doc_command node]
+.PP
+Edge creation commands:
+
+[gv_doc_command edge]
+.PP
+Object removal commands:
+
+[gv_doc_command rm]
+.PP
+Attributes:
+
+[gv_doc_command getv]
+
+[gv_doc_command setv]
+.PP
+Iterators:
+
+[gv_doc_command findattr]
+[gv_doc_command firstedge]
+[gv_doc_command nextedge]
+[gv_doc_command firstin]
+[gv_doc_command nextin]
+[gv_doc_command firstout]
+[gv_doc_command nextout]
+[gv_doc_command firsthead]
+[gv_doc_command nexthead]
+[gv_doc_command firsttail]
+[gv_doc_command nexttail]
+[gv_doc_command firstnode]
+[gv_doc_command nextnode]
+[gv_doc_command firstsubg]
+[gv_doc_command nextsubg]
+[gv_doc_command firstsupg]
+[gv_doc_command nextsupg]
+[gv_doc_command firstattr]
+[gv_doc_command nextattr]
+[gv_doc_command ok]
+.PP
+Miscellaneous:
+
+[gv_doc_command headof]
+[gv_doc_command tailof]
+[gv_doc_command nameof]
+[gv_doc_command findedge]
+[gv_doc_command findnode]
+[gv_doc_command findsubg]
+[gv_doc_command graphof]
+[gv_doc_command rootof]
+.PP
+Layout:
+
+[gv_doc_command layout]
+.PP
+Output:
+
+[gv_doc_command render]
+
+.SH BUGS
+
+.SH ACKNOWLEDGEMENTS
+
+.SH KEYWORDS
+
+graph, dot, neato, fdp, circo, twopi, $lang.
diff --git a/tclpkg/gv/gv_doc_writer.tcl b/tclpkg/gv/gv_doc_writer.tcl
new file mode 100755 (executable)
index 0000000..ee17ae0
--- /dev/null
@@ -0,0 +1,82 @@
+#!/usr/bin/tclsh
+
+source gv_doc_langs.tcl
+
+set TEMPLATE gv_doc_template.tcl
+
+set fn gv.i
+set f [open $fn r]
+set t [read $f [file size $fn]]
+close $f
+
+regsub -all {.*%inline %\{} $t {} t
+regsub -all {%\}} $t {} t
+regsub -all {extern} $t {} t
+regsub -all {/\*.*?\*/} $t {} t
+regsub -all {//.*?} $t {} t
+
+foreach rec [split $t \n] {
+       set rec [string trim $rec " \t;)"]
+       if {[string length $rec] == 0} {continue}
+       set i 0
+       set params {}
+       foreach type_name [split $rec "(,"] {
+               set type_name [string trim $type_name]
+               regsub -all {[ \t]+(\**)} $type_name {\1 } type_name
+               foreach {type name} $type_name {break}
+               if {! $i} {
+                       set func $name
+                       set functype $type
+               } {
+                       lappend params $type $name
+               }
+               incr i
+       }
+       lappend FUNC($func) $functype $params
+}
+
+proc gv_doc_synopsis {} {
+       global SYNOPSIS
+       return [join $SYNOPSIS "\n.br\n"]
+}
+
+proc gv_doc_usage {} {
+       global USAGE
+       return [join $USAGE "\n.P\n"]
+}
+
+proc gv_doc_command {cmd} {
+       global FUNC TYPES nameprefix paramstart paramsep paramend
+       
+       set res {}
+       foreach {functype params} $FUNC($cmd) {
+               set par {}
+               foreach {paramtype param} $params {
+                       if {[string length [array names TYPES -exact "$paramtype $param"]]} {
+                               lappend par "$TYPES($paramtype $param)"
+                       } {
+                               lappend par "$TYPES($paramtype) $param"
+                       }
+               }
+               if {[string length $TYPES($functype)]} {
+                       lappend res "$TYPES($functype) \\fB$nameprefix$cmd\\fR $paramstart[join $par $paramsep]$paramend" .br
+               } {
+                       lappend res "\\fB$nameprefix$cmd\\fR $paramstart[join $par $paramsep]$paramend" .br
+               }
+                       
+       }
+       return [join $res \n]
+}
+
+foreach lang [array names LANGS] {
+       array set PROPS $LANGS($lang)
+       array set TYPES $PROPS(TYPES)
+       foreach {nameprefix paramstart paramsep paramend} $PROPS(SYNTAX) {break}
+       set SYNOPSIS $PROPS(SYNOPSIS)
+       set USAGE $PROPS(USAGE)
+       set f [open gv_[set lang].man w]
+       set ft [open $TEMPLATE r]
+       puts $f [subst [read $ft [file size $TEMPLATE]]]
+       close $ft
+       close $f
+}