I'm attaching the additional patch to fix several problems.
Please check it.
Thanks,
fujiwara
Robert Scheck wrote:
On Wed, 16 Jan 2008, Takao Fujiwara - Tokyo S/W Center wrote:
I burned DVD, installed Fedora 8 and could reproduced your problem.
Some of applications do not set bind_textdomain_codeset().
I think the attached patch will fix your main problem with removing your
change of the workaround.
Yes, the patch solves mostly the problem. But there's still one problem
with POPT_printf() (?) left, looks like a minor one, nevertheless it is
a regression:
popt 1.13 with your last patch: [EMAIL PROTECTED] kudzu --help
Verwendung: kudzu [OPTION...]
-s, --safe sicheren
Erkennungsmodus verwenden, der Hardware-Funktionen nicht beeinträchtigt
-t, --timeout=INTEGER
Zeitüberschreitung in Sekunden festlegen
-p, --probe nur suchen,
Informationen auf der Standardausgabe ausgeben
-b, --bus=STRING nur
angegebenen 'bus' untersuchen
-c, --class=STRING nur nach
der angegebene 'class' suchen
-f, --file=Datei für das Einlesen der Hardware-Informationen erkannte
Hardware aus Datei lesen
-k, --kernel=Kernelversion Nach
Modulen für eine bestimmte Kernelversion suchen
-q, --quiet
Konfiguration ohne Benutzereingaben durchführen
Help options:
-?, --help Show this
help message
--usage Display
brief usage message
And this is popt 1.13 with my latest patch: [EMAIL PROTECTED] kudzu --help
Verwendung: kudzu [OPTION...]
-s, --safe sicheren
Erkennungsmodus verwenden, der Hardware-Funktionen nicht beeinträchtigt
-t, --timeout=INTEGER
Zeitüberschreitung in Sekunden festlegen
-p, --probe nur suchen,
Informationen auf der Standardausgabe ausgeben
-b, --bus=STRING nur
angegebenen 'bus' untersuchen
-c, --class=STRING nur nach der
angegebene 'class' suchen
-f, --file=Datei für das Einlesen der Hardware-Informationen erkannte
Hardware aus Datei lesen
-k, --kernel=Kernelversion Nach Modulen
für eine bestimmte Kernelversion suchen
-q, --quiet
Konfiguration ohne Benutzereingaben durchführen
Help options:
-?, --help Show this
help message
--usage Display
brief usage message
As of my point of view, something regarding POPT_printf() (?) and umlauts
at "-f, --file=Datei für das Einlesen der Hardware-Informationen" seems to
be mis-handled. Something is making that string one character smaller as it
was and should be. Maybe we're even lacking the use of POPT_printf() some
where in the code?
Are you able to catch this minor thing also up? Thank you. And of course,
thank you very much for your past work and for figuring out the real issue;
I'm no C programmer, I'm just able to understand the code at least a bit.
Greetings,
Robert
--- popt/popthelp.c.orig 2008-01-16 02:19:01.000000000 +0900
+++ popt/popthelp.c 2008-01-25 02:18:08.000000000 +0900
@@ -15,13 +15,6 @@
#include <sys/ioctl.h>
#endif
-#define POPT_WCHAR_HACK
-#ifdef POPT_WCHAR_HACK
-#include <wchar.h> /* for mbsrtowcs */
-/[EMAIL PROTECTED] mbstate_t @*/
-#endif
-
-
#include "poptint.h"
/[EMAIL PROTECTED] [EMAIL PROTECTED]/
@@ -374,6 +367,16 @@ static void singleOptionHelp(FILE * fp,
case POPT_ARG_STRING:
*le++ = (opt->longName != NULL ? '=' : ' ');
strcpy(le, argDescrip); le += strlen(le);
+ { const char * scopy = argDescrip;
+ size_t n = 0;
+
+ while (*scopy != '\0') {
+ scopy = POPT_next_char (scopy);
+ n++;
+ }
+
+ displaypad = (int) (strlen (argDescrip) - n);
+ }
break;
default:
break;
@@ -387,18 +390,17 @@ static void singleOptionHelp(FILE * fp,
lelen = strlen(le);
le += lelen;
-#ifdef POPT_WCHAR_HACK
{ const char * scopy = argDescrip;
- mbstate_t t;
- size_t n;
+ size_t n = 0;
- memset ((void *)&t, 0, sizeof (t)); /* In initial state. */
/* Determine number of characters. */
- n = mbsrtowcs (NULL, &scopy, strlen(scopy), &t);
+ while (*scopy != '\0') {
+ scopy = POPT_next_char (scopy);
+ n++;
+ }
displaypad = (int) (lelen-n);
}
-#endif
}
if (opt->argInfo & POPT_ARGFLAG_OPTIONAL)
*le++ = ']';
@@ -420,6 +422,7 @@ static void singleOptionHelp(FILE * fp,
helpLength = strlen(help);
while (helpLength > lineLength) {
const char * ch;
+ char * formatted_help = NULL;
char format[16];
ch = help + lineLength - 1;
@@ -430,9 +433,12 @@ static void singleOptionHelp(FILE * fp,
ch = POPT_prev_char (ch);
ch++;
- sprintf(format, "%%.%ds\n%%%ds", (int) (ch - help), (int) indentLength);
+ formatted_help = xstrdup (help);
+ formatted_help[ch - help] = '\0';
+ sprintf(format, "%%s\n%%%ds", (int) indentLength);
/[EMAIL PROTECTED]@*/
- xx = POPT_fprintf(fp, format, help, " ");
+ xx = POPT_fprintf(fp, format, formatted_help, " ");
+ free (formatted_help);
/[EMAIL PROTECTED]@*/
help = ch;
while (_isspaceptr(help) && *help) help++;
@@ -594,7 +600,7 @@ static size_t showHelpIntro(poptContext
size_t len = (size_t)6;
const char * fn;
- fprintf(fp, POPT_("Usage:"));
+ POPT_fprintf(fp, POPT_("Usage:"));
if (!(con->flags & POPT_CONTEXT_KEEP_FIRST)) {
/[EMAIL PROTECTED]@*/ /* LCL: wazzup? */
fn = con->optionStack->argv[0];
@@ -614,9 +620,9 @@ void poptPrintHelp(poptContext con, FILE
(void) showHelpIntro(con, fp);
if (con->otherHelp)
- fprintf(fp, " %s\n", con->otherHelp);
+ POPT_fprintf(fp, " %s\n", con->otherHelp);
else
- fprintf(fp, " %s\n", POPT_("[OPTION...]"));
+ POPT_fprintf(fp, " %s\n", POPT_("[OPTION...]"));
if (columns) {
columns->cur = maxArgWidth(con->options, NULL);
--- popt/poptint.c.orig 2008-01-16 00:28:39.000000000 +0900
+++ popt/poptint.c 2008-01-25 02:20:34.000000000 +0900
@@ -2,6 +2,35 @@
#include <stdarg.h>
#include "poptint.h"
+const char utf8_skip_data[256] = {
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
+};
+
+#if defined(HAVE_DCGETTEXT) && !defined(__LCLINT__)
+char *
+_D_ (const char * dom, const char * str)
+{
+ char * codeset = NULL;
+ char * retval = NULL;
+
+ if (!dom)
+ dom = textdomain (NULL);
+ codeset = bind_textdomain_codeset (dom, NULL);
+ bind_textdomain_codeset (dom, "UTF-8");
+ retval = dgettext(dom, str);
+ bind_textdomain_codeset (dom, codeset);
+
+ return retval;
+}
+#endif
+
#ifdef HAVE_ICONV
static /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ char *
strdup_locale_from_utf8 (/[EMAIL PROTECTED]@*/ char *buffer)
--- popt/poptint.h.orig 2008-01-16 02:01:07.000000000 +0900
+++ popt/poptint.h 2008-01-25 01:44:43.000000000 +0900
@@ -104,8 +104,10 @@ struct poptContext_s {
#define _(foo) foo
#endif
+extern const char utf8_skip_data[];
+#define POPT_next_char(p) (char *)((p) + utf8_skip_data[*(const unsigned char
*)(p)])
#if defined(HAVE_DCGETTEXT) && !defined(__LCLINT__)
-#define D_(dom, str) dgettext(dom, str)
+#define D_(dom, str) _D_(dom, str)
#define POPT_(foo) D_("popt", foo)
#else
#define D_(dom, str) str