diff --git a/src/bin/psql/Makefile.in b/src/bin/psql/Makefile.in
index da8e2860963ab03f3c166ef605edca41c4d78d0c..49600c8ccb503fc8476325e3adb1dbc6cf3f69c4 100644
--- a/src/bin/psql/Makefile.in
+++ b/src/bin/psql/Makefile.in
@@ -7,14 +7,16 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/psql/Attic/Makefile.in,v 1.22 2000/04/14 23:43:44 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/psql/Attic/Makefile.in,v 1.23 2000/04/16 18:07:22 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
 SRCDIR= ../..
-include ../../Makefile.global
+include $(SRCDIR)/Makefile.global
 
-CFLAGS:= -I$(LIBPQDIR) $(CFLAGS)
+DOCDIR= $(SRCDIR)/../doc/src/sgml/ref
+
+CFLAGS+= -I$(LIBPQDIR)
 
 #
 # And where libpq goes, so goes the authentication stuff...
@@ -61,8 +63,8 @@ psql: $(OBJS) $(LIBPQDIR)/libpq.a
 help.o: sql_help.h
 
 ifneq ($(strip $(PERL)),) 
-sql_help.h: $(wildcard $(SRCDIR)/../doc/src/sgml/ref/*.sgml) create_help.pl
-	$(PERL) create_help.pl sql_help.h 
+sql_help.h: $(wildcard $(DOCDIR)/*.sgml) create_help.pl
+	$(PERL) create_help.pl $(DOCDIR) sql_help.h 
 else
 sql_help.h:
 	@echo "*** Perl is needed to build psql help."
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
index f8e5379c8936476c1b1faf84584ab443e3755371..875ff843837a9441e2f64566c1638af7ac174ad5 100644
--- a/src/bin/psql/create_help.pl
+++ b/src/bin/psql/create_help.pl
@@ -5,7 +5,7 @@
 #
 # Copyright 2000 by PostgreSQL Global Development Group
 #
-# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.5 2000/03/01 21:09:58 petere Exp $
+# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.6 2000/04/16 18:07:22 tgl Exp $
 #################################################################
 
 #
@@ -14,20 +14,22 @@
 # enough that this worked, but this here is by no means an SGML
 # parser.
 #
-# Call: perl create_help.pl sql_help.h
+# Call: perl create_help.pl docdir sql_help.h
 # The name of the header file doesn't matter to this script, but it
 # sure does matter to the rest of the source.
 #
 
-$docdir = "./../../../doc/src/sgml/ref";
-$outputfile = $ARGV[0] or die "$0: missing required argument\n";
+$docdir = $ARGV[0] || die "$0: missing required argument: docdir\n";
+$outputfile = $ARGV[1] || die "$0: missing required argument: output file\n";
 
 $define = $outputfile;
 $define =~ tr/a-z/A-Z/;
 $define =~ s/\W/_/g;
 
-opendir DIR, $docdir or die "$0: could not open documentation sources: $!\n";
-open OUT, ">$outputfile" or die "$0: could not open output file '$outputfile': $!\n";
+opendir(DIR, $docdir)
+    || die "$0: could not open documentation source dir '$docdir': $!\n";
+open(OUT, ">$outputfile")
+    || die "$0: could not open output file '$outputfile': $!\n";
 
 print OUT
 "/*
@@ -57,29 +59,48 @@ static struct _helpStruct QL_HELP[] = {
 $count = 0;
 
 foreach $file (sort readdir DIR) {
-    my ($cmdname, $cmddesc, $cmdsynopsis);
+    local ($cmdname, $cmddesc, $cmdsynopsis);
     $file =~ /\.sgml$/ || next;
 
-    open FILE, "$docdir/$file" or next;
+    open(FILE, "$docdir/$file") || next;
     $filecontent = join('', <FILE>);
     close FILE;
 
+    # Ignore files that are not for SQL language statements
     $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);
+	|| next;
+
+    # Extract <refname>, <refpurpose>, and <synopsis> fields, taking the
+    # first one if there are more than one.  NOTE: we cannot just say
+    # "<synopsis>(.*)</synopsis>", because that will match the first
+    # occurrence of <synopsis> and the last one of </synopsis>!  Under
+    # Perl 5 we could use a non-greedy wildcard, .*?, to ensure we match
+    # the first </synopsis>, but we want this script to run under Perl 4
+    # too, and Perl 4 hasn't got that feature.  So, do it the hard way.
+    # Also, use [\000-\377] where we want to match anything including
+    # newline --- Perl 4 does not have Perl 5's /s modifier.
+    $filecontent =~ m!<refname>\s*([a-z ]*[a-z])\s*</refname>!i && ($cmdname = $1);
+    if ($filecontent =~ m!<refpurpose>\s*([\000-\377]+)$!i) {
+	$tmp = $1;		# everything after first <refpurpose>
+	if ($tmp =~ s!\s*</refpurpose>[\000-\377]*$!!i) {
+	    $cmddesc = $tmp;
+	}
+    }
+    if ($filecontent =~ m!<synopsis>\s*([\000-\377]+)$!i) {
+	$tmp = $1;		# everything after first <synopsis>
+	if ($tmp =~ s!\s*</synopsis>[\000-\377]*$!!i) {
+	    $cmdsynopsis = $tmp;
+	}
+    }
 
     if ($cmdname && $cmddesc && $cmdsynopsis) {
         $cmdname =~ s/\"/\\"/g;
 
-	$cmddesc =~ s/<\/?.+?>//sg;
-	$cmddesc =~ s/\n/ /g;
+	$cmddesc =~ s/<[^>]+>//g;
+	$cmddesc =~ s/\s+/ /g;
         $cmddesc =~ s/\"/\\"/g;
 
-	$cmdsynopsis =~ s/<\/?.+?>//sg;
+	$cmdsynopsis =~ s/<[^>]+>//g;
 	$cmdsynopsis =~ s/\n/\\n/g;
         $cmdsynopsis =~ s/\"/\\"/g;