bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: x-to-1


From: Bruno Haible
Subject: Re: x-to-1
Date: Thu, 09 Feb 2023 03:49:12 +0100

Reuben Thomas wrote:
> 1. Before, I passed --locale=en_US.UTF-8 so I could use non-ASCII
> characters in my man pages directly. The --version output of recode
> mentions the original author's name, François Pinard. I guess I can get
> around that with a manual AUTHOR section that uses a \*['] sequence, but
> that seems a shame.
> 
> 2. Similarly, I passed a --name option, which avoids having to repeat the
> name of the program in a .x file's NAME section.
> 
> In general, then, it would be good if x-to-1 ignored unknown options and
> passed them to help2man; would that be possible?

Passing down additional options to help2man is a very good idea; implemented
below. Ignoring unknown options is not such a good idea; not implemented.

I tested this patch with GNU gettext, by passing the additional option
  --locale=de_DE.UTF-8

help2man produced a gettext.1 file with German contents, in UTF-8 encoding.
With "groff -Tutf8 -Dutf-8 -mandoc gettext.1" it then renders nicely in a
console/terminal window.


2023-02-08  Bruno Haible  <bruno@clisp.org>

        x-to-1: Accept additional help2man arguments.
        Suggested by Reuben Thomas <rrt@sc3d.org> in
        <https://lists.gnu.org/archive/html/bug-gnulib/2023-02/msg00078.html>.
        * build-aux/x-to-1.in: Allow additional options after the HELP2MAN
        argument, and pass them down to help2man.

diff --git a/build-aux/x-to-1.in b/build-aux/x-to-1.in
index 6dc01157f5..daa37c85aa 100644
--- a/build-aux/x-to-1.in
+++ b/build-aux/x-to-1.in
@@ -19,12 +19,13 @@
 # This program creates a program's manual from the .x skeleton and its --help
 # output.
 #
-# Usage: x-to-1 [OPTIONS] PERL HELP2MAN EXECUTABLE PROGRAM.x PROGRAM.1
+# Usage: x-to-1 [OPTIONS] PERL HELP2MAN [HELP2MAN-OPTIONS] EXECUTABLE 
PROGRAM.x PROGRAM.1
 # where
 #
 #   PERL        The file name of the perl program.
 #   HELP2MAN    Either the file name of the help2man perl script, or a complete
 #               command such as "$PERL -w -- help2man".
+#   HELP2MAN-OPTIONS  Options to pass to the help2man perl script.
 #   EXECUTABLE  The file name of the program to invoke with --help.
 #   PROGRAM     The name of the program.
 #   PROGRAM.x   The .x skeleton is a file containing manual page text that is
@@ -56,15 +57,34 @@ while true; do
   esac
 done
 
-if test $# != 5; then
-  echo "Usage: x-to-1 [OPTIONS] PERL HELP2MAN executable program.x program.1" 
1>&2
+if test $# -lt 5; then
+  echo "Usage: x-to-1 [OPTIONS] PERL HELP2MAN [HELP2MAN-OPTIONS] executable 
program.x program.1" 1>&2
   exit 1
 fi
-PERL="$1"
-HELP2MAN="$2"
-executable="$3"
-aux="$4"
-output="$5"
+
+# In order to construct a command that invokes HELP2MAN [HELP2MAN-OPTIONS] ...
+# we need 'eval'.
+command_for_print=
+command_for_eval=
+# Protecting special characters, hiding them from 'eval':
+# Double each backslash.
+sed_protect_1='s/\\/\\\\/g'
+# Escape each dollar, backquote, double-quote.
+sed_protect_2a='s/\$/\\$/g'
+sed_protect_2b='s/`/\\`/g'
+sed_protect_2c='s/"/\\"/g'
+# Add double-quotes at the beginning and end of the word.
+sed_protect_3a='1s/^/"/'
+sed_protect_3b='$s/$/"/'
+func_add_word_to_command ()
+{
+  command_for_print="${command_for_print:+$command_for_print }$1"
+  word_protected=`echo "$1" | sed -e "$sed_protect_1" -e "$sed_protect_2a" -e 
"$sed_protect_2b" -e "$sed_protect_2c" -e "$sed_protect_3a" -e 
"$sed_protect_3b"`
+  command_for_eval="${command_for_eval:+$command_for_eval }$word_protected"
+}
+
+PERL="$1"; shift
+HELP2MAN="$1"; shift
 
 # Accommodate both possible forms of the HELP2MAN argument.
 case "$HELP2MAN" in
@@ -72,6 +92,22 @@ case "$HELP2MAN" in
   *) HELP2MAN="$PERL $HELP2MAN" ;;
 esac
 
+# Do word-splitting of $HELP2MAN, but carefully.
+for word in $HELP2MAN; do
+  func_add_word_to_command "$word"
+done
+
+# Now grok the HELP2MAN-OPTIONS.
+while test $# -gt 3; do
+  arg="$1"; shift
+  func_add_word_to_command "$arg"
+done
+
+# Grok the final arguments.
+executable="$1"
+aux="$2"
+output="$3"
+
 progname=`basename $aux .x`
 # configure determined whether perl exists.
 case "$PERL" in
@@ -89,9 +125,11 @@ case "$PERL" in
 esac
 if test @CROSS_COMPILING@ = no && test -f $executable && test $perlok = yes; 
then
   echo "Updating man page $output"
-  echo "$HELP2MAN --include=$aux $executable > $output"
+  func_add_word_to_command "--include=$aux"
+  func_add_word_to_command "$executable"
+  echo "$command_for_print > $output"
   rm -f t-$progname.1
-  $HELP2MAN --include=$aux $executable > t-$progname.1 || exit 1
+  eval $command_for_eval > t-$progname.1 || exit 1
   if test -n "$update"; then
     # In --update mode, don't overwrite the output if nothing would change.
     if cmp t-$progname.1 $output >/dev/null 2>&1; then






reply via email to

[Prev in Thread] Current Thread [Next in Thread]