c311a36cc9
Cross-compilation of mutt is broken since bump to version 1.13.3 with
commit d42603b387
Indeed, since upstream commit 9bacbaa9, even with --disable-doc, mutt
tries to generate and install documentation files.
Build fails because mutt wants to generate muttrc.man by building (and
then running) a makedoc binary with the target cross-compiler (which
will obviously fail).
See https://gitlab.com/muttmua/mutt/issues/202
To fix this issue, retrieve two upstream patches.
Fixes:
- http://autobuild.buildroot.org/results/2b01b7e65c0dc0e1191ba48e02e31503958d82fe
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
1091 lines
27 KiB
Diff
1091 lines
27 KiB
Diff
From 27fdc2f5b55fa1849d1b51fa866a4c2a4e83a3cd Mon Sep 17 00:00:00 2001
|
|
From: Kevin McCarthy <kevin@8t8.us>
|
|
Date: Tue, 24 Dec 2019 19:04:07 -0800
|
|
Subject: [PATCH] Convert makedoc.c to makedoc.pl.
|
|
|
|
This removes the build-time dependency on a compiled program, which
|
|
doesn't work for cross-compilation.
|
|
|
|
My perl is pretty rusty, and the result isn't super pretty. However,
|
|
since perl is already a build dependency, it made the most sense to
|
|
use that. The output of Muttrc, muttrc.man, and manual.xml match.
|
|
|
|
There might be a few bugs, so I'm going to leave makedoc.c in for now
|
|
as a reference.
|
|
|
|
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
|
|
[Retrieved from:
|
|
https://gitlab.com/muttmua/mutt/commit/27fdc2f5b55fa1849d1b51fa866a4c2a4e83a3cd]
|
|
---
|
|
doc/Makefile.am | 16 +-
|
|
doc/devel-notes.txt | 2 +-
|
|
doc/makedoc.pl | 952 ++++++++++++++++++++++++++++++++++++++++++++
|
|
init.h | 2 +-
|
|
sort.h | 2 +-
|
|
5 files changed, 962 insertions(+), 12 deletions(-)
|
|
create mode 100644 doc/makedoc.pl
|
|
|
|
diff --git a/doc/Makefile.am b/doc/Makefile.am
|
|
index 8f94a09b..1cb21b64 100644
|
|
--- a/doc/Makefile.am
|
|
+++ b/doc/Makefile.am
|
|
@@ -17,8 +17,6 @@ AM_CPPFLAGS = -I. -I.. -I$(includedir) -I$(top_srcdir)
|
|
|
|
MAKEDOC_CPP = $(CPP) $(AM_CPPFLAGS) $(DEFS) $(CPPFLAGS) -D_MAKEDOC -C
|
|
|
|
-noinst_PROGRAMS = makedoc
|
|
-
|
|
EXTRA_DIST = dotlock.man \
|
|
smime_keys.man \
|
|
mutt.man \
|
|
@@ -38,7 +36,7 @@ EXTRA_DIST = dotlock.man \
|
|
patch-notes.txt \
|
|
smime-notes.txt \
|
|
Muttrc Muttrc.head stamp-doc-rc \
|
|
- makedoc.c makedoc-defs.h \
|
|
+ makedoc.pl makedoc-defs.h \
|
|
mutt.css mutt.xsl html.xsl chunk.xsl $(BUILT_DISTFILES)
|
|
|
|
CHUNKED_DOCFILES = index.html intro.html gettingstarted.html \
|
|
@@ -136,11 +134,11 @@ manual.txt: manual.html
|
|
|
|
Muttrc: stamp-doc-rc
|
|
|
|
-stamp-doc-rc: $(top_srcdir)/init.h makedoc$(EXEEXT) $(srcdir)/Muttrc.head
|
|
+stamp-doc-rc: $(top_srcdir)/init.h makedoc.pl $(srcdir)/Muttrc.head
|
|
-rm -f Muttrc stamp-doc-rc
|
|
sed -e 's,[@]docdir[@],$(docdir),' $(srcdir)/Muttrc.head > Muttrc
|
|
$(CPP) $(AM_CPPFLAGS) $(DEFS) $(CPPFLAGS) -D_MAKEDOC -C \
|
|
- $(top_srcdir)/init.h | ./makedoc$(EXEEXT) -c >> Muttrc
|
|
+ $(top_srcdir)/init.h | perl $(srcdir)/makedoc.pl -c >> Muttrc
|
|
touch stamp-doc-rc
|
|
|
|
manual.html: $(srcdir)/html.xsl $(srcdir)/mutt.xsl stamp-doc-xml $(srcdir)/mutt.css
|
|
@@ -211,8 +209,8 @@ instdoc: instdoc.sh
|
|
|
|
update-doc: stamp-doc-rc $(BUILD_DOC_TARGETS)
|
|
|
|
-muttrc.man: makedoc$(EXEEXT) $(top_srcdir)/init.h muttrc.man.head muttrc.man.tail
|
|
- $(MAKEDOC_CPP) $(top_srcdir)/init.h | ./makedoc$(EXEEXT) -m | \
|
|
+muttrc.man: makedoc.pl $(top_srcdir)/init.h muttrc.man.head muttrc.man.tail
|
|
+ $(MAKEDOC_CPP) $(top_srcdir)/init.h | perl $(srcdir)/makedoc.pl -m | \
|
|
cat $(srcdir)/muttrc.man.head - $(srcdir)/muttrc.man.tail\
|
|
> muttrc.man
|
|
|
|
@@ -232,13 +230,13 @@ mutt_pgpring.1: $(srcdir)/pgpring.man
|
|
smime_keys.1: $(srcdir)/smime_keys.man
|
|
$(EDIT) $(srcdir)/smime_keys.man > $@
|
|
|
|
-stamp-doc-xml: makedoc$(EXEEXT) $(top_srcdir)/init.h \
|
|
+stamp-doc-xml: makedoc.pl $(top_srcdir)/init.h \
|
|
manual.xml.head $(top_srcdir)/functions.h $(top_srcdir)/OPS* manual.xml.tail \
|
|
$(srcdir)/gen-map-doc $(top_srcdir)/VERSION $(top_srcdir)/ChangeLog
|
|
( date=`(cd $(top_srcdir) && ./mkreldate.sh)` && \
|
|
version=`(cd $(top_srcdir) && env sh ./version.sh)` && \
|
|
sed -e "s/@VERSION\@/$$version ($$date)/" $(srcdir)/manual.xml.head && \
|
|
- $(MAKEDOC_CPP) $(top_srcdir)/init.h | ./makedoc$(EXEEXT) -s && \
|
|
+ $(MAKEDOC_CPP) $(top_srcdir)/init.h | perl $(srcdir)/makedoc.pl -s && \
|
|
$(MAKEDOC_CPP) $(top_srcdir)/functions.h | \
|
|
perl $(srcdir)/gen-map-doc $(srcdir)/manual.xml.tail $(top_srcdir)/OPS* \
|
|
) > manual.xml
|
|
diff --git a/doc/devel-notes.txt b/doc/devel-notes.txt
|
|
index 99bc0fa0..bde077ab 100644
|
|
--- a/doc/devel-notes.txt
|
|
+++ b/doc/devel-notes.txt
|
|
@@ -225,7 +225,7 @@ these variables, and the global Muttrc, are generated automatically
|
|
from that documentation. To start this process, type "make
|
|
update-doc" in the top-level source directory.
|
|
|
|
-Note that you may have to update the makedoc utility (makedoc.c)
|
|
+Note that you may have to update the makedoc utility (makedoc.pl)
|
|
when adding new data types to init.h.
|
|
|
|
More precisely, variable name, type, and default value are directly
|
|
diff --git a/doc/makedoc.pl b/doc/makedoc.pl
|
|
new file mode 100644
|
|
index 00000000..e64d3c50
|
|
--- /dev/null
|
|
+++ b/doc/makedoc.pl
|
|
@@ -0,0 +1,952 @@
|
|
+#! /usr/bin/perl -w
|
|
+#
|
|
+# Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
|
|
+# Copyright (C) 2019 Kevin J. McCarthy <kevin@8t8.us>
|
|
+#
|
|
+# This program is free software; you can redistribute it and/or modify
|
|
+# it under the terms of the GNU General Public License as published by
|
|
+# the Free Software Foundation; either version 2 of the License, or
|
|
+# (at your option) any later version.
|
|
+#
|
|
+# This program is distributed in the hope that it will be useful,
|
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+# GNU General Public License for more details.
|
|
+#
|
|
+# You should have received a copy of the GNU General Public License
|
|
+# along with this program; if not, write to the Free Software
|
|
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
+
|
|
+# This program was translated from the C version (makedoc.c).
|
|
+# So it looks like "c'ish perl" because it is, plus my perl is rusty ;-)
|
|
+
|
|
+
|
|
+# Documentation line parser notes:
|
|
+#
|
|
+# The format is very remotely inspired by nroff. Most important, it's
|
|
+# easy to parse and convert, and it was easy to generate from the SGML
|
|
+# source of mutt's original manual.
|
|
+#
|
|
+# - \fI switches to italics
|
|
+# - \fB switches to boldface
|
|
+# - \fC swtiches to a literal string
|
|
+# - \fP switches to normal display
|
|
+# - .dl on a line starts a definition list (name taken taken from HTML).
|
|
+# - .dt starts a term in a definition list.
|
|
+# - .dd starts a definition in a definition list.
|
|
+# - .de on a line finishes a definition list.
|
|
+# - .il on a line starts an itemized list
|
|
+# - .dd starts an item in an itemized list
|
|
+# - .ie on a line finishes an itemized list
|
|
+# - .ts on a line starts a "tscreen" environment (name taken from SGML).
|
|
+# - .te on a line finishes this environment.
|
|
+# - .pp on a line starts a paragraph.
|
|
+# - \$word will be converted to a reference to word, where appropriate.
|
|
+# Note that \$$word is possible as well.
|
|
+# - '. ' in the beginning of a line expands to two space characters.
|
|
+# This is used to protect indentations in tables.
|
|
+#
|
|
+
|
|
+use strict;
|
|
+use warnings;
|
|
+use Getopt::Std;
|
|
+
|
|
+# Output formats
|
|
+my $F_CONF = 1;
|
|
+my $F_MAN = 2;
|
|
+my $F_SGML = 3;
|
|
+
|
|
+my $OutputFormat;
|
|
+
|
|
+# docstatus flags, used by print_it()
|
|
+my $D_INIT = (1 << 0); # init
|
|
+my $D_NL = (1 << 1); # (usually) on a new line
|
|
+my $D_NP = (1 << 2); # new paragraph ".pp"
|
|
+my $D_PA = (1 << 3); # inside paragraph ".pp"
|
|
+
|
|
+my $D_EM = (1 << 4); # emphasis "\fI" .. "\fP"
|
|
+my $D_BF = (1 << 5); # boldface "\fB" .. "\fP"
|
|
+my $D_TT = (1 << 6); # literal string "\fC" .. "\fP"
|
|
+
|
|
+my $D_TAB = (1 << 7); # "tscreen" screen shot ".ts" .. ".te"
|
|
+my $D_DL = (1 << 8); # start defn list ".dl" .. ".de"
|
|
+my $D_DT = (1 << 9); # dlist term ".dt"
|
|
+my $D_DD = (1 << 10); # dlist defn ".dd"
|
|
+my $D_IL = (1 << 11); # itemized list ".il" .. ".ie"
|
|
+
|
|
+# Commands sent to print_it() in response to various input strings
|
|
+my $SP_START_EM = 1;
|
|
+my $SP_START_BF = 2;
|
|
+my $SP_START_TT = 3;
|
|
+my $SP_END_FT = 4;
|
|
+my $SP_NEWLINE = 5;
|
|
+my $SP_NEWPAR = 6;
|
|
+my $SP_END_PAR = 7;
|
|
+my $SP_STR = 8;
|
|
+my $SP_START_TAB = 9;
|
|
+my $SP_END_TAB = 10;
|
|
+my $SP_START_DL = 11;
|
|
+my $SP_DT = 12;
|
|
+my $SP_DD = 13;
|
|
+my $SP_END_DD = 14;
|
|
+my $SP_END_DL = 15;
|
|
+my $SP_START_IL = 16;
|
|
+my $SP_END_IL = 17;
|
|
+my $SP_END_SECT = 18;
|
|
+my $SP_REFER = 19;
|
|
+
|
|
+# Types to documentation readable strings:
|
|
+my %type2human = ("DT_NONE" => "-none-",
|
|
+ "DT_BOOL" => "boolean",
|
|
+ "DT_NUM" => "number",
|
|
+ "DT_LNUM" => "number (long)",
|
|
+ "DT_STR" => "string",
|
|
+ "DT_PATH" => "path",
|
|
+ "DT_QUAD" => "quadoption",
|
|
+ "DT_SORT" => "sort order",
|
|
+ "DT_RX" => "regular expression",
|
|
+ "DT_MAGIC" => "folder magic",
|
|
+ "DT_ADDR" => "e-mail address",
|
|
+ "DT_MBCHARTBL"=> "string");
|
|
+
|
|
+my %string_types = ("DT_STR" => 1,
|
|
+ "DT_RX" => 1,
|
|
+ "DT_ADDR" => 1,
|
|
+ "DT_PATH" => 1,
|
|
+ "DT_MBCHARTBL" => 1);
|
|
+
|
|
+my %quad2human = ("MUTT_YES" => "yes",
|
|
+ "MUTT_NO" => "no",
|
|
+ "MUTT_ASKYES" => "ask-yes",
|
|
+ "MUTT_ASKNO" => "ask-no");
|
|
+
|
|
+my %bool2human = ("1" => "yes",
|
|
+ "0" => "no");
|
|
+
|
|
+
|
|
+# prototypes
|
|
+# to update:
|
|
+# M-1 M-! grep '^sub' makedoc.pl
|
|
+sub makedoc();
|
|
+sub flush_doc($);
|
|
+sub handle_confline($);
|
|
+sub pretty_default($$);
|
|
+sub string_unescape($);
|
|
+sub string_escape($);
|
|
+sub print_confline($$$);
|
|
+sub print_confline_conf($$$);
|
|
+sub print_conf_strval($);
|
|
+sub print_confline_man($$$);
|
|
+sub man_string_escape($);
|
|
+sub print_man_strval($);
|
|
+sub print_confline_sgml($$$);
|
|
+sub print_sgml_id($);
|
|
+sub print_sgml($);
|
|
+sub print_sgml_strval($);
|
|
+sub handle_docline($$);
|
|
+sub commit_buff($$);
|
|
+sub print_docline($$$);
|
|
+sub print_ref($$);
|
|
+sub print_docline_conf($$$$);
|
|
+sub print_docline_man($$$$);
|
|
+sub print_docline_sgml($$$$);
|
|
+
|
|
+
|
|
+our($opt_c, $opt_m, $opt_s);
|
|
+getopts('cms');
|
|
+if ($opt_c) {
|
|
+ $OutputFormat = $F_CONF;
|
|
+}
|
|
+elsif ($opt_m) {
|
|
+ $OutputFormat = $F_MAN;
|
|
+}
|
|
+elsif ($opt_s) {
|
|
+ $OutputFormat = $F_SGML;
|
|
+}
|
|
+else {
|
|
+ die "$0: no output format specified"
|
|
+}
|
|
+
|
|
+makedoc();
|
|
+
|
|
+
|
|
+sub makedoc() {
|
|
+ my $line;
|
|
+ my $lineno = 0;
|
|
+ my $active = 0;
|
|
+ my $docstat = $D_INIT;
|
|
+
|
|
+ while ($line = <STDIN>) {
|
|
+ chomp($line);
|
|
+ $line =~ s/^\s+//;
|
|
+ if ($line eq '/*++*/') {
|
|
+ $active = 1;
|
|
+ }
|
|
+ elsif ($line eq '/*--*/') {
|
|
+ $docstat = flush_doc($docstat);
|
|
+ $active = 0;
|
|
+ }
|
|
+ elsif ($active) {
|
|
+ if (($line =~ /^\/\*\*/) || ($line =~ /^\*\*/)) {
|
|
+ $line =~ s/^[\/*]+\s*//;
|
|
+ $docstat = handle_docline($line, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^{/) {
|
|
+ $line =~ s/^{\s*//;
|
|
+ $docstat = flush_doc($docstat);
|
|
+ handle_confline($line);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ flush_doc($docstat);
|
|
+ print("\n");
|
|
+}
|
|
+
|
|
+sub flush_doc($) {
|
|
+ my ($docstat) = @_;
|
|
+
|
|
+ if ($docstat & $D_INIT) {
|
|
+ return $D_INIT;
|
|
+ }
|
|
+
|
|
+ if ($docstat & ($D_PA)) {
|
|
+ $docstat = print_docline($SP_END_PAR, undef, $docstat);
|
|
+ }
|
|
+
|
|
+ if ($docstat & ($D_TAB)) {
|
|
+ $docstat = print_docline($SP_END_TAB, undef, $docstat);
|
|
+ }
|
|
+
|
|
+ if ($docstat & ($D_DL)) {
|
|
+ $docstat = print_docline($SP_END_DL, undef, $docstat);
|
|
+ }
|
|
+
|
|
+ if ($docstat & ($D_EM | $D_BF | $D_TT)) {
|
|
+ $docstat = print_docline($SP_END_FT, undef, $docstat);
|
|
+ }
|
|
+
|
|
+ $docstat = print_docline($SP_END_SECT, undef, $docstat);
|
|
+
|
|
+ $docstat = print_docline($SP_NEWLINE, undef, 0);
|
|
+
|
|
+ return $D_INIT;
|
|
+}
|
|
+
|
|
+####################
|
|
+# Confline handling
|
|
+####################
|
|
+
|
|
+sub handle_confline($) {
|
|
+ my ($line) = @_;
|
|
+
|
|
+ my ($name, $type, $flags, $data, $val) = split(/\s*,\s*/, $line, 5);
|
|
+ $name =~ s/"//g;
|
|
+
|
|
+ $type =~ s/\|.*//;
|
|
+
|
|
+ $val =~ s/^{\s*\.[lp]\s*=\s*"?//;
|
|
+ $val =~ s/"?\s*}\s*},\s*$//;
|
|
+ # This is a hack to concatenate compile-time constants.
|
|
+ # (?<!..) is a zero-width negative lookbehind assertion, asserting
|
|
+ # the first quote isn't preceded by a backslash
|
|
+ $val =~ s/(?<!\\)"\s+"//g;
|
|
+ $val = pretty_default($type, $val);
|
|
+
|
|
+ print_confline($name, $type, $val);
|
|
+}
|
|
+
|
|
+sub pretty_default($$) {
|
|
+ my ($type, $val) = @_;
|
|
+
|
|
+ if ($type eq "DT_QUAD") {
|
|
+ $val = $quad2human{$val};
|
|
+ }
|
|
+ elsif ($type eq "DT_BOOL") {
|
|
+ $val = $bool2human{$val};
|
|
+ }
|
|
+ elsif ($type eq "DT_SORT") {
|
|
+ if ($val !~ /^SORT_/) {
|
|
+ die "Expected SORT_ prefix instead of $val\n";
|
|
+ }
|
|
+ $val =~ s/^SORT_//;
|
|
+ $val = lc $val;
|
|
+ }
|
|
+ elsif ($type eq "DT_MAGIC") {
|
|
+ if ($val !~ /^MUTT_/) {
|
|
+ die "Expected MUTT_ prefix instead of $val\n";
|
|
+ }
|
|
+ $val =~ s/^MUTT_//;
|
|
+ $val = lc $val;
|
|
+ }
|
|
+ elsif (exists $string_types{$type}) {
|
|
+ if ($val eq "0") {
|
|
+ $val = "";
|
|
+ }
|
|
+ else {
|
|
+ $val = string_unescape($val);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return $val;
|
|
+}
|
|
+
|
|
+sub string_unescape($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val =~ s/\\r/\r/g;
|
|
+ $val =~ s/\\n/\n/g;
|
|
+ $val =~ s/\\t/\t/g;
|
|
+ $val =~ s/\\a/\a/g;
|
|
+ $val =~ s/\\f/\f/g;
|
|
+ $val =~ s/\\(.)/$1/g;
|
|
+
|
|
+ return $val;
|
|
+}
|
|
+
|
|
+sub string_escape($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val =~ s/\r/\\r/g;
|
|
+ $val =~ s/\n/\\n/g;
|
|
+ $val =~ s/\t/\\t/g;
|
|
+ $val =~ s/\f/\\f/g;
|
|
+
|
|
+ $val =~ s/([^\x20-\x7e])/sprintf("\\%03o", unpack("%C", $1))/ge;
|
|
+
|
|
+ return $val;
|
|
+}
|
|
+
|
|
+sub print_confline($$$) {
|
|
+ my ($name, $type, $val) = @_;
|
|
+
|
|
+ if ($type eq "DT_SYN") {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if ($OutputFormat == $F_CONF) {
|
|
+ print_confline_conf($name, $type, $val);
|
|
+ }
|
|
+ elsif ($OutputFormat == $F_MAN) {
|
|
+ print_confline_man($name, $type, $val);
|
|
+ }
|
|
+ elsif ($OutputFormat == $F_SGML) {
|
|
+ print_confline_sgml($name, $type, $val);
|
|
+ }
|
|
+}
|
|
+
|
|
+# conf output format
|
|
+
|
|
+sub print_confline_conf($$$) {
|
|
+ my ($name, $type, $val) = @_;
|
|
+
|
|
+ if (exists $string_types{$type}) {
|
|
+ print "\n# set ${name}=\"";
|
|
+ print_conf_strval($val);
|
|
+ print "\"";
|
|
+ }
|
|
+ else {
|
|
+ print "\n# set ${name}=${val}";
|
|
+ }
|
|
+
|
|
+ print "\n#\n# Name: ${name}";
|
|
+ print "\n# Type: ${type2human{$type}}";
|
|
+ if (exists $string_types{$type}) {
|
|
+ print "\n# Default: \"";
|
|
+ print_conf_strval($val);
|
|
+ print "\"";
|
|
+ }
|
|
+ else {
|
|
+ print "\n# Default: ${val}";
|
|
+ }
|
|
+
|
|
+ print "\n# ";
|
|
+}
|
|
+
|
|
+sub print_conf_strval($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val =~ s/(["\\])/\\$1/g;
|
|
+ $val = string_escape($val);
|
|
+ print $val;
|
|
+}
|
|
+
|
|
+# man output format
|
|
+
|
|
+sub print_confline_man($$$) {
|
|
+ my ($name, $type, $val) = @_;
|
|
+
|
|
+ print "\n.TP\n.B ${name}\n";
|
|
+ print ".nf\n";
|
|
+ print "Type: ${type2human{$type}}\n";
|
|
+ if (exists $string_types{$type}) {
|
|
+ print "Default: \\(lq";
|
|
+ print_man_strval($val);
|
|
+ print "\\(rq\n";
|
|
+ }
|
|
+ else {
|
|
+ print "Default: ";
|
|
+ print_man_strval($val);
|
|
+ print "\n";
|
|
+ }
|
|
+
|
|
+ print ".fi";
|
|
+}
|
|
+
|
|
+sub man_string_escape($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val =~ s/\r/\\\\r/g;
|
|
+ $val =~ s/\n/\\\\n/g;
|
|
+ $val =~ s/\t/\\\\t/g;
|
|
+ $val =~ s/\f/\\\\f/g;
|
|
+
|
|
+ $val =~ s/([^\x20-\x7e])/sprintf("\\\\%03o", unpack("%C", $1))/ge;
|
|
+
|
|
+ return $val;
|
|
+}
|
|
+
|
|
+sub print_man_strval($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val =~ s/"/\\(rq/g;
|
|
+ $val =~ s/([\\\-])/\\$1/g;
|
|
+ $val = man_string_escape($val);
|
|
+ print $val;
|
|
+}
|
|
+
|
|
+# sgml output format
|
|
+
|
|
+sub print_confline_sgml($$$) {
|
|
+ my ($name, $type, $val) = @_;
|
|
+
|
|
+ print "\n<sect2 id=\"";
|
|
+ print_sgml_id($name);
|
|
+ print "\">\n<title>";
|
|
+ print_sgml($name);
|
|
+ print "</title>\n<literallayout>Type: ${type2human{$type}}";
|
|
+
|
|
+ if (exists $string_types{$type}) {
|
|
+ if ($val ne "") {
|
|
+ print "\nDefault: <quote><literal>";
|
|
+ print_sgml_strval($val);
|
|
+ print "</literal></quote>";
|
|
+ }
|
|
+ else {
|
|
+ print "\nDefault: (empty)";
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ print "\nDefault: ${val}"
|
|
+ }
|
|
+
|
|
+ print "</literallayout>\n";
|
|
+}
|
|
+
|
|
+sub print_sgml_id($) {
|
|
+ my ($id) = @_;
|
|
+
|
|
+ $id =~ s/^<//;
|
|
+ $id =~ s/>$//;
|
|
+ $id =~ s/_/-/g;
|
|
+
|
|
+ print $id;
|
|
+}
|
|
+
|
|
+sub print_sgml($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val =~ s/&/&/g;
|
|
+ $val =~ s/</</g;
|
|
+ $val =~ s/>/>/g;
|
|
+
|
|
+ print $val;
|
|
+}
|
|
+
|
|
+sub print_sgml_strval($) {
|
|
+ my ($val) = @_;
|
|
+
|
|
+ $val = string_escape($val);
|
|
+ print_sgml($val);
|
|
+}
|
|
+
|
|
+
|
|
+###################
|
|
+# Docline handling
|
|
+###################
|
|
+
|
|
+sub handle_docline($$) {
|
|
+ my ($line, $docstat) = @_;
|
|
+ my $buff = "";
|
|
+
|
|
+ if ($line =~ /^\.pp/) {
|
|
+ return print_docline($SP_NEWPAR, undef, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^\.ts/) {
|
|
+ return print_docline($SP_START_TAB, undef, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^\.te/) {
|
|
+ return print_docline($SP_END_TAB, undef, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^\.dl/) {
|
|
+ return print_docline($SP_START_DL, undef, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^\.de/) {
|
|
+ return print_docline($SP_END_DL, undef, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^\.il/) {
|
|
+ return print_docline($SP_START_IL, undef, $docstat);
|
|
+ }
|
|
+ elsif ($line =~ /^\.ie/) {
|
|
+ return print_docline($SP_END_IL, undef, $docstat);
|
|
+ }
|
|
+
|
|
+ $line =~ s/^\. / /;
|
|
+
|
|
+ while ($line ne "") {
|
|
+ if ($line =~ /^\\\(as/) {
|
|
+ $buff .= "*";
|
|
+ substr($line, 0, 4) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\\\(rs/) {
|
|
+ $buff .= "\\";
|
|
+ substr($line, 0, 4) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\\fI/) {
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_START_EM, undef, $docstat);
|
|
+ substr($line, 0, 3) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\\fB/) {
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_START_BF, undef, $docstat);
|
|
+ substr($line, 0, 3) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\\fC/) {
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_START_TT, undef, $docstat);
|
|
+ substr($line, 0, 3) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\\fP/) {
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_END_FT, undef, $docstat);
|
|
+ substr($line, 0, 3) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\.dt/) {
|
|
+ if ($docstat & $D_DD) {
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_END_DD, undef, $docstat);
|
|
+ }
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_DT, undef, $docstat);
|
|
+ substr($line, 0, 4) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\.dd/) {
|
|
+ if (($docstat & $D_IL) && ($docstat & $D_DD)) {
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_END_DD, undef, $docstat);
|
|
+ }
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ $docstat = print_docline($SP_DD, undef, $docstat);
|
|
+ substr($line, 0, 4) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^\$\$\$/) {
|
|
+ print "\$";
|
|
+ substr($line, 0, 3) = "";
|
|
+ }
|
|
+ elsif ($line =~ /^(\$(\$?)([\w\-_<>]*))/) {
|
|
+ my $whole_ref;
|
|
+ my $ref;
|
|
+ my $output_dollar = 0;
|
|
+
|
|
+ $whole_ref = $1;
|
|
+ if ($2) {
|
|
+ $output_dollar = 1;
|
|
+ }
|
|
+ $ref = $3;
|
|
+
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ print_ref($output_dollar, $ref);
|
|
+ substr($line, 0, length($whole_ref)) = "";
|
|
+ }
|
|
+ else {
|
|
+ $buff .= substr($line, 0, 1);
|
|
+ substr($line, 0, 1) = "";
|
|
+ }
|
|
+ }
|
|
+
|
|
+ $docstat = commit_buff(\$buff, $docstat);
|
|
+ return print_docline($SP_NEWLINE, undef, $docstat);
|
|
+}
|
|
+
|
|
+sub commit_buff($$) {
|
|
+ my ($ref_buf, $docstat) = @_;
|
|
+
|
|
+ if ($$ref_buf ne "") {
|
|
+ $docstat = print_docline($SP_STR, $$ref_buf, $docstat);
|
|
+ $$ref_buf = "";
|
|
+ }
|
|
+
|
|
+ return $docstat;
|
|
+}
|
|
+
|
|
+sub print_docline($$$) {
|
|
+ my ($special, $str, $docstat) = @_;
|
|
+ my $onl;
|
|
+
|
|
+ $onl = ($docstat & ($D_NL | $D_NP));
|
|
+ $docstat &= ~($D_NL | $D_NP | $D_INIT);
|
|
+
|
|
+ if ($OutputFormat == $F_CONF) {
|
|
+ return print_docline_conf($special, $str, $docstat, $onl);
|
|
+ }
|
|
+ elsif ($OutputFormat == $F_MAN) {
|
|
+ return print_docline_man($special, $str, $docstat, $onl);
|
|
+ }
|
|
+ elsif ($OutputFormat == $F_SGML) {
|
|
+ return print_docline_sgml($special, $str, $docstat, $onl);
|
|
+ }
|
|
+
|
|
+ return $docstat;
|
|
+}
|
|
+
|
|
+sub print_ref($$) {
|
|
+ my ($output_dollar, $ref) = @_;
|
|
+
|
|
+ if (($OutputFormat == $F_CONF) || ($OutputFormat == $F_MAN)) {
|
|
+ if ($output_dollar) {
|
|
+ print "\$";
|
|
+ }
|
|
+ print $ref;
|
|
+ }
|
|
+ elsif ($OutputFormat == $F_SGML) {
|
|
+ print "<link linkend=\"";
|
|
+ print_sgml_id($ref);
|
|
+ print "\">";
|
|
+ if ($output_dollar) {
|
|
+ print "\$";
|
|
+ }
|
|
+ print_sgml($ref);
|
|
+ print "</link>";
|
|
+ }
|
|
+}
|
|
+
|
|
+my $Continuation = 0;
|
|
+
|
|
+sub print_docline_conf($$$$) {
|
|
+ my ($special, $str, $docstat, $onl) = @_;
|
|
+
|
|
+ if ($special == $SP_END_FT) {
|
|
+ $docstat &= ~($D_EM|$D_BF|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_BF) {
|
|
+ $docstat |= $D_BF;
|
|
+ }
|
|
+ elsif ($special == $SP_START_EM) {
|
|
+ $docstat |= $D_EM;
|
|
+ }
|
|
+ elsif ($special == $SP_START_TT) {
|
|
+ $docstat |= $D_TT;
|
|
+ }
|
|
+ elsif ($special == $SP_NEWLINE) {
|
|
+ if ($onl) {
|
|
+ $docstat |= $onl;
|
|
+ }
|
|
+ else {
|
|
+ print "\n# ";
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ if ($docstat & $D_DL) {
|
|
+ $Continuation++;
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_NEWPAR) {
|
|
+ if ($onl & $D_NP) {
|
|
+ $docstat |= $onl;
|
|
+ }
|
|
+ else {
|
|
+ if (!($onl & $D_NL)) {
|
|
+ print "\n# ";
|
|
+ }
|
|
+ print "\n# ";
|
|
+ $docstat |= $D_NP;
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_START_TAB) {
|
|
+ if (!$onl) {
|
|
+ print "\n# ";
|
|
+ }
|
|
+ $docstat |= $D_TAB;
|
|
+ }
|
|
+ elsif ($special == $SP_END_TAB) {
|
|
+ $docstat &= ~$D_TAB;
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ elsif ($special == $SP_START_DL) {
|
|
+ $docstat |= $D_DL;
|
|
+ }
|
|
+ elsif ($special == $SP_DT) {
|
|
+ $Continuation = 0;
|
|
+ $docstat |= $D_DT;
|
|
+ }
|
|
+ elsif ($special == $SP_DD) {
|
|
+ if ($docstat & $D_IL) {
|
|
+ print "- ";
|
|
+ }
|
|
+ $Continuation = 0;
|
|
+ }
|
|
+ elsif ($special == $SP_END_DL) {
|
|
+ $Continuation = 0;
|
|
+ $docstat &= ~$D_DL;
|
|
+ }
|
|
+ elsif ($special == $SP_START_IL) {
|
|
+ $docstat |= $D_IL;
|
|
+ }
|
|
+ elsif ($special == $SP_END_IL) {
|
|
+ $Continuation = 0;
|
|
+ $docstat &= ~$D_IL;
|
|
+ }
|
|
+ elsif ($special == $SP_STR) {
|
|
+ if ($Continuation) {
|
|
+ $Continuation = 0;
|
|
+ print " ";
|
|
+ }
|
|
+ print $str;
|
|
+ if ($docstat & $D_DT) {
|
|
+ if (length($str) < 8) {
|
|
+ print " " x (8 - length($str));
|
|
+ }
|
|
+ $docstat &= ~$D_DT;
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return $docstat;
|
|
+}
|
|
+
|
|
+sub print_docline_man($$$$) {
|
|
+ my ($special, $str, $docstat, $onl) = @_;
|
|
+
|
|
+ if ($special == $SP_END_FT) {
|
|
+ print "\\fP";
|
|
+ $docstat &= ~($D_EM|$D_BF|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_BF) {
|
|
+ print "\\fB";
|
|
+ $docstat |= $D_BF;
|
|
+ $docstat &= ~($D_EM|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_EM) {
|
|
+ print "\\fI";
|
|
+ $docstat |= $D_EM;
|
|
+ $docstat &= ~($D_BF|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_TT) {
|
|
+ print "\\fC";
|
|
+ $docstat |= $D_TT;
|
|
+ $docstat &= ~($D_BF|$D_EM);
|
|
+ }
|
|
+ elsif ($special == $SP_NEWLINE) {
|
|
+ if ($onl) {
|
|
+ $docstat |= $onl;
|
|
+ }
|
|
+ else {
|
|
+ print "\n";
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_NEWPAR) {
|
|
+ if ($onl & $D_NP) {
|
|
+ $docstat |= $onl;
|
|
+ }
|
|
+ else {
|
|
+ if (!($onl & $D_NL)) {
|
|
+ print "\n";
|
|
+ }
|
|
+ print ".IP\n";
|
|
+ $docstat |= $D_NP;
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_START_TAB) {
|
|
+ print "\n.IP\n.EX\n";
|
|
+ $docstat |= $D_TAB | $D_NL;
|
|
+ }
|
|
+ elsif ($special == $SP_END_TAB) {
|
|
+ print "\n.EE\n";
|
|
+ $docstat &= ~$D_TAB;
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ elsif ($special == $SP_START_DL) {
|
|
+ print ".RS\n.PD 0\n";
|
|
+ $docstat |= $D_DL;
|
|
+ }
|
|
+ elsif ($special == $SP_DT) {
|
|
+ print ".TP\n";
|
|
+ }
|
|
+ elsif ($special == $SP_DD) {
|
|
+ if ($docstat & $D_IL) {
|
|
+ print ".TP\n\\(hy ";
|
|
+ }
|
|
+ else {
|
|
+ print "\n";
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_END_DL) {
|
|
+ print ".RE\n.PD 1";
|
|
+ $docstat &= ~$D_DL;
|
|
+ }
|
|
+ elsif ($special == $SP_START_IL) {
|
|
+ print ".RS\n.PD 0\n";
|
|
+ $docstat |= $D_IL;
|
|
+ }
|
|
+ elsif ($special == $SP_END_IL) {
|
|
+ print ".RE\n.PD 1";
|
|
+ $docstat &= ~$D_DL;
|
|
+ }
|
|
+ elsif ($special == $SP_STR) {
|
|
+ $str =~ s/\\/\\\\/g;
|
|
+ $str =~ s/"/\\(rq/g;
|
|
+ $str =~ s/-/\\-/g;
|
|
+ $str =~ s/``/\\(lq/g;
|
|
+ $str =~ s/''/\\(rq/g;
|
|
+ print $str;
|
|
+ }
|
|
+
|
|
+ return $docstat;
|
|
+}
|
|
+
|
|
+sub print_docline_sgml($$$$) {
|
|
+ my ($special, $str, $docstat, $onl) = @_;
|
|
+
|
|
+ if ($special == $SP_END_FT) {
|
|
+ if ($docstat & $D_EM) {
|
|
+ print "</emphasis>";
|
|
+ }
|
|
+ if ($docstat & $D_BF) {
|
|
+ print "</emphasis>";
|
|
+ }
|
|
+ if ($docstat & $D_TT) {
|
|
+ print "</literal>";
|
|
+ }
|
|
+ $docstat &= ~($D_EM|$D_BF|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_BF) {
|
|
+ print "<emphasis role=\"bold\">";
|
|
+ $docstat |= $D_BF;
|
|
+ $docstat &= ~($D_EM|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_EM) {
|
|
+ print "<emphasis>";
|
|
+ $docstat |= $D_EM;
|
|
+ $docstat &= ~($D_BF|$D_TT);
|
|
+ }
|
|
+ elsif ($special == $SP_START_TT) {
|
|
+ print "<literal>";
|
|
+ $docstat |= $D_TT;
|
|
+ $docstat &= ~($D_BF|$D_EM);
|
|
+ }
|
|
+ elsif ($special == $SP_NEWLINE) {
|
|
+ if ($onl) {
|
|
+ $docstat |= $onl;
|
|
+ }
|
|
+ else {
|
|
+ print "\n";
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_NEWPAR) {
|
|
+ if ($onl & $D_NP) {
|
|
+ $docstat |= $onl;
|
|
+ }
|
|
+ else {
|
|
+ if (!($onl & $D_NL)) {
|
|
+ print "\n";
|
|
+ }
|
|
+ if ($docstat & $D_PA) {
|
|
+ print "</para>\n";
|
|
+ }
|
|
+ print "<para>\n";
|
|
+ $docstat |= $D_NP;
|
|
+ $docstat |= $D_PA;
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_END_PAR) {
|
|
+ print "</para>\n";
|
|
+ $docstat &= ~$D_PA;
|
|
+ }
|
|
+ elsif ($special == $SP_START_TAB) {
|
|
+ if ($docstat & $D_PA) {
|
|
+ print "\n</para>\n";
|
|
+ $docstat &= ~$D_PA;
|
|
+ }
|
|
+ print "\n<screen>\n";
|
|
+ $docstat |= $D_TAB | $D_NL;
|
|
+ }
|
|
+ elsif ($special == $SP_END_TAB) {
|
|
+ print "</screen>";
|
|
+ $docstat &= ~$D_TAB;
|
|
+ $docstat |= $D_NL;
|
|
+ }
|
|
+ elsif ($special == $SP_START_DL) {
|
|
+ if ($docstat & $D_PA) {
|
|
+ print "\n</para>\n";
|
|
+ $docstat &= ~$D_PA;
|
|
+ }
|
|
+ print "\n<informaltable>\n<tgroup cols=\"2\">\n<tbody>\n";
|
|
+ $docstat |= $D_DL;
|
|
+ }
|
|
+ elsif ($special == $SP_DT) {
|
|
+ print "<row><entry>";
|
|
+ }
|
|
+ elsif ($special == $SP_DD) {
|
|
+ $docstat |= $D_DD;
|
|
+ if ($docstat & $D_DL) {
|
|
+ print "</entry><entry>";
|
|
+ }
|
|
+ else {
|
|
+ print "<listitem><para>";
|
|
+ }
|
|
+ }
|
|
+ elsif ($special == $SP_END_DD) {
|
|
+ if ($docstat & $D_DL) {
|
|
+ print "</entry></row>\n";
|
|
+ }
|
|
+ else {
|
|
+ print "</para></listitem>";
|
|
+ }
|
|
+ $docstat &= ~$D_DD;
|
|
+ }
|
|
+ elsif ($special == $SP_END_DL) {
|
|
+ print "</entry></row></tbody></tgroup></informaltable>\n";
|
|
+ $docstat &= ~($D_DD|$D_DL);
|
|
+ }
|
|
+ elsif ($special == $SP_START_IL) {
|
|
+ if ($docstat & $D_PA) {
|
|
+ print "\n</para>\n";
|
|
+ $docstat &= ~$D_PA;
|
|
+ }
|
|
+ print "\n<itemizedlist>\n";
|
|
+ $docstat |= $D_IL;
|
|
+ }
|
|
+ elsif ($special == $SP_END_IL) {
|
|
+ print "</para></listitem></itemizedlist>\n";
|
|
+ $docstat &= ~($D_DD|$D_DL);
|
|
+ }
|
|
+ elsif ($special == $SP_END_SECT) {
|
|
+ print "</sect2>";
|
|
+ }
|
|
+ elsif ($special == $SP_STR) {
|
|
+ if ($docstat & $D_TAB) {
|
|
+ print_sgml($str);
|
|
+ }
|
|
+ else {
|
|
+ $str =~ s/&/&/g;
|
|
+ $str =~ s/</</g;
|
|
+ $str =~ s/>/>/g;
|
|
+ $str =~ s/``/<quote>/g;
|
|
+ $str =~ s/''/<\/quote>/g;
|
|
+ print $str;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return $docstat;
|
|
+}
|
|
diff --git a/init.h b/init.h
|
|
index a237cb80..b797dd1c 100644
|
|
--- a/init.h
|
|
+++ b/init.h
|
|
@@ -27,7 +27,7 @@
|
|
#include "buffy.h"
|
|
|
|
#ifndef _MAKEDOC
|
|
-/* If you add a data type, be sure to update doc/makedoc.c */
|
|
+/* If you add a data type, be sure to update doc/makedoc.pl */
|
|
#define DT_MASK 0x0f
|
|
#define DT_BOOL 1 /* boolean option */
|
|
#define DT_NUM 2 /* a number (short) */
|
|
diff --git a/sort.h b/sort.h
|
|
index 0a6450e9..340ad18b 100644
|
|
--- a/sort.h
|
|
+++ b/sort.h
|
|
@@ -19,7 +19,7 @@
|
|
#define SORT_DATE 1 /* the date the mail was sent. */
|
|
#define SORT_SIZE 2
|
|
#define SORT_SUBJECT 3
|
|
-#define SORT_ALPHA 3 /* makedoc.c requires this */
|
|
+#define SORT_ALPHA 3 /* makedoc.pl requires this */
|
|
#define SORT_FROM 4
|
|
#define SORT_ORDER 5 /* the order the messages appear in the mailbox. */
|
|
#define SORT_THREADS 6
|
|
--
|
|
2.24.1
|
|
|