[rnv] Initial import (#995025)
Michael Šimáček
msimacek at fedoraproject.org
Fri Aug 16 15:18:29 UTC 2013
commit 7d0734fc6da45f0702952f2baf22925c26eeab6f
Author: Michael Simacek <msimacek at redhat.com>
Date: Fri Aug 16 17:17:14 2013 +0200
Initial import (#995025)
.gitignore | 1 +
arx.1 | 75 +++++++++++++
rnv.arx-conf-with-docbook.patch | 80 ++++++++++++++
rnv.rvp-pl-wrong-interpreter.patch | 8 ++
rnv.spec | 91 ++++++++++++++++
rnv.system-paths-lookup.patch | 204 ++++++++++++++++++++++++++++++++++++
rvp.1 | 74 +++++++++++++
sources | 1 +
xsdck.1 | 18 +++
9 files changed, 552 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index e69de29..27d7e57 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/rnv-1.7.11.tar.xz
diff --git a/arx.1 b/arx.1
new file mode 100644
index 0000000..50faef6
--- /dev/null
+++ b/arx.1
@@ -0,0 +1,75 @@
+.TH ARX 1 "2013-8-12"
+
+.SH NAME
+arx \- automatically determines the type of an XML document
+
+.SH SYNOPSIS
+\fBarx\fP [\fIOPTIONS\fP] \fIdocument.xml\fP {\fIconfig_file.conf\fP ...}
+
+.SH DESCRIPTION
+\fBARX\fP is a tool to automatically determine the type of a document from its name and contents. It is inspired by James Clark's schema location approach for nXML.
+
+.SH OPTIONS
+ARX either prints a string corresponding to the document's type or nothing if the type cannot be determined. You can specify configuration files to override defaults in /etc/arx.conf. The options are:
+.TP
+.B -n
+turns off prepending base path of the configuration file to the result, even if it looks like a relative path (useful when the configuration file and the grammars are in separate directories, or for association with something that is not a file)
+.TP
+.B -v
+prints current version
+.TP
+.B -h
+displays usage summary and exits
+.SH FILES
+/etc/rnv/arx.conf
+
+The configuration file must conform to the following grammar:
+ arx = grammars route*
+ grammars = "grammars" "{" type2string+ "}"
+ type2string = type "=" literal
+ type = nmtoken
+ route = match|nomatch|valid|invalid
+ match = "=~" regexp "=>" type
+ nomatch = "!~" regexp "=>" type
+ valid = "valid" "{" rng "}" "=>" type
+ invalid = "!valid" "{" rng "}" "=>" type
+
+ literal = string in '"', '"' inside must be prepended by '\'
+ regexp = string in '/', '/' inside must be prepended by '\'
+ rng = Relax NG Compact Syntax
+
+Comments start with # and continue till the end of line.
+
+Rules are processed sequentially, the first matching rule determines the file's type. Relax NG templates are matched against file contents, regular expressions are applied to file names.
+
+.SH EXAMPLES
+The sample configuration below associates documents with grammars for XSLT, DocBook or XSL FO.
+
+ grammars {
+ docbook="docbook.rnc"
+ xslt="xslt.rnc"
+ xslfo="fo.rnc"
+ }
+
+ valid {
+ start = element (book|article|chapter|reference) {any}
+ any = (element * {any}|attribute * {text}|text)*
+ } => docbook
+
+ !valid {
+ default namespace xsl = "http://www.w3.org/1999/XSL/Transform"
+ start = element *-xsl:* {not-xsl}
+ not-xsl = (element *-xsl:* {not-xsl}|attribute * {text}|text)*
+ } => xslt
+
+ =~/.*\.xsl/ => xslt
+ =~/.*\.fo/ => xslfo
+
+.SH HOMEPAGE
+http://sourceforge.net/projects/rnv/
+
+.SH AUTHOR
+Michael\ Simacek\ <msimacek at redhat.com>. This man page was made from the readme written by \fBRNV\fP's author David Tolpin <dvd at davidashen.net>.
+
+.SH "SEE ALSO"
+rnv(1), rvp(1), xmllint(1), xmlstarlet(1), trang(1)
diff --git a/rnv.arx-conf-with-docbook.patch b/rnv.arx-conf-with-docbook.patch
new file mode 100644
index 0000000..8ad6a9b
--- /dev/null
+++ b/rnv.arx-conf-with-docbook.patch
@@ -0,0 +1,80 @@
+Index: tools/arx.conf
+===================================================================
+--- tools/arx.conf (revision 492)
++++ tools/arx.conf (working copy)
+@@ -4,46 +4,46 @@
+ # most of them can be obtained from http://relaxng.org/
+
+ grammars {
+-# docbook="docbook.rnc"
++ docbook="/usr/share/xml/docbook5/schema/rng/5.0/docbook.rnc"
+ # website="website-full.rnc"
+- xslt="xslt.rnc"
++# xslt="xslt.rnc"
+ # xhtml="xhtml.rnc"
+- xslfo="fo.rnc"
+- relaxng="relaxng.rnc"
+- none="none.rnc"
++# xslfo="fo.rnc"
++# relaxng="relaxng.rnc"
++# none="none.rnc"
+ }
+
++ valid {
++ start = element (set|setindex|book|part|reference|preface|chapter|appendix|article|bibliography|glossary|index|refentry|sect1|sect2|sect3|sect4|sect5|section) {any}
++ any = (element * {any}|attribute * {text}|text)*
++ } => docbook
++
+ # valid {
+-# start = element (set|setindex|book|part|reference|preface|chapter|appendix|article|bibliography|glossary|index|refentry|sect1|sect2|sect3|sect4|sect5|section) {any}
+-# any = (element * {any}|attribute * {text}|text)*
+-# } => docbook
+-#
+-# valid {
+ # start = element (webpage) {any}
+ # any = (element * {any}|attribute * {text}|text)*
+ # } => website
+
+-valid {
+- namespace fo="http://www.w3.org/1999/XSL/Format"
+- start = element fo:root {any}
+- any = (element * {any}|attribute * {text}|text)*
+-} => xslfo
++#valid {
++# namespace fo="http://www.w3.org/1999/XSL/Format"
++# start = element fo:root {any}
++# any = (element * {any}|attribute * {text}|text)*
++#} => xslfo
+
+-valid {
+- namespace rng = "http://relaxng.org/ns/structure/1.0"
+- start = element rng:* {any}
+- any = (element * {any}|attribute * {text}|text)*
+-} => relaxng
++#valid {
++# namespace rng = "http://relaxng.org/ns/structure/1.0"
++# start = element rng:* {any}
++# any = (element * {any}|attribute * {text}|text)*
++#} => relaxng
+
+-!valid {
+- default namespace xsl = "http://www.w3.org/1999/XSL/Transform"
+- start = element *-xsl:* {not-xsl}
+- not-xsl = (element *-xsl:* {not-xsl}|attribute * {text}|text)*
+-} => xslt
++#!valid {
++# default namespace xsl = "http://www.w3.org/1999/XSL/Transform"
++# start = element *-xsl:* {not-xsl}
++# not-xsl = (element *-xsl:* {not-xsl}|attribute * {text}|text)*
++#} => xslt
+
+ # =~/.*\.x?ht(ml?)?/ => xhtml
+-=~/.*\.xsl/ => xslt
+-# =~/.*\.dbx/ => docbook
++#=~/.*\.xsl/ => xslt
++ =~/.*\.dbx/ => docbook
+ # =~/.*doc\/[^\/]+\.xml/ => docbook
+-=~/.*\.fo/ => xslfo
+-=~/.*/ => none
++#=~/.*\.fo/ => xslfo
++#=~/.*/ => none
diff --git a/rnv.rvp-pl-wrong-interpreter.patch b/rnv.rvp-pl-wrong-interpreter.patch
new file mode 100644
index 0000000..a493073
--- /dev/null
+++ b/rnv.rvp-pl-wrong-interpreter.patch
@@ -0,0 +1,8 @@
+--- tools/rvp.pl.orig 2013-08-14 14:51:51.519762786 +0200
++++ tools/rvp.pl 2013-08-14 14:52:12.238827078 +0200
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl
++#!/usr/bin/perl
+ # $Id: rvp.pl 301 2004-01-14 16:42:38Z dvd $
+
+ # embedding sample for RVP, a part of RNV, http://davidashen.net/rnv.html
diff --git a/rnv.spec b/rnv.spec
new file mode 100644
index 0000000..2beffae
--- /dev/null
+++ b/rnv.spec
@@ -0,0 +1,91 @@
+Name: rnv
+Version: 1.7.11
+Release: 5%{?dist}
+Summary: Implementation of Relax NG Compact Syntax validator in ANSI C
+
+License: BSD
+URL: http://sourceforge.net/projects/rnv/
+Source0: http://downloads.sourceforge.net/project/rnv/Sources/%{version}/%{name}-%{version}.tar.xz
+Source1: arx.1
+Source2: xsdck.1
+Source3: rvp.1
+# Sent upstream via email
+Patch0: %{name}.system-paths-lookup.patch
+# Adds docbook to arx.conf, because upstream version doesn't ship any useful schemas
+Patch1: %{name}.arx-conf-with-docbook.patch
+Patch2: %{name}.rvp-pl-wrong-interpreter.patch
+
+BuildRequires: expat-devel
+BuildRequires: autoconf
+BuildRequires: automake
+Requires: docbook5-schemas
+
+%package -n vim-rnv
+Summary: Vim plugin for validating XML files against Relax NG Compact schemas using RNV
+
+Requires: vim-common
+Requires: %{name}%{?_isa} = %{version}-%{release}
+BuildArch: noarch
+
+%description
+RNV uses Relax NG compact syntax schemas to check if a give XML file is
+valid in respect to the language defined by the Relax NG schema. RNV
+uses Expat for XML parsing.
+
+%description -n vim-rnv
+Vim plugin providing redefined make command that validates
+XML files against Relax NG schemas.
+
+%prep
+%setup -q
+%patch0
+%patch1
+%patch2
+
+cp -p %SOURCE1 .
+cp -p %SOURCE2 .
+cp -p %SOURCE3 .
+
+%build
+autoreconf -i
+%configure --enable-dxl
+make %{?_smp_mflags}
+
+%install
+%make_install
+
+%files
+%{_bindir}/rnv
+%{_bindir}/arx
+%{_bindir}/xsdck
+%{_bindir}/rvp
+%{_mandir}/man1/rnv.1*
+%{_mandir}/man1/rvp.1*
+%{_mandir}/man1/arx.1*
+%{_mandir}/man1/xsdck.1*
+%dir %{_sysconfdir}/rnv
+%config(noreplace) %{_sysconfdir}/rnv/arx.conf
+%doc COPYING ChangeLog readme.txt
+%docdir %{_docdir}/rnv/examples
+%doc %{_docdir}/rnv/examples/rvp.py*
+%doc %{_docdir}/rnv/examples/rvp.pl
+
+%files -n vim-rnv
+%{_datadir}/vim/vimfiles/plugin/rnv.vim
+
+%changelog
+* Fri Aug 16 2013 Michael Simacek <msimacek at redhat.com> - 1.7.11-5
+- Modified subpackages to comply to Package Guidelines
+
+* Fri Aug 16 2013 Michael Simacek <msimacek at redhat.com> - 1.7.11-4
+- Package autoreconf'ed instead of patching Makefile.in
+
+* Thu Aug 15 2013 Michael Simacek <msimacek at redhat.com> - 1.7.11-3
+- Renamed vim plugin subpackage to follow naming guidelines
+
+* Wed Aug 14 2013 Michael Simacek <msimacek at redhat.com> - 1.7.11-2
+- Patched arx, rnv and build to use global config file /etc/arx.conf and global grammars in /usr/shar/rnv/grammars
+- Created man pages for arx, rvp and xsdck
+
+* Thu Aug 08 2013 Michael Simacek <msimacek at redhat.com> - 1.7.11-1
+- Initial version
diff --git a/rnv.system-paths-lookup.patch b/rnv.system-paths-lookup.patch
new file mode 100644
index 0000000..e843832
--- /dev/null
+++ b/rnv.system-paths-lookup.patch
@@ -0,0 +1,204 @@
+diff -ur ../rnv-orig/arx.c ./arx.c
+--- ../rnv-orig/arx.c 2013-08-14 12:49:45.972975194 +0200
++++ ./arx.c 2013-08-14 12:55:36.221042398 +0200
+@@ -42,6 +42,10 @@
+ #include "er.h"
+ #include "ary.h"
+
++#ifndef ARX_CONF_PATH
++#define ARX_CONF_PATH "/etc/rnv/arx.conf"
++#endif
++
+ extern int rn_notAllowed;
+
+ /* rules */
+@@ -427,6 +431,25 @@
+ static void version(void) {(*er_printf)("arx version %s\n",ARX_VERSION);}
+ static void usage(void) {(*er_printf)("usage: arx {-[nvh?]} document.xml arx.conf {arx.conf}\n");}
+
++int process() {
++ int i;
++ int fd;
++ for(i=0;i!=i_r;++i) {
++ switch(rules[i][0]) {
++ case VALID: if((ok=wf)) {validate(rules[i][1],fd=open(xml,O_RDONLY)); close(fd);} break;
++ case INVAL: if((ok=wf)) {validate(rules[i][1],fd=open(xml,O_RDONLY)); close(fd); ok=wf&&!ok;} break;
++ case MATCH: ok=rx_match(string+rules[i][1],xml,strlen(xml)); break;
++ case NOMAT: ok=!rx_match(string+rules[i][1],xml,strlen(xml)); break;
++ default: assert(0);
++ }
++ if(ok) {
++ printf("%s\n",string+rules[i][2]);
++ return 1;
++ }
++ }
++ return 0;
++}
++
+ int main(int argc,char **argv) {
+ int fd;
+ init();
+@@ -447,27 +470,18 @@
+ END_OF_OPTIONS:;
+ }
+
+- if(!(*(argv)&&*(argv+1))) {usage(); return 1;}
++ if(!(*(argv))) {usage(); return 1;}
+
+ xml=*(argv++); if((wf=(fd=open(xml,O_RDONLY))!=-1)) close(fd);
+- do {
+- if(arx(*(argv++))) {
+- int i;
+- for(i=0;i!=i_r;++i) {
+- switch(rules[i][0]) {
+- case VALID: if((ok=wf)) {validate(rules[i][1],fd=open(xml,O_RDONLY)); close(fd);} break;
+- case INVAL: if((ok=wf)) {validate(rules[i][1],fd=open(xml,O_RDONLY)); close(fd); ok=wf&&!ok;} break;
+- case MATCH: ok=rx_match(string+rules[i][1],xml,strlen(xml)); break;
+- case NOMAT: ok=!rx_match(string+rules[i][1],xml,strlen(xml)); break;
+- default: assert(0);
+- }
+- if(ok) {
+- printf("%s\n",string+rules[i][2]);
+- return EXIT_SUCCESS;
+- }
++ if(*argv){
++ do{
++ if(arx(*(argv++))) {
++ if(process()) return EXIT_SUCCESS;
+ }
+- }
+- clear();
+- } while(*argv);
++ clear();
++ }while(*argv);
++ } else if(arx(ARX_CONF_PATH)) {
++ if(process()) return EXIT_SUCCESS;
++ }
+ return EXIT_FAILURE;
+ }
+diff -ur ../rnv-orig/Makefile.am ./Makefile.am
+--- ../rnv-orig/Makefile.am 2013-08-14 12:49:45.973975194 +0200
++++ ./Makefile.am 2013-08-14 12:56:06.797129486 +0200
+@@ -6,9 +6,12 @@
+
+ TESTS = rnvtest
+
+-man_MANS = rnv.1
++man_MANS = rnv.1 arx.1 rvp.1 xsdck.1
+
++rnvconfdir = $(sysconfdir)/rnv
++rnvconf_DATA = tools/arx.conf
+
++grammarsdir = $(datadir)/rnv/grammars
+
+ librnv1_a_SOURCES = \
+ ary.h ary.c \
+@@ -39,7 +42,7 @@
+
+
+
+-rnv_CPPFLAGS = -DRNV_VERSION=\"@VERSION@\"
++rnv_CPPFLAGS = -DRNV_VERSION=\"@VERSION@\" -DGRAMMAR_PATH=\"$(grammarsdir)/\"
+ rnv_LDADD = librnv1.a librnv2.a
+
+ rnv_SOURCES = \
+@@ -48,7 +51,7 @@
+
+
+
+-arx_CPPFLAGS = -DARX_VERSION=\"@VERSION@\"
++arx_CPPFLAGS = -DARX_VERSION=\"@VERSION@\" -DARX_CONF_PATH=\"$(rnvconfdir)/arx.conf\"
+ arx_LDADD = librnv1.a
+
+ arx_SOURCES = \
+@@ -76,7 +79,11 @@
+ rnvtest_SOURCES = \
+ test.c
+
++examplesdir = $(docdir)/examples
++examples_DATA = tools/rvp.pl tools/rvp.py
+
++vimplugindir = $(datadir)/vim/vimfiles/plugin
++vimplugin_DATA = tools/rnv.vim
+
+ EXTRA_DIST = \
+ scm/dsl.scm \
+@@ -105,6 +112,9 @@
+ readme.txt \
+ readme32.txt \
+ rnv.1 \
++ rvp.1 \
++ arx.1 \
++ xsdck.1 \
+ src.txt \
+ \
+ build_vms.com \
+diff -ur ../rnv-orig/tools/rnv.vim ./tools/rnv.vim
+--- ../rnv-orig/tools/rnv.vim 2013-08-16 14:47:08.641993845 +0200
++++ ./tools/rnv.vim 2013-08-14 12:50:51.918190562 +0200
+@@ -6,7 +6,7 @@
+ let s:cpo_save = &cpo
+ set cpo-=C
+
+-setlocal makeprg=rnv\ -q\ `arx\ %\ /usr/local/share/rng-c/arx.conf`\ %
++setlocal makeprg=rnv\ -q\ `arx\ -n\ %\ `\ %
+ setlocal errorformat=error\ (%f\\,%l\\,%c):\ %m
+
+ let &cpo = s:cpo_save
+diff -ur ../rnv-orig/xcl.c ./xcl.c
+--- ../rnv-orig/xcl.c 2013-08-14 12:49:45.973975194 +0200
++++ ./xcl.c 2013-08-14 12:55:49.893081430 +0200
+@@ -38,6 +38,10 @@
+ #define PIXGFILE "davidashen-net-xg-file"
+ #define PIXGPOS "davidashen-net-xg-pos"
+
++#ifndef GRAMMAR_PATH
++#define GRAMMAR_PATH "/usr/share/rnv/grammars/"
++#endif
++
+ static int peipe,verbose,nexp,rnck;
+ static char *xml;
+ static XML_Parser expat=NULL;
+@@ -225,6 +229,8 @@
+
+ int main(int argc,char **argv) {
+ init();
++ char *path = 0;
++ int fd;
+
+ peipe=0; verbose=1; nexp=NEXP; rnck=0;
+ while(*(++argv)&&**argv=='-') {
+@@ -254,10 +260,24 @@
+
+ if(!*(argv)) {usage(); return 1;}
+
+- if((ok=start=rnl_fn(*(argv++)))) {
++ if((fd=open(*argv,O_RDONLY))!=-1){
++ ok=start=rnl_fd(*argv,fd);
++ } else {
++ path=m_alloc(sizeof(GRAMMAR_PATH)+strlen(*argv),sizeof(char));
++ strcpy(path,GRAMMAR_PATH);
++ strcat(path,*argv);
++ if((fd=open(path, O_RDONLY))==-1) {
++ (*er_printf)("File %s not found.", *argv);
++ return -1;
++ }
++ ok=start=rnl_fd(path,fd);
++ }
++
++ argv++;
++ if(ok) {
+ if(*argv) {
+ do {
+- int fd; xml=*argv;
++ xml=*argv;
+ if((fd=open(xml,O_RDONLY))==-1) {
+ (*er_printf)("I/O error (%s): %s\n",xml,strerror(errno));
+ ok=0;
+@@ -279,5 +299,6 @@
+ }
+ }
+
++ if(path) m_free(path);
+ return ok?EXIT_SUCCESS:EXIT_FAILURE;
+ }
diff --git a/rvp.1 b/rvp.1
new file mode 100644
index 0000000..6c89022
--- /dev/null
+++ b/rvp.1
@@ -0,0 +1,74 @@
+.TH RVP 1 "2013-8-12"
+
+.SH NAME
+rvp \- Relax NG validation pipe
+
+.SH SYNOPSIS
+\fBrvp\fP {\fB-q\fP|\fB-s\fP|\fB-v\fP|\fB-h\fP} {\fIschema.rnc\fP}
+
+.SH OPTIONS
+.TP
+.B -q
+returns only error numbers, suppresses messages
+.TP
+.B -s
+takes less memory and runs slower
+.TP
+.B -v
+prints current version
+.TP
+.B -h
+displays usage summary and exits
+
+.SH DESCRIPTION
+\fBRVP\fP is abbreviation for \fBRelax NG Validation Pipe\fP. It reads validation primitives from the standard input and reports result to the standard output; it's main purpose is to ease embedding of a Relax NG validator into various languages and environment. An application would launch RVP as a parallel process and use a simple protocol to perform validation. The protocol, in BNF, is:
+
+ query ::= (
+ quit
+ | start
+ | start-tag-open
+ | attribute
+ | start-tag-close
+ | text
+ | end-tag) z.
+ quit ::= "quit".
+ start ::= "start" [gramno].
+ start-tag-open ::= "start-tag-open" patno name.
+ attribute ::= "attribute" patno name value.
+ start-tag-close :: = "start-tag-close" patno name.
+ text ::= ("text"|"mixed") patno text.
+ end-tag ::= "end-tag" patno name.
+ response ::= (ok | er | error) z.
+ ok ::= "ok" patno.
+ er ::= "er" patno erno.
+ error ::= "error" patno erno error.
+ z ::= "\\0" .
+
+.TP
+RVP assumes that the last colon in a name separates the local partfrom the namespace URI (it is what one gets if specifies `:' as namespace separator to Expat).
+.TP
+Error codes can be grabbed from rvp sources by grep _ER_.h and OR-ing them with corresponding masks from erbit.h. Additionally, error 0 is the protocol format error.
+.TP
+Either er or error responses are returned, not both; -q chooses between concise and verbose forms (invocation syntax described later).
+.TP
+Start passes the index of a grammar (first grammar in the list of command-line arguments has number 0); if the number is omitted, 0 is assumed.
+.TP
+Quit is not opposite of start; instead, it quits RVP.
+
+.SH EXAMPLES
+To assist embedding RVP, samples in Perl and Python are provided. The scripts use Expat wrappers for each of the languages to parse documents; they take a Relax NG grammar (in the compact syntax) as the command line argument and read the XML from the standard input. For example, the following commands validate rnv.dbx against docbook.rnc:
+
+ perl rvp.pl docbook.rnc < rnv.dbx
+ python rvp.py docbook.rnc < rnv.dbx
+
+The scripts are kept simple and unobscured to illustrate the technique, rather than being designed as general-purpose modules. Programmers using Perl, Python, Ruby and other languages are encouraged to implement and share reusable RVP-based components for their languages of choice.
+
+.SH HOMEPAGE
+http://sourceforge.net/projects/rnv/
+
+.SH AUTHOR
+Michael\ Simacek\ <msimacek at redhat.com>. This man page was made from the readme written by \fBRNV\fP's author David Tolpin <dvd at davidashen.net>.
+
+.SH "SEE ALSO"
+rnv(1), arx(1), xmllint(1), xmlstarlet(1), trang(1)
+
diff --git a/sources b/sources
index e69de29..4a3fb11 100644
--- a/sources
+++ b/sources
@@ -0,0 +1 @@
+c8e10bf9a5aed35c55fd9f4310168584 rnv-1.7.11.tar.xz
diff --git a/xsdck.1 b/xsdck.1
new file mode 100644
index 0000000..e4a4081
--- /dev/null
+++ b/xsdck.1
@@ -0,0 +1,18 @@
+.TH XSDCK 1 "2013-8-12"
+.SH NAME
+xsdck \- rnv plugin for XSD datatypes
+
+.SH SYNOPSIS
+\fBrnv -d xsdck\fP [\fIRNV_OPTIONS\fP] \fI grammar.rnc\fP [\fIdocument.xml\fP ...]
+
+.SH DESCRIPTION
+Both \fBRNV\fP and \fBRVP\fP can use pluggable datatypes. This module provides support for \fBXSD\fP datatypes.
+
+.SH HOMEPAGE
+http://sourceforge.net/projects/rnv/
+.\"--------------------------------------------------------------
+.SH AUTHOR
+Michael Simacek <msimacek at redhat.com>. This man page was made from the readme written by \fBRNV\fP's author David Tolpin <dvd at davidashen.net>.
+.\"--------------------------------------------------------------
+.SH "SEE ALSO"
+rnv(1), rvp(1), xmllint(1), xmlstarlet(1), trang(1)
More information about the scm-commits
mailing list