--- popt-1.7/Makefile.am.orig	2007-12-21 19:40:03.495254000 +0900
+++ popt-1.7/Makefile.am	2007-12-21 19:42:56.088304000 +0900
@@ -15,13 +15,13 @@ noinst_HEADERS = findme.h poptint.h syst
 
 noinst_PROGRAMS = test1 test2 test3
 test1_SOURCES = test1.c
-test1_LDFLAGS = -all-static
+test1_LDFLAGS =
 test1_LDADD = $(lib_LTLIBRARIES)
 test2_SOURCES = test2.c
-test2_LDFLAGS = -all-static
+test2_LDFLAGS =
 test2_LDADD = $(lib_LTLIBRARIES)
 test3_SOURCES = test3.c
-test3_LDFLAGS = -all-static
+test3_LDFLAGS =
 test3_LDADD = $(lib_LTLIBRARIES)
 
 noinst_SCRIPTS = testit.sh
@@ -33,7 +33,7 @@ TESTS = testit.sh
 
 include_HEADERS = popt.h
 lib_LTLIBRARIES = libpopt.la
-libpopt_la_SOURCES = popt.c findme.c poptparse.c poptconfig.c popthelp.c
+libpopt_la_SOURCES = popt.c findme.c poptparse.c poptconfig.c popthelp.c poptint.c
 
 man_MANS = popt.3
 
--- popt-1.7/configure.in.orig	2007-12-21 19:40:09.557770000 +0900
+++ popt-1.7/configure.in	2007-12-21 20:07:17.961454000 +0900
@@ -1,9 +1,8 @@
 AC_INIT(popt.h)
 AC_CANONICAL_SYSTEM
 AC_PREREQ(2.12)
-AC_CONFIG_HEADERS
 AM_INIT_AUTOMAKE(popt, 1.7)
-AM_CONFIG_HEADER(config.h)
+AC_CONFIG_HEADERS(config.h)
 
 ALL_LINGUAS="cs da de es eu_ES fi fr gl hu id is it ja ko no pl pt pt_BR ro ru sk sl sr sv tr uk wa zh zh_CN.GB2312"
 
@@ -50,7 +49,7 @@ else
 fi
 AC_SUBST(TARGET)
 
-AC_CHECK_HEADERS(alloca.h float.h libintl.h mcheck.h unistd.h)
+AC_CHECK_HEADERS(alloca.h float.h libintl.h mcheck.h unistd.h langinfo.h)
 AC_MSG_CHECKING(for /usr/ucblib in LIBS)
 if test -d /usr/ucblib ; then
 	if test "$build" = "mips-sni-sysv4" ; then
@@ -73,10 +72,10 @@ then
   AC_MSG_RESULT(yes)
 fi
 
-AC_CHECK_FUNCS(strerror mtrace getuid geteuid)
 AC_CHECK_FUNC(setreuid, [], [
     AC_CHECK_LIB(ucb, setreuid, [if echo $LIBS | grep -- -lucb >/dev/null ;then :; else LIBS="$LIBS -lc -lucb" USEUCB=y;fi])
 ])
+AC_CHECK_FUNCS(getuid geteuid mtrace __secure_getenv setregid strerror iconv)
 
 AM_GNU_GETTEXT
 
--- popt-1.7/popt.h.orig	2007-12-21 20:31:45.455134000 +0900
+++ popt-1.7/popt.h	2007-12-21 20:32:06.508963000 +0900
@@ -34,6 +34,8 @@
 #define	POPT_ARG_FLOAT		8	/*!< arg will be converted to float */
 #define	POPT_ARG_DOUBLE		9	/*!< arg will be converted to double */
 
+#define POPT_ARG_MAINCALL   10U     /*!< return (*arg) (argc, argv) */
+
 #define POPT_ARG_MASK		0x0000FFFF
 /*@}*/
 
--- popt-1.7/popthelp.c.orig	2007-12-21 19:40:16.105761000 +0900
+++ popt-1.7/popthelp.c	2007-12-21 19:57:18.972191000 +0900
@@ -208,6 +208,8 @@ static void singleOptionHelp(FILE * fp, 
     char * defs = NULL;
     char * left;
     int nb = maxLeftCol + 1;
+    int displaypad = 0;
+    int xx;
 
     /* Make sure there's more than enough room in target buffer. */
     if (opt->longName)	nb += strlen(opt->longName);
@@ -307,8 +309,25 @@ static void singleOptionHelp(FILE * fp, 
 		break;
 	    }
 	} else {
-	    *le++ = '=';
-	    strcpy(le, argDescrip);		le += strlen(le);
+	    size_t lelen;
+
+	    *le++ = ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_MAINCALL)
+	    ? ' ' : '=';
+	    strcpy(le, argDescrip);
+	    lelen = strlen(le);
+	    le += lelen;
+
+#ifdef  POPT_WCHAR_HACK
+	    {   const char * scopy = argDescrip;
+	      mbstate_t t;
+	      size_t n;
+
+	      memset ((void *)&t, 0, sizeof (t)); /* In initial state.  */
+	      /* Determine number of characters.  */
+	      n = mbsrtowcs (NULL, &scopy, strlen(scopy), &t);
+	      displaypad = (int) (lelen-n);
+	    }
+#endif
 	}
 	if (opt->argInfo & POPT_ARGFLAG_OPTIONAL)
 	    *le++ = ']';
