commit:     a71e1e4a0907b3172edb767c0eac01fe508e5ef1
Author:     Matthew Thode <prometheanfire <AT> gentoo <DOT> org>
AuthorDate: Tue Dec 24 15:44:15 2024 +0000
Commit:     Matthew Thode <prometheanfire <AT> gentoo <DOT> org>
CommitDate: Tue Dec 24 15:44:15 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=a71e1e4a

app-arch/p7zip: localization patch backport

Closes: https://bugs.gentoo.org/946122

Signed-off-by: Matthew Thode <prometheanfire <AT> gentoo.org>

 .../p7zip/files/p7zip-17.05-localization.patch     | 234 +++++++++++++++++++++
 app-arch/p7zip/p7zip-17.05-r2.ebuild               | 114 ++++++++++
 2 files changed, 348 insertions(+)

diff --git a/app-arch/p7zip/files/p7zip-17.05-localization.patch 
b/app-arch/p7zip/files/p7zip-17.05-localization.patch
new file mode 100644
index 000000000000..971a0d4eb8bb
--- /dev/null
+++ b/app-arch/p7zip/files/p7zip-17.05-localization.patch
@@ -0,0 +1,234 @@
+From afec5e119df1f0706df619b6151b709945de4f43 Mon Sep 17 00:00:00 2001
+From: Ivan Sorokin <[email protected]>
+Date: Wed, 22 May 2024 09:38:23 +0200
+Subject: [PATCH] apply #232 to p7zip17 also
+
+---
+ CPP/7zip/Archive/Zip/ZipItem.cpp | 205 +++++++++++++++++++++----------
+ 1 file changed, 137 insertions(+), 68 deletions(-)
+
+diff --git a/CPP/7zip/Archive/Zip/ZipItem.cpp 
b/CPP/7zip/Archive/Zip/ZipItem.cpp
+index 353e89559..d3133c59d 100644
+--- a/CPP/7zip/Archive/Zip/ZipItem.cpp
++++ b/CPP/7zip/Archive/Zip/ZipItem.cpp
+@@ -356,83 +356,152 @@ void CItem::GetUnicodeString(UString &res, const 
AString &s, bool isComment, boo
+   }
+   
+   #if (!defined _WIN32) && (!defined __CYGWIN__) && (!defined __APPLE__)
++
+   // Convert OEM char set to UTF-8 if needed
+   // Use system locale to select code page
+ 
+-  Byte hostOS = GetHostOS();
+-  if (!isUtf8 && ((hostOS == NFileHeader::NHostOS::kFAT) || (hostOS == 
NFileHeader::NHostOS::kNTFS))) {
+-
+-    const char *oemcp;
+-    oemcp = getenv("OEMCP");
+-    if (!oemcp) {
+-      oemcp = "CP437\0"; // CP name is 6 chars max
+-
+-      const char *lc_to_cp_table[] = {
+-      "af_ZA", "CP850", "ar_SA", "CP720", "ar_LB", "CP720", "ar_EG", "CP720",
+-      "ar_DZ", "CP720", "ar_BH", "CP720", "ar_IQ", "CP720", "ar_JO", "CP720",
+-      "ar_KW", "CP720", "ar_LY", "CP720", "ar_MA", "CP720", "ar_OM", "CP720",
+-      "ar_QA", "CP720", "ar_SY", "CP720", "ar_TN", "CP720", "ar_AE", "CP720",
+-      "ar_YE", "CP720","ast_ES", "CP850", "az_AZ", "CP866", "az_AZ", "CP857",
+-      "be_BY", "CP866", "bg_BG", "CP866", "br_FR", "CP850", "ca_ES", "CP850",
+-      "zh_CN", "CP936", "zh_TW", "CP950", "kw_GB", "CP850", "cs_CZ", "CP852",
+-      "cy_GB", "CP850", "da_DK", "CP850", "de_AT", "CP850", "de_LI", "CP850",
+-      "de_LU", "CP850", "de_CH", "CP850", "de_DE", "CP850", "el_GR", "CP737",
+-      "en_AU", "CP850", "en_CA", "CP850", "en_GB", "CP850", "en_IE", "CP850",
+-      "en_JM", "CP850", "en_BZ", "CP850", "en_PH", "CP437", "en_ZA", "CP437",
+-      "en_TT", "CP850", "en_US", "CP437", "en_ZW", "CP437", "en_NZ", "CP850",
+-      "es_PA", "CP850", "es_BO", "CP850", "es_CR", "CP850", "es_DO", "CP850",
+-      "es_SV", "CP850", "es_EC", "CP850", "es_GT", "CP850", "es_HN", "CP850",
+-      "es_NI", "CP850", "es_CL", "CP850", "es_MX", "CP850", "es_ES", "CP850",
+-      "es_CO", "CP850", "es_ES", "CP850", "es_PE", "CP850", "es_AR", "CP850",
+-      "es_PR", "CP850", "es_VE", "CP850", "es_UY", "CP850", "es_PY", "CP850",
+-      "et_EE", "CP775", "eu_ES", "CP850", "fa_IR", "CP720", "fi_FI", "CP850",
+-      "fo_FO", "CP850", "fr_FR", "CP850", "fr_BE", "CP850", "fr_CA", "CP850",
+-      "fr_LU", "CP850", "fr_MC", "CP850", "fr_CH", "CP850", "ga_IE", "CP437",
+-      "gd_GB", "CP850", "gv_IM", "CP850", "gl_ES", "CP850", "he_IL", "CP862",
+-      "hr_HR", "CP852", "hu_HU", "CP852", "id_ID", "CP850", "is_IS", "CP850",
+-      "it_IT", "CP850", "it_CH", "CP850", "iv_IV", "CP437", "ja_JP", "CP932",
+-      "kk_KZ", "CP866", "ko_KR", "CP949", "ky_KG", "CP866", "lt_LT", "CP775",
+-      "lv_LV", "CP775", "mk_MK", "CP866", "mn_MN", "CP866", "ms_BN", "CP850",
+-      "ms_MY", "CP850", "nl_BE", "CP850", "nl_NL", "CP850", "nl_SR", "CP850",
+-      "nn_NO", "CP850", "nb_NO", "CP850", "pl_PL", "CP852", "pt_BR", "CP850",
+-      "pt_PT", "CP850", "rm_CH", "CP850", "ro_RO", "CP852", "ru_RU", "CP866",
+-      "sk_SK", "CP852", "sl_SI", "CP852", "sq_AL", "CP852", "sr_RS", "CP855",
+-      "sr_RS", "CP852", "sv_SE", "CP850", "sv_FI", "CP850", "sw_KE", "CP437",
+-      "th_TH", "CP874", "tr_TR", "CP857", "tt_RU", "CP866", "uk_UA", "CP866",
+-      "ur_PK", "CP720", "uz_UZ", "CP866", "uz_UZ", "CP857", "vi_VN", "CP1258",
+-      "wa_BE", "CP850", "zh_HK", "CP950", "zh_SG", "CP936"};
+-      int table_len = sizeof(lc_to_cp_table) / sizeof(char *);
+-      int lc_len, i;
+-
+-      char *lc = setlocale(LC_CTYPE, "");
+-
+-      if (lc && lc[0]) {
+-          // Compare up to the dot, if it exists, e.g. en_US.UTF-8
+-          for (lc_len = 0; lc[lc_len] != '.' && lc[lc_len] != '\0'; ++lc_len)
+-              ;
+-          for (i = 0; i < table_len; i += 2)
+-              if (strncmp(lc, lc_to_cp_table[i], lc_len) == 0)
+-                  oemcp = lc_to_cp_table[i + 1];
+-      }
++  // locale -> code page translation tables generated from Wine source code
++
++  const char *lcToOemTable[] = {
++    "af_ZA", "CP850", "ar_SA", "CP720", "ar_LB", "CP720", "ar_EG", "CP720",
++    "ar_DZ", "CP720", "ar_BH", "CP720", "ar_IQ", "CP720", "ar_JO", "CP720",
++    "ar_KW", "CP720", "ar_LY", "CP720", "ar_MA", "CP720", "ar_OM", "CP720",
++    "ar_QA", "CP720", "ar_SY", "CP720", "ar_TN", "CP720", "ar_AE", "CP720",
++    "ar_YE", "CP720", "ast_ES", "CP850", "az_AZ", "CP866", "az_AZ", "CP857",
++    "be_BY", "CP866", "bg_BG", "CP866", "br_FR", "CP850", "ca_ES", "CP850",
++    "zh_CN", "CP936", "zh_TW", "CP950", "kw_GB", "CP850", "cs_CZ", "CP852",
++    "cy_GB", "CP850", "da_DK", "CP850", "de_AT", "CP850", "de_LI", "CP850",
++    "de_LU", "CP850", "de_CH", "CP850", "de_DE", "CP850", "el_GR", "CP737",
++    "en_AU", "CP850", "en_CA", "CP850", "en_GB", "CP850", "en_IE", "CP850",
++    "en_JM", "CP850", "en_BZ", "CP850", "en_PH", "CP437", "en_ZA", "CP437",
++    "en_TT", "CP850", "en_US", "CP437", "en_ZW", "CP437", "en_NZ", "CP850",
++    "es_PA", "CP850", "es_BO", "CP850", "es_CR", "CP850", "es_DO", "CP850",
++    "es_SV", "CP850", "es_EC", "CP850", "es_GT", "CP850", "es_HN", "CP850",
++    "es_NI", "CP850", "es_CL", "CP850", "es_MX", "CP850", "es_ES", "CP850",
++    "es_CO", "CP850", "es_ES", "CP850", "es_PE", "CP850", "es_AR", "CP850",
++    "es_PR", "CP850", "es_VE", "CP850", "es_UY", "CP850", "es_PY", "CP850",
++    "et_EE", "CP775", "eu_ES", "CP850", "fa_IR", "CP720", "fi_FI", "CP850",
++    "fo_FO", "CP850", "fr_FR", "CP850", "fr_BE", "CP850", "fr_CA", "CP850",
++    "fr_LU", "CP850", "fr_MC", "CP850", "fr_CH", "CP850", "ga_IE", "CP437",
++    "gd_GB", "CP850", "gv_IM", "CP850", "gl_ES", "CP850", "he_IL", "CP862",
++    "hr_HR", "CP852", "hu_HU", "CP852", "id_ID", "CP850", "is_IS", "CP850",
++    "it_IT", "CP850", "it_CH", "CP850", "iv_IV", "CP437", "ja_JP", "CP932",
++    "kk_KZ", "CP866", "ko_KR", "CP949", "ky_KG", "CP866", "lt_LT", "CP775",
++    "lv_LV", "CP775", "mk_MK", "CP866", "mn_MN", "CP866", "ms_BN", "CP850",
++    "ms_MY", "CP850", "nl_BE", "CP850", "nl_NL", "CP850", "nl_SR", "CP850",
++    "nn_NO", "CP850", "nb_NO", "CP850", "pl_PL", "CP852", "pt_BR", "CP850",
++    "pt_PT", "CP850", "rm_CH", "CP850", "ro_RO", "CP852", "ru_RU", "CP866",
++    "sk_SK", "CP852", "sl_SI", "CP852", "sq_AL", "CP852", "sr_RS", "CP855",
++    "sr_RS", "CP852", "sv_SE", "CP850", "sv_FI", "CP850", "sw_KE", "CP437",
++    "th_TH", "CP874", "tr_TR", "CP857", "tt_RU", "CP866", "uk_UA", "CP866",
++    "ur_PK", "CP720", "uz_UZ", "CP866", "uz_UZ", "CP857", "vi_VN", "CP1258",
++    "wa_BE", "CP850", "zh_HK", "CP950", "zh_SG", "CP936"};
++
++  const char *lcToAnsiTable[] = {
++    "af_ZA", "CP1252", "ar_SA", "CP1256", "ar_LB", "CP1256", "ar_EG", 
"CP1256",
++    "ar_DZ", "CP1256", "ar_BH", "CP1256", "ar_IQ", "CP1256", "ar_JO", 
"CP1256",
++    "ar_KW", "CP1256", "ar_LY", "CP1256", "ar_MA", "CP1256", "ar_OM", 
"CP1256",
++    "ar_QA", "CP1256", "ar_SY", "CP1256", "ar_TN", "CP1256", "ar_AE", 
"CP1256",
++    "ar_YE", "CP1256","ast_ES", "CP1252", "az_AZ", "CP1251", "az_AZ", 
"CP1254",
++    "be_BY", "CP1251", "bg_BG", "CP1251", "br_FR", "CP1252", "ca_ES", 
"CP1252",
++    "zh_CN", "CP936",  "zh_TW", "CP950",  "kw_GB", "CP1252", "cs_CZ", 
"CP1250",
++    "cy_GB", "CP1252", "da_DK", "CP1252", "de_AT", "CP1252", "de_LI", 
"CP1252",
++    "de_LU", "CP1252", "de_CH", "CP1252", "de_DE", "CP1252", "el_GR", 
"CP1253",
++    "en_AU", "CP1252", "en_CA", "CP1252", "en_GB", "CP1252", "en_IE", 
"CP1252",
++    "en_JM", "CP1252", "en_BZ", "CP1252", "en_PH", "CP1252", "en_ZA", 
"CP1252",
++    "en_TT", "CP1252", "en_US", "CP1252", "en_ZW", "CP1252", "en_NZ", 
"CP1252",
++    "es_PA", "CP1252", "es_BO", "CP1252", "es_CR", "CP1252", "es_DO", 
"CP1252",
++    "es_SV", "CP1252", "es_EC", "CP1252", "es_GT", "CP1252", "es_HN", 
"CP1252",
++    "es_NI", "CP1252", "es_CL", "CP1252", "es_MX", "CP1252", "es_ES", 
"CP1252",
++    "es_CO", "CP1252", "es_ES", "CP1252", "es_PE", "CP1252", "es_AR", 
"CP1252",
++    "es_PR", "CP1252", "es_VE", "CP1252", "es_UY", "CP1252", "es_PY", 
"CP1252",
++    "et_EE", "CP1257", "eu_ES", "CP1252", "fa_IR", "CP1256", "fi_FI", 
"CP1252",
++    "fo_FO", "CP1252", "fr_FR", "CP1252", "fr_BE", "CP1252", "fr_CA", 
"CP1252",
++    "fr_LU", "CP1252", "fr_MC", "CP1252", "fr_CH", "CP1252", "ga_IE", 
"CP1252",
++    "gd_GB", "CP1252", "gv_IM", "CP1252", "gl_ES", "CP1252", "he_IL", 
"CP1255",
++    "hr_HR", "CP1250", "hu_HU", "CP1250", "id_ID", "CP1252", "is_IS", 
"CP1252",
++    "it_IT", "CP1252", "it_CH", "CP1252", "iv_IV", "CP1252", "ja_JP", "CP932",
++    "kk_KZ", "CP1251", "ko_KR", "CP949", "ky_KG", "CP1251", "lt_LT", "CP1257",
++    "lv_LV", "CP1257", "mk_MK", "CP1251", "mn_MN", "CP1251", "ms_BN", 
"CP1252",
++    "ms_MY", "CP1252", "nl_BE", "CP1252", "nl_NL", "CP1252", "nl_SR", 
"CP1252",
++    "nn_NO", "CP1252", "nb_NO", "CP1252", "pl_PL", "CP1250", "pt_BR", 
"CP1252",
++    "pt_PT", "CP1252", "rm_CH", "CP1252", "ro_RO", "CP1250", "ru_RU", 
"CP1251",
++    "sk_SK", "CP1250", "sl_SI", "CP1250", "sq_AL", "CP1250", "sr_RS", 
"CP1251",
++    "sr_RS", "CP1250", "sv_SE", "CP1252", "sv_FI", "CP1252", "sw_KE", 
"CP1252",
++    "th_TH", "CP874", "tr_TR", "CP1254", "tt_RU", "CP1251", "uk_UA", "CP1251",
++    "ur_PK", "CP1256", "uz_UZ", "CP1251", "uz_UZ", "CP1254", "vi_VN", 
"CP1258",
++    "wa_BE", "CP1252", "zh_HK", "CP950", "zh_SG", "CP936"};
++
++  bool isAnsi = false;
++  bool isOem = false;
++
++  if (!isUtf8 &&
++      MadeByVersion.HostOS == NFileHeader::NHostOS::kNTFS &&
++      MadeByVersion.Version >= 20) {
++    isAnsi = true;
++  } else if (!isUtf8 &&
++             (MadeByVersion.HostOS == NFileHeader::NHostOS::kNTFS ||
++              MadeByVersion.HostOS == NFileHeader::NHostOS::kFAT)) {
++    isOem = true;
++  }
++
++  if (isOem || isAnsi) {
++
++    const char *legacyCp = nullptr;
++    int tableLen = sizeof(isOem ? lcToOemTable : lcToAnsiTable) / sizeof(char 
*);
++    int lcLen = 0, i;
++
++    // Detect required code page name from current locale 
++    char *lc = setlocale(LC_CTYPE, "");
++
++    if (lc && lc[0]) {
++      // Compare up to the dot, if it exists, e.g. en_US.UTF-8
++      for (lcLen = 0; lc[lcLen] != '.' && lc[lcLen] != ':' && lc[lcLen] != 
'\0'; ++lcLen);
++
++      for (i = 0; i < tableLen; i += 2)
++        if (strncmp(lc, (isOem ? lcToOemTable[i] : lcToAnsiTable[i]), lcLen) 
== 0) {
++          legacyCp = isOem ? lcToOemTable[i + 1] : lcToAnsiTable[i + 1];
++          break; // Stop searching once a match is found
++        }
+     }
+ 
+-    iconv_t cd;
+-    if ((cd = iconv_open("UTF-8", oemcp)) != (iconv_t)-1) {
++    if (legacyCp) {
++      iconv_t cd;
++      if ((cd = iconv_open("UTF-8", legacyCp)) != (iconv_t)-1) {
+ 
+-      AString s_utf8;
+-      const char* src = s.Ptr();
+-      size_t slen = s.Len();
+-      size_t dlen = slen * 4;
+-      const char* dest = s_utf8.GetBuf_SetEnd(dlen + 1); // (source length * 
4) + null termination
++        AString sUtf8;
+ 
+-      size_t done = iconv(cd, (char**)&src, &slen, (char**)&dest, &dlen);
+-      bzero((size_t*)dest + done, 1);
++        size_t slen = s.Len();
++        char* src = const_cast<char*>(s.Ptr());
+ 
+-      iconv_close(cd);
++        size_t dlen = slen * 4 + 1; // (source length * 4) + null termination
++        char* dst = sUtf8.GetBuf_SetEnd(dlen);
++        const char* dstStart = dst;
+ 
+-      if (ConvertUTF8ToUnicode(s_utf8, res) || ignore_Utf8_Errors)
+-        return;
+-    }    
++        memset(dst, 0, dlen);
++
++        size_t done = iconv(cd, &src, &slen, &dst, &dlen);
++
++        if (done == (size_t)-1) {
++          iconv_close(cd);
++
++          // iconv failed. Falling back to default behavior
++          MultiByteToUnicodeString2(res, s, useSpecifiedCodePage ? codePage : 
GetCodePage());
++          return;
++        }
++
++        // Null-terminate the result
++        *dst = '\0';
++
++        iconv_close(cd);
++
++        AString sUtf8CorrectLength;
++        unsigned dstCorrectLength = dst - dstStart;
++        sUtf8CorrectLength.SetFrom(sUtf8, dstCorrectLength);
++        if (ConvertUTF8ToUnicode(sUtf8CorrectLength, res) /*|| 
ignore_Utf8_Errors*/)
++          return;
++      }
++    }
+   }
+   #endif
+   

diff --git a/app-arch/p7zip/p7zip-17.05-r2.ebuild 
b/app-arch/p7zip/p7zip-17.05-r2.ebuild
new file mode 100644
index 000000000000..c3cf8085fcf6
--- /dev/null
+++ b/app-arch/p7zip/p7zip-17.05-r2.ebuild
@@ -0,0 +1,114 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit multilib toolchain-funcs wrapper xdg
+
+DESCRIPTION="Port of 7-Zip archiver for Unix"
+HOMEPAGE="https://github.com/p7zip-project/p7zip";
+SRC_URI="https://github.com/p7zip-project/p7zip/archive/v${PV}.tar.gz -> 
${P}.tar.gz"
+
+LICENSE="LGPL-2.1 rar? ( unRAR )"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~ppc ~ppc64 ~riscv ~s390 
~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos"
+IUSE="abi_x86_x32 natspec +pch rar test"
+
+REQUIRED_USE="test? ( rar )" # bug 907221
+RESTRICT="!test? ( test )"
+
+RDEPEND="natspec? ( dev-libs/libnatspec )"
+DEPEND="${RDEPEND}"
+BDEPEND="
+       abi_x86_x32? ( >=dev-lang/yasm-1.2.0-r1 )
+       amd64? ( dev-lang/yasm )
+       x86? ( dev-lang/nasm )"
+
+PATCHES=( "${FILESDIR}/p7zip-17.05-unit64.patch" )
+
+src_prepare() {
+       default
+
+       if use natspec; then
+               eapply "${FILESDIR}"/${P}-natspec.patch
+               sed -i '/^LOCAL_LIBS/s/$/ -lnatspec/' makefile.* || die
+       else
+    eapply "${FILESDIR}/${P}-localization.patch"
+  fi
+
+       if ! use pch; then
+               sed "s:PRE_COMPILED_HEADER=StdAfx.h.gch:PRE_COMPILED_HEADER=:g" 
-i makefile.* || die
+       fi
+
+       sed \
+               -e 's|-m32 ||g' \
+               -e 's|-m64 ||g' \
+               -e 's|-pipe||g' \
+               -e "/[ALL|OPT]FLAGS/s|-s||;/OPTIMIZE/s|-s||" \
+               -e "/CFLAGS=/s|=|+=|" \
+               -e "/CXXFLAGS=/s|=|+=|" \
+               -i makefile* || die
+
+       # remove non-free RAR codec
+       if ! use rar; then
+               sed \
+                       -e '/Rar/d' \
+                       -e '/RAR/d' \
+                       -i makefile* CPP/7zip/Bundles/Format7zFree/makefile || 
die
+               rm -r CPP/7zip/Compress/Rar || die
+       fi
+
+       if use abi_x86_x32; then
+               sed -i -e "/^ASM=/s:amd64:x32:" makefile* || die
+               cp makefile.linux_amd64_asm makefile.machine || die
+       elif use amd64; then
+               cp makefile.linux_amd64_asm makefile.machine || die
+       elif use x86; then
+               cp makefile.linux_x86_asm_gcc_4.X makefile.machine || die
+       elif [[ ${CHOST} == *-darwin* ]] ; then
+               # Mac OS X needs this special makefile, because it has a non-GNU
+               # linker, it doesn't matter so much for bitwidth, for it doesn't
+               # do anything with it
+               cp makefile.macosx_llvm_64bits makefile.machine || die
+               # bundles have extension .bundle but don't die because USE=-rar
+               # removes the Rar directory
+               sed -i -e '/strcpy(name/s/\.so/.bundle/' \
+                       CPP/Windows/DLL.cpp || die
+               sed -i -e '/^PROG=/s/\.so/.bundle/' \
+                       CPP/7zip/Bundles/Format7zFree/makefile.list \
+                       $(use rar && echo CPP/7zip/Compress/Rar/makefile.list) 
|| die
+       fi
+}
+
+src_compile() {
+       emake CC="$(tc-getCC)" CXX="$(tc-getCXX)" all3
+}
+
+src_test() {
+       emake test test_7z test_7zr
+}
+
+src_install() {
+       # these wrappers cannot be symlinks, p7zip should be called with full 
path
+       make_wrapper 7zr /usr/$(get_libdir)/p7zip/7zr
+       make_wrapper 7za /usr/$(get_libdir)/p7zip/7za
+       make_wrapper 7z /usr/$(get_libdir)/p7zip/7z
+
+       dobin contrib/gzip-like_CLI_wrapper_for_7z/p7zip
+       doman contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1
+
+       exeinto /usr/$(get_libdir)/p7zip
+       doexe bin/7z bin/7za bin/7zr bin/7zCon.sfx
+       doexe bin/*$(get_modname)
+       if use rar; then
+               exeinto /usr/$(get_libdir)/p7zip/Codecs
+               doexe bin/Codecs/*$(get_modname)
+       fi
+
+       doman man1/7z.1 man1/7za.1 man1/7zr.1
+
+       dodoc ChangeLog README TODO
+       dodoc DOC/*.txt
+       docinto html
+       dodoc -r DOC/MANUAL/.
+}

Reply via email to