Blob Blame History Raw
Patch initially by Miloslav Trmač <mitr@redhat.com> and revised by Akira Tagoh
<tagoh@redhat.com> for popt <= 1.16 which fixes the problem that help messages
for --help and --usage seem not translatable. There already was some i18n support
for autohelp in popt.c, but not in popthelp.c, where it actually matters.

See https://bugzilla.redhat.com/show_bug.cgi?id=734434 for further details, please.

This patch was proposed to upstream: http://rpm5.org/community/popt-devel/0287.html

--- popt-1.16/popthelp.c			2009-08-28 09:06:33.000000000 +0900
+++ popt-1.16/popthelp.c.help			2014-01-08 12:04:00.888260244 +0900
@@ -89,7 +89,7 @@ static struct poptOption poptHelpOptions
   { "defaults", '\0', POPT_ARG_NONE, &show_option_defaults, 0,
 	N_("Display option defaults in message"), NULL },
 #endif
-  { "", '\0',	0, NULL, 0, N_("Terminate options"), NULL },
+  { NULL, '\0',	0, NULL, 0, N_("Terminate options"), NULL },
     POPT_TABLEEND
 } ;
 
@@ -527,8 +527,11 @@ static size_t maxArgWidth(const struct p
     if (opt != NULL)
     while (opt->longName || opt->shortName || opt->arg) {
 	if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) {
-	    if (opt->arg)	/* XXX program error */
-	        len = maxArgWidth(opt->arg, translation_domain);
+	    void * arg = opt->arg;
+	    /* XXX sick hack to preserve pretense of ABI. */
+	    if (arg == poptHelpOptions) arg = poptHelpOptionsI18N;
+	    if (arg)	/* XXX program error */
+		len = maxArgWidth(arg, translation_domain);
 	    if (len > max) max = len;
 	} else if (!F_ISSET(opt, DOC_HIDDEN)) {
 	    len = sizeof("  ")-1;
@@ -619,19 +622,22 @@ static void singleTableHelp(poptContext
 
     if (table != NULL)
     for (opt = table; opt->longName || opt->shortName || opt->arg; opt++) {
+	void * arg = opt->arg;
 	if (poptArgType(opt) != POPT_ARG_INCLUDE_TABLE)
 	    continue;
-	sub_transdom = getTableTranslationDomain(opt->arg);
+	/* XXX sick hack to preserve pretense of ABI. */
+	if (arg == poptHelpOptions) arg = poptHelpOptionsI18N;
+	    sub_transdom = getTableTranslationDomain(arg);
 	if (sub_transdom == NULL)
 	    sub_transdom = translation_domain;
 	    
 	/* If no popt aliases/execs, skip poptAliasOption processing. */
-	if (opt->arg == poptAliasOptions && !(con->numAliases || con->numExecs))
+	if (arg == poptAliasOptions && !(con->numAliases || con->numExecs))
 	    continue;
 	if (opt->descrip)
 	    xx = POPT_fprintf(fp, "\n%s\n", D_(sub_transdom, opt->descrip));
 
-	singleTableHelp(con, fp, opt->arg, columns, sub_transdom);
+	singleTableHelp(con, fp, arg, columns, sub_transdom);
     }
 }
 
@@ -808,22 +814,25 @@ static size_t singleTableUsage(poptConte
 	    translation_domain = (const char *)opt->arg;
 	} else
 	if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) {
+	    void * arg = opt->arg;
+	    /* XXX sick hack to preserve pretense of ABI. */
+	    if (arg == poptHelpOptions) arg = poptHelpOptionsI18N;
 	    if (done) {
 		int i = 0;
 		if (done->opts != NULL)
 		for (i = 0; i < done->nopts; i++) {
 		    const void * that = done->opts[i];
-		    if (that == NULL || that != opt->arg)
+		    if (that == NULL || that != arg)
 			/*@innercontinue@*/ continue;
 		    /*@innerbreak@*/ break;
 		}
 		/* Skip if this table has already been processed. */
-		if (opt->arg == NULL || i < done->nopts)
+		if (arg == NULL || i < done->nopts)
 		    continue;
 		if (done->opts != NULL && done->nopts < done->maxopts)
-		    done->opts[done->nopts++] = (const void *) opt->arg;
+		    done->opts[done->nopts++] = (const void *) arg;
 	    }
-	    columns->cur = singleTableUsage(con, fp, columns, opt->arg,
+	    columns->cur = singleTableUsage(con, fp, columns, arg,
 			translation_domain, done);
 	} else
 	if ((opt->longName || opt->shortName) && !F_ISSET(opt, DOC_HIDDEN)) {
@@ -864,9 +873,13 @@ static size_t showShortOptions(const str
 	    if (!strchr(s, opt->shortName) && isprint((int)opt->shortName)
 	     && opt->shortName != ' ')
 		s[strlen(s)] = opt->shortName;
-	} else if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE)
-	    if (opt->arg)	/* XXX program error */
-		len = showShortOptions(opt->arg, fp, s);
+	} else if (poptArgType(opt) == POPT_ARG_INCLUDE_TABLE) {
+	    void * arg = opt->arg;
+	    /* XXX sick hack to preserve pretense of ABI. */
+	    if (arg == poptHelpOptions) arg = poptHelpOptionsI18N;
+	    if (arg)	/* XXX program error */
+		len = showShortOptions(arg, fp, s);
+	}
     } 
 
     /* On return to top level, print the short options, return print length. */