@@ -317,9 +336,9 @@ static void singleOptionHelp(FILE * fp, 
 /*@=boundswrite@*/
 
     if (help)
-	fprintf(fp,"  %-*s   ", maxLeftCol, left);
+	xx = POPT_fprintf(fp,"  %-*s   ", (int)(maxLeftCol+displaypad), left);
     else {
-	fprintf(fp,"  %s\n", left); 
+	xx = POPT_fprintf(fp,"  %s\n", left); 
 	goto out;
     }
 
@@ -335,22 +354,24 @@ static void singleOptionHelp(FILE * fp, 
 	char format[16];
 
 	ch = help + lineLength - 1;
-	while (ch > help && !isspace(*ch)) ch--;
+	while (ch > help && !_isspaceptr(ch))
+	    ch = POPT_prev_char (ch);
 	if (ch == help) break;		/* give up */
-	while (ch > (help + 1) && isspace(*ch)) ch--;
+	while (ch > (help + 1) && _isspaceptr(ch))
+	    ch = POPT_prev_char (ch);
 	ch++;
 
 	sprintf(format, "%%.%ds\n%%%ds", (int) (ch - help), indentLength);
 	/*@-formatconst@*/
-	fprintf(fp, format, help, " ");
+	xx = POPT_fprintf(fp, format, help, " ");
 	/*@=formatconst@*/
 	help = ch;
-	while (isspace(*help) && *help) help++;
+	while (_isspaceptr(help) && *help) help++;
 	helpLength = strlen(help);
     }
 /*@=boundsread@*/
 
-    if (helpLength) fprintf(fp, "%s\n", help);
+    if (helpLength) xx = POPT_fprintf(fp, "%s\n", help);
 
 out:
     /*@-dependenttrans@*/
@@ -443,6 +464,7 @@ static void singleTableHelp(poptContext 
 {
     const struct poptOption * opt;
     const char *sub_transdom;
+    int xx;
 
     if (table == poptAliasOptions) {
 	itemHelp(fp, con->aliases, con->numAliases, left, NULL);
@@ -466,7 +488,7 @@ static void singleTableHelp(poptContext 
 	    sub_transdom = translation_domain;
 	    
 	if (opt->descrip)
-	    fprintf(fp, "\n%s\n", D_(sub_transdom, opt->descrip));
+	    xx = POPT_fprintf(fp, "\n%s\n", D_(sub_transdom, opt->descrip));
 
 	singleTableHelp(con, fp, opt->arg, left, sub_transdom);
     }
--- popt-1.7/poptint.c.orig	1970-01-01 09:00:00.000000000 +0900
+++ popt-1.7/poptint.c	2007-12-21 19:57:56.997312000 +0900
@@ -0,0 +1,156 @@
+#include "system.h"
+#include <stdarg.h>
+#include "poptint.h"
+
+#ifdef HAVE_ICONV
+static /*@only@*/ /*@null@*/ char *
+strdup_locale_from_utf8 (/*@null@*/ char *buffer)
+	/*@*/
+{
+    char *codeset = NULL;
+    char *dest_str;
+    iconv_t fd;
+
+    if (buffer == NULL)
+	return NULL;
+
+#ifdef HAVE_LANGINFO_H
+/*@-type@*/
+    codeset = nl_langinfo (CODESET);
+/*@=type@*/
+#endif
+
+    if (codeset && strcmp(codeset, "UTF-8")
+     && (fd = iconv_open(codeset, "UTF-8")) != (iconv_t)-1)
+    {
+	char *pin = buffer;
+	char *pout = NULL;
+	size_t ib, ob, dest_size;
+	int done;
+	int is_error;
+	size_t err;
+	char *shift_pin = NULL;
+	int xx;
+
+	err = iconv(fd, NULL, &ib, &pout, &ob);
+	dest_size = ob = ib = strlen(buffer);
+	dest_str = pout = malloc((dest_size + 1) * sizeof(*dest_str));
+	if (dest_str)
+	    *dest_str = '\0';
+	done = is_error = 0;
+	if (pout != NULL)
+	while (!done && !is_error) {
+	    err = iconv(fd, &pin, &ib, &pout, &ob);
+
+	    if (err == (size_t)-1) {
+		switch (errno) {
+		case EINVAL:
+		    done = 1;
+		    /*@switchbreak@*/ break;
+		case E2BIG:
+		{   size_t used = pout - dest_str;
+		    dest_size *= 2;
+		    dest_str = realloc(dest_str, (dest_size + 1) * sizeof(*dest_str));
+		    if (dest_str == NULL) {
+			is_error = 1;
+			continue;
+		    }
+		    pout = dest_str + used;
+		    ob = dest_size - used;
+		}   /*@switchbreak@*/ break;
+		case EILSEQ:
+		    is_error = 1;
+		    /*@switchbreak@*/ break;
+		default:
+		    is_error = 1;
+		    /*@switchbreak@*/ break;
+		}
+	    } else {
+		if (shift_pin == NULL) {
+		    shift_pin = pin;
+		    pin = NULL;
+		    ib = 0;
+		} else {
+		    done = 1;
+		}
+	    }
+	}
+	xx = iconv_close(fd);
+	if (pout)
+	    *pout = '\0';
+	if (dest_str != NULL)
+	    dest_str = xstrdup(dest_str);
+    } else {
+	dest_str = xstrdup(buffer);
+    }
+
+    return dest_str;
+}
+#endif
+
+/*@-mustmod@*/	/* LCL: can't see the ap modification. */
+static /*@only@*/ /*@null@*/ char *
+strdup_vprintf (const char *format, va_list ap)
+	/*@modifies ap @*/
+{
+    char *buffer;
+    char c;
+    va_list apc;
+    int xx;
+
+/*@-noeffectuncon -unrecog @*/
+    va_copy(apc, ap);	/* XXX linux amd64/ppc needs a copy. */
+/*@=noeffectuncon =unrecog @*/
+
+    buffer = calloc(sizeof(*buffer), vsnprintf (&c, 1, format, ap) + 1);
+    if (buffer != NULL)
+	xx = vsprintf(buffer, format, apc);
+
+    va_end(apc);
+
+    return buffer;
+}
+/*@=mustmod@*/
+
+char *
+POPT_prev_char (const char *str)
+{
+    char *p = (char *)str;
+
+    while (1) {
+	p--;
+	if ((*p & 0xc0) != (char)0x80)
+	    return (char *)p;
+    }
+}
+
+int
+POPT_fprintf (FILE* stream, const char *format, ...)
+{
+    int retval = 0;
+    va_list args;
+    char *buffer = NULL;
+#ifdef HAVE_ICONV
+    char *locale_str = NULL;
+#endif
+
+    va_start (args, format);
+    buffer = strdup_vprintf(format, args);
+    va_end (args);
+    if (buffer == NULL)
+	return retval;
+
+#ifdef HAVE_ICONV
+    locale_str = strdup_locale_from_utf8(buffer);
+    if (locale_str) {
+	retval = fprintf(stream, "%s", locale_str);
+	free(locale_str);
+    } else
+#endif
+    {
+	retval = fprintf(stream, "%s", buffer);
+    }
+    free (buffer);
+
+    return retval;
+}
--- popt-1.7/poptint.h.orig	2007-12-21 19:40:22.696680000 +0900
+++ popt-1.7/poptint.h	2007-12-21 20:00:39.593387000 +0900
@@ -113,4 +113,37 @@ struct poptContext_s {
 
 #define N_(foo) foo
 
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#if defined(__LCLINT__)
+/*@-declundef -incondefs @*/
+extern /*@only@*/ iconv_t iconv_open(const char *__tocode, const char *__fromcode)
+    /*@*/;
+
+extern size_t iconv(iconv_t __cd, /*@null@*/ char ** __inbuf,
+            /*@out@*/ size_t * __inbytesleft,
+            /*@out@*/ char ** __outbuf,
+            /*@out@*/ size_t * __outbytesleft)
+    /*@modifies __cd,
+        *__inbuf, *__inbytesleft, *__outbuf, *__outbytesleft @*/;
+
+extern int iconv_close(/*@only@*/ iconv_t __cd)
+    /*@modifies __cd @*/;
+/*@=declundef =incondefs @*/
+#endif
+#endif
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#if defined(__LCLINT__)
+/*@-declundef -incondefs @*/
+extern char *nl_langinfo (nl_item __item)
+    /*@*/;
+/*@=declundef =incondefs @*/
+#endif
+#endif
+
+int   POPT_fprintf (FILE* steam, const char *format, ...);
+char *POPT_prev_char (const char *str);
+
 #endif
--- popt-1.7/system.h.orig	2007-12-21 20:01:08.290683000 +0900
+++ popt-1.7/system.h	2007-12-21 20:01:59.455124000 +0900
@@ -13,6 +13,9 @@ extern __const __int32_t *__ctype_touppe
 
 #include <ctype.h>
 
+/* XXX isspace(3) has i18n encoding signednesss issues on Solaris. */
+#define _isspaceptr(_chp)   isspace((int)(*(unsigned char *)(_chp)))
+
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
