aboutsummaryrefslogtreecommitdiff
path: root/src/bin/psql/create_help.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/psql/create_help.pl')
-rw-r--r--src/bin/psql/create_help.pl91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
new file mode 100644
index 00000000000..c877a8d1d42
--- /dev/null
+++ b/src/bin/psql/create_help.pl
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+
+#
+# This script automatically generates the help on SQL in psql from the
+# SGML docs. So far the format of the docs was consistent enough that
+# this worked, but this here is my no means an SGML parser.
+#
+# It might be a good idea that this is just done once before distribution
+# so people that don't have the docs or have slightly messed up docs or
+# don't have perl, etc. won't have to bother.
+#
+# Call: perl create_help.pl sql_help.h
+# (Do not rely on this script to be executable.)
+# The name of the header file doesn't matter to this script, but it sure
+# does matter to the rest of the source.
+#
+# A rule for this is also in the psql makefile.
+#
+
+$docdir = "./../../../doc/src/sgml/ref";
+$outputfile = $ARGV[0] or die "Missing required argument.\n";
+
+$define = $outputfile;
+$define =~ tr/a-z/A-Z/;
+$define =~ s/\W/_/g;
+
+opendir DIR, $docdir or die "Couldn't open documentation sources: $!\n";
+open OUT, ">$outputfile" or die "Couldn't open output file '$outputfile': $!\n";
+
+print OUT
+"/*
+ * This file is automatically generated from the SGML documentation.
+ * Direct changes here will be overwritten.
+ */
+#ifndef $define
+#define $define
+
+struct _helpStruct
+{
+ char *cmd; /* the command name */
+ char *help; /* the help associated with it */
+ char *syntax; /* the syntax associated with it */
+};
+
+
+static struct _helpStruct QL_HELP[] = {
+";
+
+foreach $file (readdir DIR) {
+ my ($cmdname, $cmddesc, $cmdsynopsis);
+ $file =~ /\.sgml$/ || next;
+
+ open FILE, "$docdir/$file" or next;
+ $filecontent = join('', <FILE>);
+ close FILE;
+
+ $filecontent =~ m!<refmiscinfo>\s*SQL - Language Statements\s*</refmiscinfo>!i
+ or next;
+
+ $filecontent =~ m!<refname>\s*([a-z ]+?)\s*</refname>!i && ($cmdname = $1);
+ $filecontent =~ m!<refpurpose>\s*(.+?)\s*</refpurpose>!i && ($cmddesc = $1);
+
+ $filecontent =~ m!<synopsis>\s*(.+?)\s*</synopsis>!is && ($cmdsynopsis = $1);
+
+ if ($cmdname && $cmddesc && $cmdsynopsis) {
+ $cmdname =~ s/\"/\\"/g;
+
+ $cmddesc =~ s/<\/?.+?>//sg;
+ $cmddesc =~ s/\n/ /g;
+ $cmddesc =~ s/\"/\\"/g;
+
+ $cmdsynopsis =~ s/<\/?.+?>//sg;
+ $cmdsynopsis =~ s/\n/\\n/g;
+ $cmdsynopsis =~ s/\"/\\"/g;
+
+ print OUT " { \"$cmdname\",\n \"$cmddesc\",\n \"$cmdsynopsis\" },\n\n";
+ }
+ else {
+ print STDERR "Couldn't parse file '$file'. (N='$cmdname' D='$cmddesc')\n";
+ }
+}
+
+print OUT "
+ { NULL, NULL, NULL } /* End of list marker */
+};
+
+#endif /* $define */
+";
+
+close OUT;
+closedir DIR;