[PATCH 1/2] Move popt to subdirectory and make a convenience library of it

Dan Nicholson dbn.lists at gmail.com
Wed Mar 31 14:50:47 PDT 2010


This keeps a cleaner separation of the pkg-config sources and the
imported popt sources.
---
 Makefile.am       |   16 +-
 configure.in      |    1 +
 main.c            |    2 +-
 parse.c           |    2 +-
 popt.c            |  588 -----------------------------------------------------
 popt.h            |  131 ------------
 popt/Makefile.am  |    8 +
 popt/popt.c       |  588 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 popt/popt.h       |  131 ++++++++++++
 popt/poptconfig.c |  188 +++++++++++++++++
 popt/popthelp.c   |  306 ++++++++++++++++++++++++++++
 popt/poptint.h    |   85 ++++++++
 popt/poptparse.c  |  126 ++++++++++++
 poptconfig.c      |  188 -----------------
 popthelp.c        |  306 ----------------------------
 poptint.h         |   85 --------
 poptparse.c       |  126 ------------
 17 files changed, 1441 insertions(+), 1436 deletions(-)
 delete mode 100644 popt.c
 delete mode 100644 popt.h
 create mode 100644 popt/Makefile.am
 create mode 100644 popt/popt.c
 create mode 100644 popt/popt.h
 create mode 100644 popt/poptconfig.c
 create mode 100644 popt/popthelp.c
 create mode 100644 popt/poptint.h
 create mode 100644 popt/poptparse.c
 delete mode 100644 poptconfig.c
 delete mode 100644 popthelp.c
 delete mode 100644 poptint.h
 delete mode 100644 poptparse.c

diff --git a/Makefile.am b/Makefile.am
index 95998a6..0545eac 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -6,7 +6,9 @@ GLIB_SUBDIR = glib-1.2.10
 included_glib_includes = -I./glib-1.2.10
 pkg_config_LDADD=glib-1.2.10/libglib.la
 endif
-SUBDIRS = $(GLIB_SUBDIR) check
+pkg_config_LDADD += popt/libpopt.la
+popt_includes = -I./popt
+SUBDIRS = $(GLIB_SUBDIR) popt check
 
 m4dir = $(datadir)/aclocal
 m4_DATA = pkg.m4
@@ -17,7 +19,8 @@ EXTRA_DIST = $(m4_DATA) $(man_MANS) README.win32
 bin_PROGRAMS = pkg-config
 AM_CFLAGS=@WARN_CFLAGS@
 
-INCLUDES=-DPKG_CONFIG_PC_PATH="\"$(pc_path)\"" $(included_glib_includes)
+INCLUDES=-DPKG_CONFIG_PC_PATH="\"$(pc_path)\"" $(included_glib_includes) \
+	$(popt_includes)
 
 pkg_config_SOURCES= \
 	pkg.h \
@@ -26,11 +29,4 @@ pkg_config_SOURCES= \
 	parse.c \
 	main.c \
 	findme.c \
-	findme.h \
-	popt.c \
-	popt.h \
-	poptconfig.c \
-	popthelp.c \
-	poptint.h \
-	poptparse.c
-
+	findme.h
diff --git a/configure.in b/configure.in
index f7a424c..98712f4 100644
--- a/configure.in
+++ b/configure.in
@@ -141,5 +141,6 @@ AC_CHECK_FUNCS(setresuid setreuid,break)
 AC_CHECK_HEADERS([dirent.h unistd.h sys/wait.h malloc.h])
 
 AC_OUTPUT([Makefile
+	   popt/Makefile
 	   check/Makefile
 	   check/config.sh])
diff --git a/main.c b/main.c
index b9442fc..df8e9aa 100644
--- a/main.c
+++ b/main.c
@@ -24,7 +24,7 @@
 #include "pkg.h"
 #include "parse.h"
 
-#include "popt.h"
+#include <popt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
diff --git a/parse.c b/parse.c
index 5292c96..740a19e 100644
--- a/parse.c
+++ b/parse.c
@@ -28,7 +28,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
-#include "popt.h"
+#include <popt.h>
 #ifdef HAVE_SYS_WAIT_H
 #include <sys/wait.h>
 #endif
diff --git a/popt.c b/popt.c
deleted file mode 100644
index 7d0e3bb..0000000
--- a/popt.c
+++ /dev/null
@@ -1,588 +0,0 @@
-/* 
- * Copyright (C) 1998 Red Hat Inc.
- * 
- * 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., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#else
-# ifdef _AIX
-#  pragma alloca
-# endif
-#endif
-
-#ifdef HAVE_MALLOC_H
-# include <malloc.h>
-#endif
-
-#include <errno.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "findme.h"
-#include "popt.h"
-#include "poptint.h"
-
-void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) {
-    if (con->execPath) free(con->execPath);
-    con->execPath = strdup(path);
-    con->execAbsolute = allowAbsolute;
-}
-
-static void invokeCallbacks(poptContext con, const struct poptOption * table,
-			    int post) {
-    const struct poptOption * opt = table;
-    poptCallbackType cb;
-    
-    while (opt->longName || opt->shortName || opt->arg) {
-	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
-	    invokeCallbacks(con, opt->arg, post);
-	} else if (((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) &&
-		   ((!post && (opt->argInfo & POPT_CBFLAG_PRE)) ||
-		    ( post && (opt->argInfo & POPT_CBFLAG_POST)))) {
-	    cb = opt->arg;
-	    cb(con, post ? POPT_CALLBACK_REASON_POST : POPT_CALLBACK_REASON_PRE,
-	       NULL, NULL, opt->descrip);
-	}
-	opt++;
-    }
-}
-
-poptContext poptGetContext(char * name, int argc, char ** argv, 
-			   const struct poptOption * options, int flags) {
-    poptContext con = malloc(sizeof(*con));
-
-    memset(con, 0, sizeof(*con));
-
-    con->os = con->optionStack;
-    con->os->argc = argc;
-    con->os->argv = argv;
-
-    if (!(flags & POPT_CONTEXT_KEEP_FIRST))
-	con->os->next = 1;			/* skip argv[0] */
-
-    con->leftovers = malloc(sizeof(char *) * (argc + 1));
-    con->options = options;
-    con->finalArgv = malloc(sizeof(*con->finalArgv) * (argc * 2));
-    con->finalArgvAlloced = argc * 2;
-    con->flags = flags;
-    con->execAbsolute = 1;
-
-    if (getenv("POSIXLY_CORRECT") || getenv("POSIX_ME_HARDER"))
-	con->flags |= POPT_CONTEXT_POSIXMEHARDER;
-    
-    if (name)
-	con->appName = strcpy(malloc(strlen(name) + 1), name);
-
-    invokeCallbacks(con, con->options, 0);
-
-    return con;
-}
-
-void poptResetContext(poptContext con) {
-    con->os = con->optionStack;
-    con->os->currAlias = NULL;
-    con->os->nextCharArg = NULL;
-    con->os->nextArg = NULL;
-    con->os->next = 1;			/* skip argv[0] */
-
-    con->numLeftovers = 0;
-    con->nextLeftover = 0;
-    con->restLeftover = 0;
-    con->doExec = NULL;
-    con->finalArgvCount = 0;
-}
-
-/* Only one of longName, shortName may be set at a time */
-static int handleExec(poptContext con, char * longName, char shortName) {
-    int i;
-
-    i = con->numExecs - 1;
-    if (longName) {
-	while (i >= 0 && (!con->execs[i].longName ||
-	    strcmp(con->execs[i].longName, longName))) i--;
-    } else {
-	while (i >= 0 &&
-	    con->execs[i].shortName != shortName) i--;
-    }
-
-    if (i < 0) return 0;
-
-    if (con->flags & POPT_CONTEXT_NO_EXEC)
-	return 1;
-
-    if (!con->doExec) {
-	con->doExec = con->execs + i;
-	return 1;
-    }
-
-    /* We already have an exec to do; remember this option for next
-       time 'round */
-    if ((con->finalArgvCount + 1) >= (con->finalArgvAlloced)) {
-	con->finalArgvAlloced += 10;
-	con->finalArgv = realloc(con->finalArgv,
-			sizeof(*con->finalArgv) * con->finalArgvAlloced);
-    }
-
-    i = con->finalArgvCount++;
-    con->finalArgv[i] = malloc((longName ? strlen(longName) : 0) + 3);
-    if (longName)
-	sprintf(con->finalArgv[i], "--%s", longName);
-    else 
-	sprintf(con->finalArgv[i], "-%c", shortName);
-
-    return 1;
-}
-
-/* Only one of longName, shortName may be set at a time */
-static int handleAlias(poptContext con, char * longName, char shortName,
-		       char * nextCharArg) {
-    int i;
-
-    if (con->os->currAlias && con->os->currAlias->longName && longName &&
-	!strcmp(con->os->currAlias->longName, longName)) 
-	return 0;
-    if (con->os->currAlias && shortName == con->os->currAlias->shortName)
-	return 0;
-
-    i = con->numAliases - 1;
-    if (longName) {
-	while (i >= 0 && (!con->aliases[i].longName ||
-	    strcmp(con->aliases[i].longName, longName))) i--;
-    } else {
-	while (i >= 0 &&
-	    con->aliases[i].shortName != shortName) i--;
-    }
-
-    if (i < 0) return 0;
-
-    if ((con->os - con->optionStack + 1) 
-	    == POPT_OPTION_DEPTH)
-	return POPT_ERROR_OPTSTOODEEP;
-
-    if (nextCharArg && *nextCharArg)
-	con->os->nextCharArg = nextCharArg;
-
-    con->os++;
-    con->os->next = 0;
-    con->os->stuffed = 0;
-    con->os->nextArg = con->os->nextCharArg = NULL;
-    con->os->currAlias = con->aliases + i;
-    con->os->argc = con->os->currAlias->argc;
-    con->os->argv = con->os->currAlias->argv;
-
-    return 1;
-}
-
-#ifndef _WIN32
-
-static void execCommand(poptContext con) {
-    char ** argv;
-    int pos = 0;
-    char * script = con->doExec->script;
-
-    argv = malloc(sizeof(*argv) * 
-			(6 + con->numLeftovers + con->finalArgvCount));
-
-    if (!con->execAbsolute && strchr(script, '/')) return;
-
-    if (!strchr(script, '/') && con->execPath) {
-	argv[pos] = alloca(strlen(con->execPath) + strlen(script) + 2);
-	sprintf(argv[pos], "%s/%s", con->execPath, script);
-    } else {
-	argv[pos] = script;
-    }
-    pos++;
-
-    argv[pos] = findProgramPath(con->os->argv[0]);
-    if (argv[pos]) pos++;
-    argv[pos++] = ";";
-
-    memcpy(argv + pos, con->finalArgv, sizeof(*argv) * con->finalArgvCount);
-    pos += con->finalArgvCount;
-
-    if (con->numLeftovers) {
-	argv[pos++] = "--";
-	memcpy(argv + pos, con->leftovers, sizeof(*argv) * con->numLeftovers);
-	pos += con->numLeftovers;
-    }
-
-    argv[pos++] = NULL;
-
-    execvp(argv[0], argv);
-}
-
-#endif
-
-static const struct poptOption * findOption(const struct poptOption * table,
-					    const char * longName,
-					    const char shortName,
-					    poptCallbackType * callback,
-					    void ** callbackData,
-					    int singleDash) {
-    const struct poptOption * opt = table;
-    const struct poptOption * opt2;
-    const struct poptOption * cb = NULL;
-
-    while (opt->longName || opt->shortName || opt->arg) {
-	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
-	    opt2 = findOption(opt->arg, longName, shortName, callback, 
-			      callbackData, singleDash);
-	    if (opt2) {
-		if (*callback && !*callbackData)
-		    *callbackData = opt->descrip;
-		return opt2;
-	    }
-	} else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) {
-	    cb = opt;
-	} else if (longName && opt->longName && 
-		   (!singleDash || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) &&
-		   !strcmp(longName, opt->longName)) {
-	    break;
-	} else if (shortName && shortName == opt->shortName) {
-	    break;
-	}
-	opt++;
-    }
-
-    if (!opt->longName && !opt->shortName) return NULL;
-    *callbackData = NULL;
-    *callback = NULL;
-    if (cb) {
-	*callback = cb->arg;
-	if (!(cb->argInfo & POPT_CBFLAG_INC_DATA))
-	    *callbackData = cb->descrip;
-    }
-
-    return opt;
-}
-
-/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */
-int poptGetNextOpt(poptContext con) {
-    char * optString, * chptr, * localOptString;
-    char * longArg = NULL;
-    char * origOptString;
-    long aLong;
-    char * end;
-    const struct poptOption * opt = NULL;
-    int done = 0;
-    int i;
-    poptCallbackType cb;
-    void * cbData;
-    int singleDash;
-
-    while (!done) {
-	while (!con->os->nextCharArg && con->os->next == con->os->argc 
-		&& con->os > con->optionStack)
-	    con->os--;
-	if (!con->os->nextCharArg && con->os->next == con->os->argc) {
-	    invokeCallbacks(con, con->options, 1);
-#ifndef _WIN32
-	    if (con->doExec) execCommand(con);
-#endif
-	    return -1;
-	}
-
-	if (!con->os->nextCharArg) {
-		
-	    origOptString = con->os->argv[con->os->next++];
-
-	    if (con->restLeftover || *origOptString != '-') {
-		con->leftovers[con->numLeftovers++] = origOptString;
-		if (con->flags & POPT_CONTEXT_POSIXMEHARDER)
-		    con->restLeftover = 1;
-		continue;
-	    }
-
-	    /* Make a copy we can hack at */
-	    localOptString = optString = 
-			strcpy(alloca(strlen(origOptString) + 1), 
-			origOptString);
-
-	    if (!optString[0])
-		return POPT_ERROR_BADOPT;
-
-	    if (optString[1] == '-' && !optString[2]) {
-		con->restLeftover = 1;
-		continue;
-	    } else {
-		optString++;
-		if (*optString == '-')
-		    singleDash = 0, optString++;
-		else
-		    singleDash = 1;
-
-		if (handleAlias(con, optString, '\0', NULL))
-		    continue;
-		if (handleExec(con, optString, '\0'))
-		    continue;
-
-		chptr = optString;
-		while (*chptr && *chptr != '=') chptr++;
-		if (*chptr == '=') {
-		    longArg = origOptString + (chptr - localOptString) + 1;
-		    *chptr = '\0';
-		}
-
-		opt = findOption(con->options, optString, '\0', &cb, &cbData,
-				 singleDash);
-		if (!opt && !singleDash) return POPT_ERROR_BADOPT;
-	    }
-
-	    if (!opt)
-		con->os->nextCharArg = origOptString + 1;
-	}
-
-	if (con->os->nextCharArg) {
-	    origOptString = con->os->nextCharArg;
-
-	    con->os->nextCharArg = NULL;
-
-	    if (handleAlias(con, NULL, *origOptString,
-			    origOptString + 1)) {
-		origOptString++;
-		continue;
-	    }
-	    if (handleExec(con, NULL, *origOptString))
-		continue;
-
-	    opt = findOption(con->options, NULL, *origOptString, &cb, 
-			     &cbData, 0);
-	    if (!opt) return POPT_ERROR_BADOPT;
-
-	    origOptString++;
-	    if (*origOptString)
-		con->os->nextCharArg = origOptString;
-	}
-
-	if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) 
-	    *((int *)opt->arg) = 1;
-	else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
-	    if (longArg) {
-		con->os->nextArg = longArg;
-	    } else if (con->os->nextCharArg) {
-		con->os->nextArg = con->os->nextCharArg;
-		con->os->nextCharArg = NULL;
-	    } else { 
-		while (con->os->next == con->os->argc && 
-		       con->os > con->optionStack)
-		    con->os--;
-		if (con->os->next == con->os->argc)
-		    return POPT_ERROR_NOARG;
-
-		con->os->nextArg = con->os->argv[con->os->next++];
-	    }
-
-	    if (opt->arg) {
-		switch (opt->argInfo & POPT_ARG_MASK) {
-		  case POPT_ARG_STRING:
-		    *((char **) opt->arg) = con->os->nextArg;
-		    break;
-
-		  case POPT_ARG_INT:
-		  case POPT_ARG_LONG:
-		    aLong = strtol(con->os->nextArg, &end, 0);
-		    if (*end) 
-			return POPT_ERROR_BADNUMBER;
-
-		    if (aLong == LONG_MIN || aLong == LONG_MAX)
-			return POPT_ERROR_OVERFLOW;
-		    if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {
-			*((long *) opt->arg) = aLong;
-		    } else {
-			if (aLong > INT_MAX || aLong < INT_MIN)
-			    return POPT_ERROR_OVERFLOW;
-			*((int *) opt->arg) =aLong;
-		    }
-		    break;
-
-		  default:
-		    fprintf(stdout, POPT_("option type (%d) not implemented in popt\n"),
-		      opt->argInfo & POPT_ARG_MASK);
-		    exit(1);
-		}
-	    }
-	}
-
-	if (cb)
-	    cb(con, POPT_CALLBACK_REASON_OPTION, opt, con->os->nextArg, cbData);
-	else if (opt->val) 
-	    done = 1;
-
-	if ((con->finalArgvCount + 2) >= (con->finalArgvAlloced)) {
-	    con->finalArgvAlloced += 10;
-	    con->finalArgv = realloc(con->finalArgv,
-			    sizeof(*con->finalArgv) * con->finalArgvAlloced);
-	}
-
-	i = con->finalArgvCount++;
-	con->finalArgv[i] = 
-		malloc((opt->longName ? strlen(opt->longName) : 0) + 3);
-	if (opt->longName)
-	    sprintf(con->finalArgv[i], "--%s", opt->longName);
-	else 
-	    sprintf(con->finalArgv[i], "-%c", opt->shortName);
-
-	if (opt->arg && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) 
-	    con->finalArgv[con->finalArgvCount++] = strdup(con->os->nextArg);
-    }
-
-    return opt->val;
-}
-
-char * poptGetOptArg(poptContext con) {
-    char * ret = con->os->nextArg;
-    con->os->nextArg = NULL;
-    return ret;
-}
-
-char * poptGetArg(poptContext con) {
-    if (con->numLeftovers == con->nextLeftover) return NULL;
-    return (con->leftovers[con->nextLeftover++]);
-}
-
-char * poptPeekArg(poptContext con) {
-    if (con->numLeftovers == con->nextLeftover) return NULL;
-    return (con->leftovers[con->nextLeftover]);
-}
-
-char ** poptGetArgs(poptContext con) {
-    if (con->numLeftovers == con->nextLeftover) return NULL;
-
-    /* some apps like [like RPM ;-) ] need this NULL terminated */
-    con->leftovers[con->numLeftovers] = NULL;
-
-    return (con->leftovers + con->nextLeftover);
-}
-
-void poptFreeContext(poptContext con) {
-    int i;
-
-    for (i = 0; i < con->numAliases; i++) {
-	if (con->aliases[i].longName) free(con->aliases[i].longName);
-	free(con->aliases[i].argv);
-    }
-
-    for (i = 0; i < con->numExecs; i++) {
-	if (con->execs[i].longName) free(con->execs[i].longName);
-	free(con->execs[i].script);
-    }
-
-    for (i = 0; i < con->finalArgvCount; i++)
-	free(con->finalArgv[i]);
-
-    free(con->leftovers);
-    free(con->finalArgv);
-    if (con->appName) free(con->appName);
-    if (con->aliases) free(con->aliases);
-    if (con->otherHelp) free(con->otherHelp);
-    free(con);
-}
-
-int poptAddAlias(poptContext con, struct poptAlias newAlias, int flags) {
-    int aliasNum = con->numAliases++;
-    struct poptAlias * alias;
-
-    /* SunOS won't realloc(NULL, ...) */
-    if (!con->aliases)
-	con->aliases = malloc(sizeof(newAlias) * con->numAliases);
-    else
-	con->aliases = realloc(con->aliases, 
-			       sizeof(newAlias) * con->numAliases);
-    alias = con->aliases + aliasNum;
-    
-    *alias = newAlias;
-    if (alias->longName)
-	alias->longName = strcpy(malloc(strlen(alias->longName) + 1), 
-				    alias->longName);
-    else
-	alias->longName = NULL;
-
-    return 0;
-}
-
-char * poptBadOption(poptContext con, int flags) {
-    struct optionStackEntry * os;
-
-    if (flags & POPT_BADOPTION_NOALIAS)
-	os = con->optionStack;
-    else
-	os = con->os;
-
-    return os->argv[os->next - 1];
-}
-
-#define POPT_ERROR_NOARG	-10
-#define POPT_ERROR_BADOPT	-11
-#define POPT_ERROR_OPTSTOODEEP	-13
-#define POPT_ERROR_BADQUOTE	-15	/* only from poptParseArgString() */
-#define POPT_ERROR_ERRNO	-16	/* only from poptParseArgString() */
-
-const char * poptStrerror(const int error) {
-    switch (error) {
-      case POPT_ERROR_NOARG:
-	return POPT_("missing argument");
-      case POPT_ERROR_BADOPT:
-	return POPT_("unknown option");
-      case POPT_ERROR_OPTSTOODEEP:
-	return POPT_("aliases nested too deeply");
-      case POPT_ERROR_BADQUOTE:
-	return POPT_("error in paramter quoting");
-      case POPT_ERROR_BADNUMBER:
-	return POPT_("invalid numeric value");
-      case POPT_ERROR_OVERFLOW:
-	return POPT_("number too large or too small");
-      case POPT_ERROR_ERRNO:
-	return strerror(errno);
-      default:
-	return POPT_("unknown error");
-    }
-}
-
-int poptStuffArgs(poptContext con, char ** argv) {
-    int i;
-
-    if ((con->os - con->optionStack) == POPT_OPTION_DEPTH)
-	return POPT_ERROR_OPTSTOODEEP;
-
-    for (i = 0; argv[i]; i++);
-
-    con->os++;
-    con->os->next = 0;
-    con->os->nextArg = con->os->nextCharArg = NULL;
-    con->os->currAlias = NULL;
-    con->os->argc = i;
-    con->os->argv = argv;
-    con->os->stuffed = 1;
-
-    return 0;
-}
-
-const char * poptGetInvocationName(poptContext con) {
-    return con->os->argv[0];
-}
diff --git a/popt.h b/popt.h
deleted file mode 100644
index c217e1b..0000000
--- a/popt.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
-Copyright (c) 1998  Red Hat Software
- 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
- 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
- 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- 
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-*/
-
-#ifndef H_POPT
-#define H_POPT
-
-#include <stdio.h>			/* for FILE * */
-
-#define POPT_OPTION_DEPTH	10
-
-#define POPT_ARG_NONE		0
-#define POPT_ARG_STRING		1
-#define POPT_ARG_INT		2
-#define POPT_ARG_LONG		3
-#define POPT_ARG_INCLUDE_TABLE	4	/* arg points to table */
-#define POPT_ARG_CALLBACK	5	/* table-wide callback... must be
-					   set first in table; arg points 
-					   to callback, descrip points to 
-					   callback data to pass */
-#define POPT_ARG_MASK		0x0000FFFF
-#define POPT_ARGFLAG_ONEDASH	0x80000000  /* allow -longoption */
-#define POPT_ARGFLAG_DOC_HIDDEN 0x40000000  /* don't show in help/usage */
-#define POPT_CBFLAG_PRE		0x80000000  /* call the callback before parse */
-#define POPT_CBFLAG_POST	0x40000000  /* call the callback after parse */
-#define POPT_CBFLAG_INC_DATA	0x20000000  /* use data from the include line,
-					       not the subtable */
-
-#define POPT_ERROR_NOARG	-10
-#define POPT_ERROR_BADOPT	-11
-#define POPT_ERROR_OPTSTOODEEP	-13
-#define POPT_ERROR_BADQUOTE	-15	/* only from poptParseArgString() */
-#define POPT_ERROR_ERRNO	-16	/* only from poptParseArgString() */
-#define POPT_ERROR_BADNUMBER	-17
-#define POPT_ERROR_OVERFLOW	-18
-
-/* poptBadOption() flags */
-#define POPT_BADOPTION_NOALIAS  (1 << 0)  /* don't go into an alias */
-
-/* poptGetContext() flags */
-#define POPT_CONTEXT_NO_EXEC	(1 << 0)  /* ignore exec expansions */
-#define POPT_CONTEXT_KEEP_FIRST	(1 << 1)  /* pay attention to argv[0] */
-#define POPT_CONTEXT_POSIXMEHARDER (1 << 2) /* options can't follow args */
-
-struct poptOption {
-    const char * longName;	/* may be NULL */
-    char shortName;		/* may be '\0' */
-    int argInfo;
-    void * arg;			/* depends on argInfo */
-    int val;			/* 0 means don't return, just update flag */
-    char * descrip;		/* description for autohelp -- may be NULL */
-    char * argDescrip;		/* argument description for autohelp */
-};
-
-struct poptAlias {
-    char * longName;		/* may be NULL */
-    char shortName;		/* may be '\0' */
-    int argc;
-    char ** argv;		/* must be free()able */
-};
-
-extern struct poptOption poptHelpOptions[];
-#define POPT_AUTOHELP { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptHelpOptions, \
-			0, "Help options", NULL },
-
-typedef struct poptContext_s * poptContext;
-#ifndef __cplusplus
-typedef struct poptOption * poptOption;
-#endif
-
-enum poptCallbackReason { POPT_CALLBACK_REASON_PRE, 
-			  POPT_CALLBACK_REASON_POST,
-			  POPT_CALLBACK_REASON_OPTION };
-typedef void (*poptCallbackType)(poptContext con, 
-				 enum poptCallbackReason reason,
-			         const struct poptOption * opt,
-				 const char * arg, void * data);
-
-poptContext poptGetContext(char * name, int argc, char ** argv, 
-			   const struct poptOption * options, int flags);
-void poptResetContext(poptContext con);
-
-/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */
-int poptGetNextOpt(poptContext con);
-/* returns NULL if no argument is available */
-char * poptGetOptArg(poptContext con);
-/* returns NULL if no more options are available */
-char * poptGetArg(poptContext con);
-char * poptPeekArg(poptContext con);
-char ** poptGetArgs(poptContext con);
-/* returns the option which caused the most recent error */
-char * poptBadOption(poptContext con, int flags);
-void poptFreeContext(poptContext con);
-int poptStuffArgs(poptContext con, char ** argv);
-int poptAddAlias(poptContext con, struct poptAlias alias, int flags);
-int poptReadConfigFile(poptContext con, char * fn);
-/* like above, but reads /etc/popt and $HOME/.popt along with environment 
-   vars */
-int poptReadDefaultConfig(poptContext con, int useEnv);
-/* argv should be freed -- this allows ', ", and \ quoting, but ' is treated
-   the same as " and both may include \ quotes */
-int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr);
-const char * poptStrerror(const int error);
-void poptSetExecPath(poptContext con, const char * path, int allowAbsolute);
-void poptPrintHelp(poptContext con, FILE * f, int flags);
-void poptPrintUsage(poptContext con, FILE * f, int flags);
-void poptSetOtherOptionHelp(poptContext con, const char * text);
-const char * poptGetInvocationName(poptContext con);
-
-#endif
diff --git a/popt/Makefile.am b/popt/Makefile.am
new file mode 100644
index 0000000..b11c12a
--- /dev/null
+++ b/popt/Makefile.am
@@ -0,0 +1,8 @@
+noinst_LTLIBRARIES = libpopt.la
+libpopt_la_SOURCES = \
+	popt.c \
+	popt.h \
+	poptconfig.c \
+	popthelp.c \
+	poptint.h \
+	poptparse.c
diff --git a/popt/popt.c b/popt/popt.c
new file mode 100644
index 0000000..7d0e3bb
--- /dev/null
+++ b/popt/popt.c
@@ -0,0 +1,588 @@
+/* 
+ * Copyright (C) 1998 Red Hat Inc.
+ * 
+ * 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#else
+# ifdef _AIX
+#  pragma alloca
+# endif
+#endif
+
+#ifdef HAVE_MALLOC_H
+# include <malloc.h>
+#endif
+
+#include <errno.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "findme.h"
+#include "popt.h"
+#include "poptint.h"
+
+void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) {
+    if (con->execPath) free(con->execPath);
+    con->execPath = strdup(path);
+    con->execAbsolute = allowAbsolute;
+}
+
+static void invokeCallbacks(poptContext con, const struct poptOption * table,
+			    int post) {
+    const struct poptOption * opt = table;
+    poptCallbackType cb;
+    
+    while (opt->longName || opt->shortName || opt->arg) {
+	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
+	    invokeCallbacks(con, opt->arg, post);
+	} else if (((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) &&
+		   ((!post && (opt->argInfo & POPT_CBFLAG_PRE)) ||
+		    ( post && (opt->argInfo & POPT_CBFLAG_POST)))) {
+	    cb = opt->arg;
+	    cb(con, post ? POPT_CALLBACK_REASON_POST : POPT_CALLBACK_REASON_PRE,
+	       NULL, NULL, opt->descrip);
+	}
+	opt++;
+    }
+}
+
+poptContext poptGetContext(char * name, int argc, char ** argv, 
+			   const struct poptOption * options, int flags) {
+    poptContext con = malloc(sizeof(*con));
+
+    memset(con, 0, sizeof(*con));
+
+    con->os = con->optionStack;
+    con->os->argc = argc;
+    con->os->argv = argv;
+
+    if (!(flags & POPT_CONTEXT_KEEP_FIRST))
+	con->os->next = 1;			/* skip argv[0] */
+
+    con->leftovers = malloc(sizeof(char *) * (argc + 1));
+    con->options = options;
+    con->finalArgv = malloc(sizeof(*con->finalArgv) * (argc * 2));
+    con->finalArgvAlloced = argc * 2;
+    con->flags = flags;
+    con->execAbsolute = 1;
+
+    if (getenv("POSIXLY_CORRECT") || getenv("POSIX_ME_HARDER"))
+	con->flags |= POPT_CONTEXT_POSIXMEHARDER;
+    
+    if (name)
+	con->appName = strcpy(malloc(strlen(name) + 1), name);
+
+    invokeCallbacks(con, con->options, 0);
+
+    return con;
+}
+
+void poptResetContext(poptContext con) {
+    con->os = con->optionStack;
+    con->os->currAlias = NULL;
+    con->os->nextCharArg = NULL;
+    con->os->nextArg = NULL;
+    con->os->next = 1;			/* skip argv[0] */
+
+    con->numLeftovers = 0;
+    con->nextLeftover = 0;
+    con->restLeftover = 0;
+    con->doExec = NULL;
+    con->finalArgvCount = 0;
+}
+
+/* Only one of longName, shortName may be set at a time */
+static int handleExec(poptContext con, char * longName, char shortName) {
+    int i;
+
+    i = con->numExecs - 1;
+    if (longName) {
+	while (i >= 0 && (!con->execs[i].longName ||
+	    strcmp(con->execs[i].longName, longName))) i--;
+    } else {
+	while (i >= 0 &&
+	    con->execs[i].shortName != shortName) i--;
+    }
+
+    if (i < 0) return 0;
+
+    if (con->flags & POPT_CONTEXT_NO_EXEC)
+	return 1;
+
+    if (!con->doExec) {
+	con->doExec = con->execs + i;
+	return 1;
+    }
+
+    /* We already have an exec to do; remember this option for next
+       time 'round */
+    if ((con->finalArgvCount + 1) >= (con->finalArgvAlloced)) {
+	con->finalArgvAlloced += 10;
+	con->finalArgv = realloc(con->finalArgv,
+			sizeof(*con->finalArgv) * con->finalArgvAlloced);
+    }
+
+    i = con->finalArgvCount++;
+    con->finalArgv[i] = malloc((longName ? strlen(longName) : 0) + 3);
+    if (longName)
+	sprintf(con->finalArgv[i], "--%s", longName);
+    else 
+	sprintf(con->finalArgv[i], "-%c", shortName);
+
+    return 1;
+}
+
+/* Only one of longName, shortName may be set at a time */
+static int handleAlias(poptContext con, char * longName, char shortName,
+		       char * nextCharArg) {
+    int i;
+
+    if (con->os->currAlias && con->os->currAlias->longName && longName &&
+	!strcmp(con->os->currAlias->longName, longName)) 
+	return 0;
+    if (con->os->currAlias && shortName == con->os->currAlias->shortName)
+	return 0;
+
+    i = con->numAliases - 1;
+    if (longName) {
+	while (i >= 0 && (!con->aliases[i].longName ||
+	    strcmp(con->aliases[i].longName, longName))) i--;
+    } else {
+	while (i >= 0 &&
+	    con->aliases[i].shortName != shortName) i--;
+    }
+
+    if (i < 0) return 0;
+
+    if ((con->os - con->optionStack + 1) 
+	    == POPT_OPTION_DEPTH)
+	return POPT_ERROR_OPTSTOODEEP;
+
+    if (nextCharArg && *nextCharArg)
+	con->os->nextCharArg = nextCharArg;
+
+    con->os++;
+    con->os->next = 0;
+    con->os->stuffed = 0;
+    con->os->nextArg = con->os->nextCharArg = NULL;
+    con->os->currAlias = con->aliases + i;
+    con->os->argc = con->os->currAlias->argc;
+    con->os->argv = con->os->currAlias->argv;
+
+    return 1;
+}
+
+#ifndef _WIN32
+
+static void execCommand(poptContext con) {
+    char ** argv;
+    int pos = 0;
+    char * script = con->doExec->script;
+
+    argv = malloc(sizeof(*argv) * 
+			(6 + con->numLeftovers + con->finalArgvCount));
+
+    if (!con->execAbsolute && strchr(script, '/')) return;
+
+    if (!strchr(script, '/') && con->execPath) {
+	argv[pos] = alloca(strlen(con->execPath) + strlen(script) + 2);
+	sprintf(argv[pos], "%s/%s", con->execPath, script);
+    } else {
+	argv[pos] = script;
+    }
+    pos++;
+
+    argv[pos] = findProgramPath(con->os->argv[0]);
+    if (argv[pos]) pos++;
+    argv[pos++] = ";";
+
+    memcpy(argv + pos, con->finalArgv, sizeof(*argv) * con->finalArgvCount);
+    pos += con->finalArgvCount;
+
+    if (con->numLeftovers) {
+	argv[pos++] = "--";
+	memcpy(argv + pos, con->leftovers, sizeof(*argv) * con->numLeftovers);
+	pos += con->numLeftovers;
+    }
+
+    argv[pos++] = NULL;
+
+    execvp(argv[0], argv);
+}
+
+#endif
+
+static const struct poptOption * findOption(const struct poptOption * table,
+					    const char * longName,
+					    const char shortName,
+					    poptCallbackType * callback,
+					    void ** callbackData,
+					    int singleDash) {
+    const struct poptOption * opt = table;
+    const struct poptOption * opt2;
+    const struct poptOption * cb = NULL;
+
+    while (opt->longName || opt->shortName || opt->arg) {
+	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
+	    opt2 = findOption(opt->arg, longName, shortName, callback, 
+			      callbackData, singleDash);
+	    if (opt2) {
+		if (*callback && !*callbackData)
+		    *callbackData = opt->descrip;
+		return opt2;
+	    }
+	} else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) {
+	    cb = opt;
+	} else if (longName && opt->longName && 
+		   (!singleDash || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) &&
+		   !strcmp(longName, opt->longName)) {
+	    break;
+	} else if (shortName && shortName == opt->shortName) {
+	    break;
+	}
+	opt++;
+    }
+
+    if (!opt->longName && !opt->shortName) return NULL;
+    *callbackData = NULL;
+    *callback = NULL;
+    if (cb) {
+	*callback = cb->arg;
+	if (!(cb->argInfo & POPT_CBFLAG_INC_DATA))
+	    *callbackData = cb->descrip;
+    }
+
+    return opt;
+}
+
+/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */
+int poptGetNextOpt(poptContext con) {
+    char * optString, * chptr, * localOptString;
+    char * longArg = NULL;
+    char * origOptString;
+    long aLong;
+    char * end;
+    const struct poptOption * opt = NULL;
+    int done = 0;
+    int i;
+    poptCallbackType cb;
+    void * cbData;
+    int singleDash;
+
+    while (!done) {
+	while (!con->os->nextCharArg && con->os->next == con->os->argc 
+		&& con->os > con->optionStack)
+	    con->os--;
+	if (!con->os->nextCharArg && con->os->next == con->os->argc) {
+	    invokeCallbacks(con, con->options, 1);
+#ifndef _WIN32
+	    if (con->doExec) execCommand(con);
+#endif
+	    return -1;
+	}
+
+	if (!con->os->nextCharArg) {
+		
+	    origOptString = con->os->argv[con->os->next++];
+
+	    if (con->restLeftover || *origOptString != '-') {
+		con->leftovers[con->numLeftovers++] = origOptString;
+		if (con->flags & POPT_CONTEXT_POSIXMEHARDER)
+		    con->restLeftover = 1;
+		continue;
+	    }
+
+	    /* Make a copy we can hack at */
+	    localOptString = optString = 
+			strcpy(alloca(strlen(origOptString) + 1), 
+			origOptString);
+
+	    if (!optString[0])
+		return POPT_ERROR_BADOPT;
+
+	    if (optString[1] == '-' && !optString[2]) {
+		con->restLeftover = 1;
+		continue;
+	    } else {
+		optString++;
+		if (*optString == '-')
+		    singleDash = 0, optString++;
+		else
+		    singleDash = 1;
+
+		if (handleAlias(con, optString, '\0', NULL))
+		    continue;
+		if (handleExec(con, optString, '\0'))
+		    continue;
+
+		chptr = optString;
+		while (*chptr && *chptr != '=') chptr++;
+		if (*chptr == '=') {
+		    longArg = origOptString + (chptr - localOptString) + 1;
+		    *chptr = '\0';
+		}
+
+		opt = findOption(con->options, optString, '\0', &cb, &cbData,
+				 singleDash);
+		if (!opt && !singleDash) return POPT_ERROR_BADOPT;
+	    }
+
+	    if (!opt)
+		con->os->nextCharArg = origOptString + 1;
+	}
+
+	if (con->os->nextCharArg) {
+	    origOptString = con->os->nextCharArg;
+
+	    con->os->nextCharArg = NULL;
+
+	    if (handleAlias(con, NULL, *origOptString,
+			    origOptString + 1)) {
+		origOptString++;
+		continue;
+	    }
+	    if (handleExec(con, NULL, *origOptString))
+		continue;
+
+	    opt = findOption(con->options, NULL, *origOptString, &cb, 
+			     &cbData, 0);
+	    if (!opt) return POPT_ERROR_BADOPT;
+
+	    origOptString++;
+	    if (*origOptString)
+		con->os->nextCharArg = origOptString;
+	}
+
+	if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) 
+	    *((int *)opt->arg) = 1;
+	else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
+	    if (longArg) {
+		con->os->nextArg = longArg;
+	    } else if (con->os->nextCharArg) {
+		con->os->nextArg = con->os->nextCharArg;
+		con->os->nextCharArg = NULL;
+	    } else { 
+		while (con->os->next == con->os->argc && 
+		       con->os > con->optionStack)
+		    con->os--;
+		if (con->os->next == con->os->argc)
+		    return POPT_ERROR_NOARG;
+
+		con->os->nextArg = con->os->argv[con->os->next++];
+	    }
+
+	    if (opt->arg) {
+		switch (opt->argInfo & POPT_ARG_MASK) {
+		  case POPT_ARG_STRING:
+		    *((char **) opt->arg) = con->os->nextArg;
+		    break;
+
+		  case POPT_ARG_INT:
+		  case POPT_ARG_LONG:
+		    aLong = strtol(con->os->nextArg, &end, 0);
+		    if (*end) 
+			return POPT_ERROR_BADNUMBER;
+
+		    if (aLong == LONG_MIN || aLong == LONG_MAX)
+			return POPT_ERROR_OVERFLOW;
+		    if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {
+			*((long *) opt->arg) = aLong;
+		    } else {
+			if (aLong > INT_MAX || aLong < INT_MIN)
+			    return POPT_ERROR_OVERFLOW;
+			*((int *) opt->arg) =aLong;
+		    }
+		    break;
+
+		  default:
+		    fprintf(stdout, POPT_("option type (%d) not implemented in popt\n"),
+		      opt->argInfo & POPT_ARG_MASK);
+		    exit(1);
+		}
+	    }
+	}
+
+	if (cb)
+	    cb(con, POPT_CALLBACK_REASON_OPTION, opt, con->os->nextArg, cbData);
+	else if (opt->val) 
+	    done = 1;
+
+	if ((con->finalArgvCount + 2) >= (con->finalArgvAlloced)) {
+	    con->finalArgvAlloced += 10;
+	    con->finalArgv = realloc(con->finalArgv,
+			    sizeof(*con->finalArgv) * con->finalArgvAlloced);
+	}
+
+	i = con->finalArgvCount++;
+	con->finalArgv[i] = 
+		malloc((opt->longName ? strlen(opt->longName) : 0) + 3);
+	if (opt->longName)
+	    sprintf(con->finalArgv[i], "--%s", opt->longName);
+	else 
+	    sprintf(con->finalArgv[i], "-%c", opt->shortName);
+
+	if (opt->arg && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) 
+	    con->finalArgv[con->finalArgvCount++] = strdup(con->os->nextArg);
+    }
+
+    return opt->val;
+}
+
+char * poptGetOptArg(poptContext con) {
+    char * ret = con->os->nextArg;
+    con->os->nextArg = NULL;
+    return ret;
+}
+
+char * poptGetArg(poptContext con) {
+    if (con->numLeftovers == con->nextLeftover) return NULL;
+    return (con->leftovers[con->nextLeftover++]);
+}
+
+char * poptPeekArg(poptContext con) {
+    if (con->numLeftovers == con->nextLeftover) return NULL;
+    return (con->leftovers[con->nextLeftover]);
+}
+
+char ** poptGetArgs(poptContext con) {
+    if (con->numLeftovers == con->nextLeftover) return NULL;
+
+    /* some apps like [like RPM ;-) ] need this NULL terminated */
+    con->leftovers[con->numLeftovers] = NULL;
+
+    return (con->leftovers + con->nextLeftover);
+}
+
+void poptFreeContext(poptContext con) {
+    int i;
+
+    for (i = 0; i < con->numAliases; i++) {
+	if (con->aliases[i].longName) free(con->aliases[i].longName);
+	free(con->aliases[i].argv);
+    }
+
+    for (i = 0; i < con->numExecs; i++) {
+	if (con->execs[i].longName) free(con->execs[i].longName);
+	free(con->execs[i].script);
+    }
+
+    for (i = 0; i < con->finalArgvCount; i++)
+	free(con->finalArgv[i]);
+
+    free(con->leftovers);
+    free(con->finalArgv);
+    if (con->appName) free(con->appName);
+    if (con->aliases) free(con->aliases);
+    if (con->otherHelp) free(con->otherHelp);
+    free(con);
+}
+
+int poptAddAlias(poptContext con, struct poptAlias newAlias, int flags) {
+    int aliasNum = con->numAliases++;
+    struct poptAlias * alias;
+
+    /* SunOS won't realloc(NULL, ...) */
+    if (!con->aliases)
+	con->aliases = malloc(sizeof(newAlias) * con->numAliases);
+    else
+	con->aliases = realloc(con->aliases, 
+			       sizeof(newAlias) * con->numAliases);
+    alias = con->aliases + aliasNum;
+    
+    *alias = newAlias;
+    if (alias->longName)
+	alias->longName = strcpy(malloc(strlen(alias->longName) + 1), 
+				    alias->longName);
+    else
+	alias->longName = NULL;
+
+    return 0;
+}
+
+char * poptBadOption(poptContext con, int flags) {
+    struct optionStackEntry * os;
+
+    if (flags & POPT_BADOPTION_NOALIAS)
+	os = con->optionStack;
+    else
+	os = con->os;
+
+    return os->argv[os->next - 1];
+}
+
+#define POPT_ERROR_NOARG	-10
+#define POPT_ERROR_BADOPT	-11
+#define POPT_ERROR_OPTSTOODEEP	-13
+#define POPT_ERROR_BADQUOTE	-15	/* only from poptParseArgString() */
+#define POPT_ERROR_ERRNO	-16	/* only from poptParseArgString() */
+
+const char * poptStrerror(const int error) {
+    switch (error) {
+      case POPT_ERROR_NOARG:
+	return POPT_("missing argument");
+      case POPT_ERROR_BADOPT:
+	return POPT_("unknown option");
+      case POPT_ERROR_OPTSTOODEEP:
+	return POPT_("aliases nested too deeply");
+      case POPT_ERROR_BADQUOTE:
+	return POPT_("error in paramter quoting");
+      case POPT_ERROR_BADNUMBER:
+	return POPT_("invalid numeric value");
+      case POPT_ERROR_OVERFLOW:
+	return POPT_("number too large or too small");
+      case POPT_ERROR_ERRNO:
+	return strerror(errno);
+      default:
+	return POPT_("unknown error");
+    }
+}
+
+int poptStuffArgs(poptContext con, char ** argv) {
+    int i;
+
+    if ((con->os - con->optionStack) == POPT_OPTION_DEPTH)
+	return POPT_ERROR_OPTSTOODEEP;
+
+    for (i = 0; argv[i]; i++);
+
+    con->os++;
+    con->os->next = 0;
+    con->os->nextArg = con->os->nextCharArg = NULL;
+    con->os->currAlias = NULL;
+    con->os->argc = i;
+    con->os->argv = argv;
+    con->os->stuffed = 1;
+
+    return 0;
+}
+
+const char * poptGetInvocationName(poptContext con) {
+    return con->os->argv[0];
+}
diff --git a/popt/popt.h b/popt/popt.h
new file mode 100644
index 0000000..c217e1b
--- /dev/null
+++ b/popt/popt.h
@@ -0,0 +1,131 @@
+/*
+Copyright (c) 1998  Red Hat Software
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+*/
+
+#ifndef H_POPT
+#define H_POPT
+
+#include <stdio.h>			/* for FILE * */
+
+#define POPT_OPTION_DEPTH	10
+
+#define POPT_ARG_NONE		0
+#define POPT_ARG_STRING		1
+#define POPT_ARG_INT		2
+#define POPT_ARG_LONG		3
+#define POPT_ARG_INCLUDE_TABLE	4	/* arg points to table */
+#define POPT_ARG_CALLBACK	5	/* table-wide callback... must be
+					   set first in table; arg points 
+					   to callback, descrip points to 
+					   callback data to pass */
+#define POPT_ARG_MASK		0x0000FFFF
+#define POPT_ARGFLAG_ONEDASH	0x80000000  /* allow -longoption */
+#define POPT_ARGFLAG_DOC_HIDDEN 0x40000000  /* don't show in help/usage */
+#define POPT_CBFLAG_PRE		0x80000000  /* call the callback before parse */
+#define POPT_CBFLAG_POST	0x40000000  /* call the callback after parse */
+#define POPT_CBFLAG_INC_DATA	0x20000000  /* use data from the include line,
+					       not the subtable */
+
+#define POPT_ERROR_NOARG	-10
+#define POPT_ERROR_BADOPT	-11
+#define POPT_ERROR_OPTSTOODEEP	-13
+#define POPT_ERROR_BADQUOTE	-15	/* only from poptParseArgString() */
+#define POPT_ERROR_ERRNO	-16	/* only from poptParseArgString() */
+#define POPT_ERROR_BADNUMBER	-17
+#define POPT_ERROR_OVERFLOW	-18
+
+/* poptBadOption() flags */
+#define POPT_BADOPTION_NOALIAS  (1 << 0)  /* don't go into an alias */
+
+/* poptGetContext() flags */
+#define POPT_CONTEXT_NO_EXEC	(1 << 0)  /* ignore exec expansions */
+#define POPT_CONTEXT_KEEP_FIRST	(1 << 1)  /* pay attention to argv[0] */
+#define POPT_CONTEXT_POSIXMEHARDER (1 << 2) /* options can't follow args */
+
+struct poptOption {
+    const char * longName;	/* may be NULL */
+    char shortName;		/* may be '\0' */
+    int argInfo;
+    void * arg;			/* depends on argInfo */
+    int val;			/* 0 means don't return, just update flag */
+    char * descrip;		/* description for autohelp -- may be NULL */
+    char * argDescrip;		/* argument description for autohelp */
+};
+
+struct poptAlias {
+    char * longName;		/* may be NULL */
+    char shortName;		/* may be '\0' */
+    int argc;
+    char ** argv;		/* must be free()able */
+};
+
+extern struct poptOption poptHelpOptions[];
+#define POPT_AUTOHELP { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptHelpOptions, \
+			0, "Help options", NULL },
+
+typedef struct poptContext_s * poptContext;
+#ifndef __cplusplus
+typedef struct poptOption * poptOption;
+#endif
+
+enum poptCallbackReason { POPT_CALLBACK_REASON_PRE, 
+			  POPT_CALLBACK_REASON_POST,
+			  POPT_CALLBACK_REASON_OPTION };
+typedef void (*poptCallbackType)(poptContext con, 
+				 enum poptCallbackReason reason,
+			         const struct poptOption * opt,
+				 const char * arg, void * data);
+
+poptContext poptGetContext(char * name, int argc, char ** argv, 
+			   const struct poptOption * options, int flags);
+void poptResetContext(poptContext con);
+
+/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */
+int poptGetNextOpt(poptContext con);
+/* returns NULL if no argument is available */
+char * poptGetOptArg(poptContext con);
+/* returns NULL if no more options are available */
+char * poptGetArg(poptContext con);
+char * poptPeekArg(poptContext con);
+char ** poptGetArgs(poptContext con);
+/* returns the option which caused the most recent error */
+char * poptBadOption(poptContext con, int flags);
+void poptFreeContext(poptContext con);
+int poptStuffArgs(poptContext con, char ** argv);
+int poptAddAlias(poptContext con, struct poptAlias alias, int flags);
+int poptReadConfigFile(poptContext con, char * fn);
+/* like above, but reads /etc/popt and $HOME/.popt along with environment 
+   vars */
+int poptReadDefaultConfig(poptContext con, int useEnv);
+/* argv should be freed -- this allows ', ", and \ quoting, but ' is treated
+   the same as " and both may include \ quotes */
+int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr);
+const char * poptStrerror(const int error);
+void poptSetExecPath(poptContext con, const char * path, int allowAbsolute);
+void poptPrintHelp(poptContext con, FILE * f, int flags);
+void poptPrintUsage(poptContext con, FILE * f, int flags);
+void poptSetOtherOptionHelp(poptContext con, const char * text);
+const char * poptGetInvocationName(poptContext con);
+
+#endif
diff --git a/popt/poptconfig.c b/popt/poptconfig.c
new file mode 100644
index 0000000..1492dd6
--- /dev/null
+++ b/popt/poptconfig.c
@@ -0,0 +1,188 @@
+/*
+Copyright (c) 1998  Red Hat Software
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#else
+# ifdef _AIX
+#  pragma alloca
+# endif
+#endif
+
+#ifdef HAVE_MALLOC_H
+# include <malloc.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "popt.h"
+#include "poptint.h"
+
+static void configLine(poptContext con, char * line) {
+    int nameLength = strlen(con->appName);
+    char * opt;
+    struct poptAlias alias;
+    char * entryType;
+    char * longName = NULL;
+    char shortName = '\0';
+    
+    if (strncmp(line, con->appName, nameLength)) return;
+    line += nameLength;
+    if (!*line || !isspace(*line)) return;
+    while (*line && isspace(*line)) line++;
+    entryType = line;
+
+    while (!*line || !isspace(*line)) line++;
+    *line++ = '\0';
+    while (*line && isspace(*line)) line++;
+    if (!*line) return;
+    opt = line;
+
+    while (!*line || !isspace(*line)) line++;
+    *line++ = '\0';
+    while (*line && isspace(*line)) line++;
+    if (!*line) return;
+
+    if (opt[0] == '-' && opt[1] == '-')
+	longName = opt + 2;
+    else if (opt[0] == '-' && !opt[2])
+	shortName = opt[1];
+
+    if (!strcmp(entryType, "alias")) {
+	if (poptParseArgvString(line, &alias.argc, &alias.argv)) return;
+	alias.longName = longName, alias.shortName = shortName;
+	poptAddAlias(con, alias, 0);
+    }
+#ifndef _WIN32 /* exec stuff too complex to be worthwhile to port */
+      else if (!strcmp(entryType, "exec")) {
+	con->execs = realloc(con->execs, 
+				sizeof(*con->execs) * (con->numExecs + 1));
+	if (longName)
+	    con->execs[con->numExecs].longName = strdup(longName);
+	else
+	    con->execs[con->numExecs].longName = NULL;
+
+	con->execs[con->numExecs].shortName = shortName;
+	con->execs[con->numExecs].script = strdup(line);
+	
+	con->numExecs++;
+    }
+#endif /* !_WIN32 */
+}
+
+int poptReadConfigFile(poptContext con, char * fn) {
+    char * file, * chptr, * end;
+    char * buf, * dst;
+    int fd, rc;
+    int fileLength;
+
+    fd = open(fn, O_RDONLY);
+    if (fd < 0) {
+	if (errno == ENOENT)
+	    return 0;
+	else 
+	    return POPT_ERROR_ERRNO;
+    }
+
+    fileLength = lseek(fd, 0, SEEK_END);
+    lseek(fd, 0, 0);
+
+    file = alloca(fileLength + 1);
+    if ((fd = read(fd, file, fileLength)) != fileLength) {
+	rc = errno;
+	close(fd);
+	errno = rc;
+	return POPT_ERROR_ERRNO;
+    }
+    close(fd);
+
+    dst = buf = alloca(fileLength + 1);
+
+    chptr = file;
+    end = (file + fileLength);
+    while (chptr < end) {
+	switch (*chptr) {
+	  case '\n':
+	    *dst = '\0';
+	    dst = buf;
+	    while (*dst && isspace(*dst)) dst++;
+	    if (*dst && *dst != '#') {
+		configLine(con, dst);
+	    }
+	    chptr++;
+	    break;
+	  case '\\':
+	    *dst++ = *chptr++;
+	    if (chptr < end) {
+		if (*chptr == '\n') 
+		    dst--, chptr++;	
+		    /* \ at the end of a line does not insert a \n */
+		else
+		    *dst++ = *chptr++;
+	    }
+	    break;
+	  default:
+	    *dst++ = *chptr++;
+	}
+    }
+
+    return 0;
+}
+
+#ifndef _WIN32
+
+int poptReadDefaultConfig(poptContext con, int useEnv) {
+    char * fn, * home;
+    int rc;
+
+    if (!con->appName) return 0;
+
+    rc = poptReadConfigFile(con, "/etc/popt");
+    if (rc) return rc;
+    if (getuid() != geteuid()) return 0;
+
+    if ((home = getenv("HOME"))) {
+	fn = alloca(strlen(home) + 20);
+	strcpy(fn, home);
+	strcat(fn, "/.popt");
+	rc = poptReadConfigFile(con, fn);
+	if (rc) return rc;
+    }
+
+    return 0;
+}
+
+#endif /* !_WIN32 */
diff --git a/popt/popthelp.c b/popt/popthelp.c
new file mode 100644
index 0000000..1490c78
--- /dev/null
+++ b/popt/popthelp.c
@@ -0,0 +1,306 @@
+/*
+Copyright (c) 1998  Red Hat Software
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#else
+# ifdef _AIX
+#  pragma alloca
+# endif
+#endif
+
+#ifdef HAVE_MALLOC_H
+# include <malloc.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "popt.h"
+#include "poptint.h"
+
+#ifdef _WIN32
+#define SLASH '\\'
+#else
+#define SLASH '/'
+#endif
+
+static void displayArgs(poptContext con, enum poptCallbackReason foo, 
+			struct poptOption * key, 
+			const char * arg, void * data) {
+    if (key->shortName== '?')
+	poptPrintHelp(con, stdout, 0);
+    else
+	poptPrintUsage(con, stdout, 0);
+    exit(0);
+}
+
+struct poptOption poptHelpOptions[] = {
+    { NULL, '\0', POPT_ARG_CALLBACK, &displayArgs, '\0', NULL },
+    { "help", '?', 0, NULL, '?', N_("Show this help message") },
+    { "usage", '\0', 0, NULL, 'u', N_("Display brief usage message") },
+    { NULL, '\0', 0, NULL, 0 }
+} ;
+
+static const char * getArgDescrip(const struct poptOption * opt) {
+    if (!(opt->argInfo & POPT_ARG_MASK)) return NULL;
+
+    if (opt == (poptHelpOptions + 1) || opt == (poptHelpOptions + 2))
+	if (opt->argDescrip) return POPT_(opt->argDescrip);
+
+    if (opt->argDescrip) return _(opt->argDescrip);
+    return POPT_("ARG");
+}
+
+static void singleOptionHelp(FILE * f, int maxLeftCol, 
+			     const struct poptOption * opt) {
+    int indentLength = maxLeftCol + 5;
+    int lineLength = 79 - indentLength;
+    const char * help = _(opt->descrip);
+    int helpLength;
+    const char * ch;
+    char * left = alloca(maxLeftCol + 1);
+    const char * argDescrip = getArgDescrip(opt);
+
+    *left = '\0';
+    if (opt->longName && opt->shortName)
+	sprintf(left, "-%c, --%s", opt->shortName, opt->longName);
+    else if (opt->shortName) 
+	sprintf(left, "-%c", opt->shortName);
+    else if (opt->longName)
+	sprintf(left, "--%s", opt->longName);
+    if (!*left) return ;
+    if (argDescrip) {
+	strcat(left, "=");
+	strcat(left, argDescrip);
+    }
+
+    if (help)
+	fprintf(f,"  %-*s   ", maxLeftCol, left);
+    else {
+	fprintf(f,"  %s\n", left); 
+	return;
+    }
+
+    helpLength = strlen(help);
+    while (helpLength > lineLength) {
+	ch = help + lineLength - 1;
+	while (ch > help && !isspace(*ch)) ch--;
+	if (ch == help) break;		/* give up */
+	while (ch > (help + 1) && isspace(*ch)) ch--;
+	ch++;
+
+	fprintf(f, "%.*s\n%*s", (int) (ch - help), help, indentLength, " ");
+
+	help = ch;
+	while (isspace(*help) && *help) help++;
+	helpLength = strlen(help);
+    }
+
+    if (helpLength) fprintf(f, "%s\n", help);
+}
+
+static int maxArgWidth(const struct poptOption * opt) {
+    int max = 0;
+    int this;
+    const char * s;
+    
+    while (opt->longName || opt->shortName || opt->arg) {
+	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
+	    this = maxArgWidth(opt->arg);
+	    if (this > max) max = this;
+	} else if (!(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) {
+	    this = opt->shortName ? 2 : 0;
+	    if (opt->longName) {
+		if (this) this += 2;
+		this += strlen(opt->longName) + 2;
+	    }
+
+	    s = getArgDescrip(opt);
+	    if (s)
+		this += strlen(s) + 1;
+	    if (this > max) max = this;
+	}
+
+	opt++;
+    }
+    
+    return max;
+}
+
+static void singleTableHelp(FILE * f, const struct poptOption * table, 
+			    int left) {
+    const struct poptOption * opt;
+
+    opt = table;
+    while (opt->longName || opt->shortName || opt->arg) {
+	if ((opt->longName || opt->shortName) && 
+	    !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
+	    singleOptionHelp(f, left, opt);
+	opt++;
+    }
+
+    opt = table;
+    while (opt->longName || opt->shortName || opt->arg) {
+	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
+	    if (opt->descrip)
+		fprintf(f, "\n%s\n", _(opt->descrip));
+	    singleTableHelp(f, opt->arg, left);
+	}
+	opt++;
+    }
+}
+
+static int showHelpIntro(poptContext con, FILE * f) {
+    int len = 6;
+    char * fn;
+
+    fprintf(f, POPT_("Usage:"));
+    if (!(con->flags & POPT_CONTEXT_KEEP_FIRST)) {
+	fn = con->optionStack->argv[0];
+	if (strchr(fn, SLASH)) fn = strchr(fn, SLASH) + 1;
+	fprintf(f, " %s", fn);
+	len += strlen(fn) + 1;
+    }
+
+    return len;
+}
+
+void poptPrintHelp(poptContext con, FILE * f, int flags) {
+    int leftColWidth;
+
+    showHelpIntro(con, f);
+    if (con->otherHelp)
+	fprintf(f, " %s", con->otherHelp);
+    else
+	fprintf(f, " %s", POPT_("[OPTION...]"));
+
+    fprintf(f, " [LIBRARIES]\n");
+    leftColWidth = maxArgWidth(con->options);
+    singleTableHelp(f, con->options, leftColWidth);
+}
+
+static int singleOptionUsage(FILE * f, int cursor, 
+			      const struct poptOption * opt) {
+    int len = 3;
+    char shortStr[2];
+    const char * item = shortStr;
+    const char * argDescrip = getArgDescrip(opt);
+
+    if (opt->shortName) {
+	if (!(opt->argInfo & POPT_ARG_MASK)) 
+	    return cursor;	/* we did these already */
+	len++;
+	*shortStr = opt->shortName;
+	shortStr[1] = '\0';
+    } else if (opt->longName) {
+	len += 1 + strlen(opt->longName);
+	item = opt->longName;
+    }
+
+    if (len == 3) return cursor;
+
+    if (argDescrip) 
+	len += strlen(argDescrip) + 1;
+
+    if ((cursor + len) > 79) {
+	fprintf(f, "\n       ");
+	cursor = 7;
+    } 
+
+    fprintf(f, " [-%s%s%s%s]", opt->shortName ? "" : "-", item,
+	    argDescrip ? (opt->shortName ? " " : "=") : "",
+	    argDescrip ? argDescrip : "");
+
+    return cursor + len + 1;
+}
+
+int singleTableUsage(FILE * f, int cursor, const struct poptOption * table) {
+    const struct poptOption * opt;
+    
+    opt = table;
+    while (opt->longName || opt->shortName || opt->arg) {
+	if ((opt->longName || opt->shortName) && 
+	    !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
+	    cursor = singleOptionUsage(f, cursor, opt);
+	else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) 
+	    cursor = singleTableUsage(f, cursor, opt->arg);
+	opt++;
+    }
+
+    return cursor;
+}
+
+static int showShortOptions(const struct poptOption * opt, FILE * f, 
+			    char * str) {
+    char s[300];		/* this is larger then the ascii set, so
+				   it should do just fine */
+
+    if (!str) {
+	str = s;
+	memset(str, 0, sizeof(str));
+    }
+
+    while (opt->longName || opt->shortName || opt->arg) {
+	if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK))
+	    str[strlen(str)] = opt->shortName;
+	else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE)
+	    showShortOptions(opt->arg, f, str);
+
+	opt++;
+    } 
+
+    if (s != str || !*s)
+	return 0;
+
+    fprintf(f, " [-%s]", s);
+    return strlen(s) + 4;
+}
+
+void poptPrintUsage(poptContext con, FILE * f, int flags) {
+    int cursor;
+
+    cursor = showHelpIntro(con, f);
+    cursor += showShortOptions(con->options, f, NULL);
+    singleTableUsage(f, cursor, con->options);
+
+    if (con->otherHelp) {
+	cursor += strlen(con->otherHelp) + 1;
+	if (cursor > 79) fprintf(f, "\n       ");
+	fprintf(f, " %s", con->otherHelp);
+    }
+    fprintf(f, "\n        [LIBRARIES]\n");
+}
+
+void poptSetOtherOptionHelp(poptContext con, const char * text) {
+    if (con->otherHelp) free(con->otherHelp);
+    con->otherHelp = strdup(text);
+}
diff --git a/popt/poptint.h b/popt/poptint.h
new file mode 100644
index 0000000..44931d4
--- /dev/null
+++ b/popt/poptint.h
@@ -0,0 +1,85 @@
+/*
+Copyright (c) 1998  Red Hat Software
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+*/
+
+#ifndef H_POPTINT
+#define H_POPTINT
+
+struct optionStackEntry {
+    int argc;
+    char ** argv;
+    int next;
+    char * nextArg;
+    char * nextCharArg;
+    struct poptAlias * currAlias;
+    int stuffed;
+};
+
+struct execEntry {
+    char * longName;
+    char shortName;
+    char * script;
+};
+
+struct poptContext_s {
+    struct optionStackEntry optionStack[POPT_OPTION_DEPTH], * os;
+    char ** leftovers;
+    int numLeftovers;
+    int nextLeftover;
+    const struct poptOption * options;
+    int restLeftover;
+    char * appName;
+    struct poptAlias * aliases;
+    int numAliases;
+    int flags;
+    struct execEntry * execs;
+    int numExecs;
+    char ** finalArgv;
+    int finalArgvCount;
+    int finalArgvAlloced;
+    struct execEntry * doExec;
+    char * execPath;
+    int execAbsolute;
+    char * otherHelp;
+};
+
+#ifdef HAVE_LIBINTL_H
+#include <libintl.h>
+#endif
+
+#ifdef HAVE_GETTEXT
+#define _(foo) gettext(foo)
+#else
+#define _(foo) (foo)
+#endif
+
+#ifdef HAVE_DGETTEXT
+#define POPT_(foo) dgettext("popt", foo)
+#else
+#define POPT_(foo) (foo)
+#endif
+
+#define N_(foo) (foo)
+
+#endif
diff --git a/popt/poptparse.c b/popt/poptparse.c
new file mode 100644
index 0000000..18087fb
--- /dev/null
+++ b/popt/poptparse.c
@@ -0,0 +1,126 @@
+/*
+Copyright (c) 1998  Red Hat Software
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#else
+# ifdef _AIX
+#  pragma alloca
+# endif
+#endif
+
+#ifdef HAVE_MALLOC_H
+# include <malloc.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "popt.h"
+
+int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr) {
+    char * buf = strcpy(alloca(strlen(s) + 1), s);
+    char * bufStart = buf;
+    char * src, * dst;
+    char quote = '\0';
+    int argvAlloced = 5;
+    char ** argv = malloc(sizeof(*argv) * argvAlloced);
+    char ** argv2;
+    int argc = 0;
+    int i;
+
+    src = s;
+    dst = buf;
+    argv[argc] = buf;
+
+    memset(buf, '\0', strlen(s) + 1);
+
+    while (*src) {
+	if (quote == *src) {
+	    quote = '\0';
+	} else if (quote) {
+	    if (*src == '\\') {
+		src++;
+		if (!*src) {
+		    free(argv);
+		    return POPT_ERROR_BADQUOTE;
+		}
+		if (*src != quote) *buf++ = '\\';
+	    }
+	    *buf++ = *src;
+	} else if (isspace(*src)) {
+	    if (*argv[argc]) {
+		buf++, argc++;
+		if (argc == argvAlloced) {
+		    argvAlloced += 5;
+		    argv = realloc(argv, sizeof(*argv) * argvAlloced);
+		}
+		argv[argc] = buf;
+	    }
+	} else switch (*src) {
+	  case '"':
+	  case '\'':
+	    quote = *src;
+	    break;
+	  case '\\':
+	    src++;
+	    if (!*src) {
+		free(argv);
+		return POPT_ERROR_BADQUOTE;
+	    }
+	    /* fallthrough */
+	  default:
+	    *buf++ = *src;
+	}
+
+	src++;
+    }
+
+    if (strlen(argv[argc])) {
+	argc++, buf++;
+    }
+
+    dst = malloc(argc * sizeof(*argv) + (buf - bufStart));
+    argv2 = (void *) dst;
+    dst += argc * sizeof(*argv);
+    memcpy(argv2, argv, argc * sizeof(*argv));
+    memcpy(dst, bufStart, buf - bufStart);
+
+    for (i = 0; i < argc; i++) {
+	argv2[i] = dst + (argv[i] - bufStart);
+    }
+
+    free(argv);
+
+    *argvPtr = argv2;
+    *argcPtr = argc;
+
+    return 0;
+}
diff --git a/poptconfig.c b/poptconfig.c
deleted file mode 100644
index 1492dd6..0000000
--- a/poptconfig.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
-Copyright (c) 1998  Red Hat Software
- 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
- 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
- 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- 
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#else
-# ifdef _AIX
-#  pragma alloca
-# endif
-#endif
-
-#ifdef HAVE_MALLOC_H
-# include <malloc.h>
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "popt.h"
-#include "poptint.h"
-
-static void configLine(poptContext con, char * line) {
-    int nameLength = strlen(con->appName);
-    char * opt;
-    struct poptAlias alias;
-    char * entryType;
-    char * longName = NULL;
-    char shortName = '\0';
-    
-    if (strncmp(line, con->appName, nameLength)) return;
-    line += nameLength;
-    if (!*line || !isspace(*line)) return;
-    while (*line && isspace(*line)) line++;
-    entryType = line;
-
-    while (!*line || !isspace(*line)) line++;
-    *line++ = '\0';
-    while (*line && isspace(*line)) line++;
-    if (!*line) return;
-    opt = line;
-
-    while (!*line || !isspace(*line)) line++;
-    *line++ = '\0';
-    while (*line && isspace(*line)) line++;
-    if (!*line) return;
-
-    if (opt[0] == '-' && opt[1] == '-')
-	longName = opt + 2;
-    else if (opt[0] == '-' && !opt[2])
-	shortName = opt[1];
-
-    if (!strcmp(entryType, "alias")) {
-	if (poptParseArgvString(line, &alias.argc, &alias.argv)) return;
-	alias.longName = longName, alias.shortName = shortName;
-	poptAddAlias(con, alias, 0);
-    }
-#ifndef _WIN32 /* exec stuff too complex to be worthwhile to port */
-      else if (!strcmp(entryType, "exec")) {
-	con->execs = realloc(con->execs, 
-				sizeof(*con->execs) * (con->numExecs + 1));
-	if (longName)
-	    con->execs[con->numExecs].longName = strdup(longName);
-	else
-	    con->execs[con->numExecs].longName = NULL;
-
-	con->execs[con->numExecs].shortName = shortName;
-	con->execs[con->numExecs].script = strdup(line);
-	
-	con->numExecs++;
-    }
-#endif /* !_WIN32 */
-}
-
-int poptReadConfigFile(poptContext con, char * fn) {
-    char * file, * chptr, * end;
-    char * buf, * dst;
-    int fd, rc;
-    int fileLength;
-
-    fd = open(fn, O_RDONLY);
-    if (fd < 0) {
-	if (errno == ENOENT)
-	    return 0;
-	else 
-	    return POPT_ERROR_ERRNO;
-    }
-
-    fileLength = lseek(fd, 0, SEEK_END);
-    lseek(fd, 0, 0);
-
-    file = alloca(fileLength + 1);
-    if ((fd = read(fd, file, fileLength)) != fileLength) {
-	rc = errno;
-	close(fd);
-	errno = rc;
-	return POPT_ERROR_ERRNO;
-    }
-    close(fd);
-
-    dst = buf = alloca(fileLength + 1);
-
-    chptr = file;
-    end = (file + fileLength);
-    while (chptr < end) {
-	switch (*chptr) {
-	  case '\n':
-	    *dst = '\0';
-	    dst = buf;
-	    while (*dst && isspace(*dst)) dst++;
-	    if (*dst && *dst != '#') {
-		configLine(con, dst);
-	    }
-	    chptr++;
-	    break;
-	  case '\\':
-	    *dst++ = *chptr++;
-	    if (chptr < end) {
-		if (*chptr == '\n') 
-		    dst--, chptr++;	
-		    /* \ at the end of a line does not insert a \n */
-		else
-		    *dst++ = *chptr++;
-	    }
-	    break;
-	  default:
-	    *dst++ = *chptr++;
-	}
-    }
-
-    return 0;
-}
-
-#ifndef _WIN32
-
-int poptReadDefaultConfig(poptContext con, int useEnv) {
-    char * fn, * home;
-    int rc;
-
-    if (!con->appName) return 0;
-
-    rc = poptReadConfigFile(con, "/etc/popt");
-    if (rc) return rc;
-    if (getuid() != geteuid()) return 0;
-
-    if ((home = getenv("HOME"))) {
-	fn = alloca(strlen(home) + 20);
-	strcpy(fn, home);
-	strcat(fn, "/.popt");
-	rc = poptReadConfigFile(con, fn);
-	if (rc) return rc;
-    }
-
-    return 0;
-}
-
-#endif /* !_WIN32 */
diff --git a/popthelp.c b/popthelp.c
deleted file mode 100644
index 1490c78..0000000
--- a/popthelp.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
-Copyright (c) 1998  Red Hat Software
- 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
- 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
- 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- 
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#else
-# ifdef _AIX
-#  pragma alloca
-# endif
-#endif
-
-#ifdef HAVE_MALLOC_H
-# include <malloc.h>
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "popt.h"
-#include "poptint.h"
-
-#ifdef _WIN32
-#define SLASH '\\'
-#else
-#define SLASH '/'
-#endif
-
-static void displayArgs(poptContext con, enum poptCallbackReason foo, 
-			struct poptOption * key, 
-			const char * arg, void * data) {
-    if (key->shortName== '?')
-	poptPrintHelp(con, stdout, 0);
-    else
-	poptPrintUsage(con, stdout, 0);
-    exit(0);
-}
-
-struct poptOption poptHelpOptions[] = {
-    { NULL, '\0', POPT_ARG_CALLBACK, &displayArgs, '\0', NULL },
-    { "help", '?', 0, NULL, '?', N_("Show this help message") },
-    { "usage", '\0', 0, NULL, 'u', N_("Display brief usage message") },
-    { NULL, '\0', 0, NULL, 0 }
-} ;
-
-static const char * getArgDescrip(const struct poptOption * opt) {
-    if (!(opt->argInfo & POPT_ARG_MASK)) return NULL;
-
-    if (opt == (poptHelpOptions + 1) || opt == (poptHelpOptions + 2))
-	if (opt->argDescrip) return POPT_(opt->argDescrip);
-
-    if (opt->argDescrip) return _(opt->argDescrip);
-    return POPT_("ARG");
-}
-
-static void singleOptionHelp(FILE * f, int maxLeftCol, 
-			     const struct poptOption * opt) {
-    int indentLength = maxLeftCol + 5;
-    int lineLength = 79 - indentLength;
-    const char * help = _(opt->descrip);
-    int helpLength;
-    const char * ch;
-    char * left = alloca(maxLeftCol + 1);
-    const char * argDescrip = getArgDescrip(opt);
-
-    *left = '\0';
-    if (opt->longName && opt->shortName)
-	sprintf(left, "-%c, --%s", opt->shortName, opt->longName);
-    else if (opt->shortName) 
-	sprintf(left, "-%c", opt->shortName);
-    else if (opt->longName)
-	sprintf(left, "--%s", opt->longName);
-    if (!*left) return ;
-    if (argDescrip) {
-	strcat(left, "=");
-	strcat(left, argDescrip);
-    }
-
-    if (help)
-	fprintf(f,"  %-*s   ", maxLeftCol, left);
-    else {
-	fprintf(f,"  %s\n", left); 
-	return;
-    }
-
-    helpLength = strlen(help);
-    while (helpLength > lineLength) {
-	ch = help + lineLength - 1;
-	while (ch > help && !isspace(*ch)) ch--;
-	if (ch == help) break;		/* give up */
-	while (ch > (help + 1) && isspace(*ch)) ch--;
-	ch++;
-
-	fprintf(f, "%.*s\n%*s", (int) (ch - help), help, indentLength, " ");
-
-	help = ch;
-	while (isspace(*help) && *help) help++;
-	helpLength = strlen(help);
-    }
-
-    if (helpLength) fprintf(f, "%s\n", help);
-}
-
-static int maxArgWidth(const struct poptOption * opt) {
-    int max = 0;
-    int this;
-    const char * s;
-    
-    while (opt->longName || opt->shortName || opt->arg) {
-	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
-	    this = maxArgWidth(opt->arg);
-	    if (this > max) max = this;
-	} else if (!(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) {
-	    this = opt->shortName ? 2 : 0;
-	    if (opt->longName) {
-		if (this) this += 2;
-		this += strlen(opt->longName) + 2;
-	    }
-
-	    s = getArgDescrip(opt);
-	    if (s)
-		this += strlen(s) + 1;
-	    if (this > max) max = this;
-	}
-
-	opt++;
-    }
-    
-    return max;
-}
-
-static void singleTableHelp(FILE * f, const struct poptOption * table, 
-			    int left) {
-    const struct poptOption * opt;
-
-    opt = table;
-    while (opt->longName || opt->shortName || opt->arg) {
-	if ((opt->longName || opt->shortName) && 
-	    !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
-	    singleOptionHelp(f, left, opt);
-	opt++;
-    }
-
-    opt = table;
-    while (opt->longName || opt->shortName || opt->arg) {
-	if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
-	    if (opt->descrip)
-		fprintf(f, "\n%s\n", _(opt->descrip));
-	    singleTableHelp(f, opt->arg, left);
-	}
-	opt++;
-    }
-}
-
-static int showHelpIntro(poptContext con, FILE * f) {
-    int len = 6;
-    char * fn;
-
-    fprintf(f, POPT_("Usage:"));
-    if (!(con->flags & POPT_CONTEXT_KEEP_FIRST)) {
-	fn = con->optionStack->argv[0];
-	if (strchr(fn, SLASH)) fn = strchr(fn, SLASH) + 1;
-	fprintf(f, " %s", fn);
-	len += strlen(fn) + 1;
-    }
-
-    return len;
-}
-
-void poptPrintHelp(poptContext con, FILE * f, int flags) {
-    int leftColWidth;
-
-    showHelpIntro(con, f);
-    if (con->otherHelp)
-	fprintf(f, " %s", con->otherHelp);
-    else
-	fprintf(f, " %s", POPT_("[OPTION...]"));
-
-    fprintf(f, " [LIBRARIES]\n");
-    leftColWidth = maxArgWidth(con->options);
-    singleTableHelp(f, con->options, leftColWidth);
-}
-
-static int singleOptionUsage(FILE * f, int cursor, 
-			      const struct poptOption * opt) {
-    int len = 3;
-    char shortStr[2];
-    const char * item = shortStr;
-    const char * argDescrip = getArgDescrip(opt);
-
-    if (opt->shortName) {
-	if (!(opt->argInfo & POPT_ARG_MASK)) 
-	    return cursor;	/* we did these already */
-	len++;
-	*shortStr = opt->shortName;
-	shortStr[1] = '\0';
-    } else if (opt->longName) {
-	len += 1 + strlen(opt->longName);
-	item = opt->longName;
-    }
-
-    if (len == 3) return cursor;
-
-    if (argDescrip) 
-	len += strlen(argDescrip) + 1;
-
-    if ((cursor + len) > 79) {
-	fprintf(f, "\n       ");
-	cursor = 7;
-    } 
-
-    fprintf(f, " [-%s%s%s%s]", opt->shortName ? "" : "-", item,
-	    argDescrip ? (opt->shortName ? " " : "=") : "",
-	    argDescrip ? argDescrip : "");
-
-    return cursor + len + 1;
-}
-
-int singleTableUsage(FILE * f, int cursor, const struct poptOption * table) {
-    const struct poptOption * opt;
-    
-    opt = table;
-    while (opt->longName || opt->shortName || opt->arg) {
-	if ((opt->longName || opt->shortName) && 
-	    !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
-	    cursor = singleOptionUsage(f, cursor, opt);
-	else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) 
-	    cursor = singleTableUsage(f, cursor, opt->arg);
-	opt++;
-    }
-
-    return cursor;
-}
-
-static int showShortOptions(const struct poptOption * opt, FILE * f, 
-			    char * str) {
-    char s[300];		/* this is larger then the ascii set, so
-				   it should do just fine */
-
-    if (!str) {
-	str = s;
-	memset(str, 0, sizeof(str));
-    }
-
-    while (opt->longName || opt->shortName || opt->arg) {
-	if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK))
-	    str[strlen(str)] = opt->shortName;
-	else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE)
-	    showShortOptions(opt->arg, f, str);
-
-	opt++;
-    } 
-
-    if (s != str || !*s)
-	return 0;
-
-    fprintf(f, " [-%s]", s);
-    return strlen(s) + 4;
-}
-
-void poptPrintUsage(poptContext con, FILE * f, int flags) {
-    int cursor;
-
-    cursor = showHelpIntro(con, f);
-    cursor += showShortOptions(con->options, f, NULL);
-    singleTableUsage(f, cursor, con->options);
-
-    if (con->otherHelp) {
-	cursor += strlen(con->otherHelp) + 1;
-	if (cursor > 79) fprintf(f, "\n       ");
-	fprintf(f, " %s", con->otherHelp);
-    }
-    fprintf(f, "\n        [LIBRARIES]\n");
-}
-
-void poptSetOtherOptionHelp(poptContext con, const char * text) {
-    if (con->otherHelp) free(con->otherHelp);
-    con->otherHelp = strdup(text);
-}
diff --git a/poptint.h b/poptint.h
deleted file mode 100644
index 44931d4..0000000
--- a/poptint.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-Copyright (c) 1998  Red Hat Software
- 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
- 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
- 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- 
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-*/
-
-#ifndef H_POPTINT
-#define H_POPTINT
-
-struct optionStackEntry {
-    int argc;
-    char ** argv;
-    int next;
-    char * nextArg;
-    char * nextCharArg;
-    struct poptAlias * currAlias;
-    int stuffed;
-};
-
-struct execEntry {
-    char * longName;
-    char shortName;
-    char * script;
-};
-
-struct poptContext_s {
-    struct optionStackEntry optionStack[POPT_OPTION_DEPTH], * os;
-    char ** leftovers;
-    int numLeftovers;
-    int nextLeftover;
-    const struct poptOption * options;
-    int restLeftover;
-    char * appName;
-    struct poptAlias * aliases;
-    int numAliases;
-    int flags;
-    struct execEntry * execs;
-    int numExecs;
-    char ** finalArgv;
-    int finalArgvCount;
-    int finalArgvAlloced;
-    struct execEntry * doExec;
-    char * execPath;
-    int execAbsolute;
-    char * otherHelp;
-};
-
-#ifdef HAVE_LIBINTL_H
-#include <libintl.h>
-#endif
-
-#ifdef HAVE_GETTEXT
-#define _(foo) gettext(foo)
-#else
-#define _(foo) (foo)
-#endif
-
-#ifdef HAVE_DGETTEXT
-#define POPT_(foo) dgettext("popt", foo)
-#else
-#define POPT_(foo) (foo)
-#endif
-
-#define N_(foo) (foo)
-
-#endif
diff --git a/poptparse.c b/poptparse.c
deleted file mode 100644
index 18087fb..0000000
--- a/poptparse.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-Copyright (c) 1998  Red Hat Software
- 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
- 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
- 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- 
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#else
-# ifdef _AIX
-#  pragma alloca
-# endif
-#endif
-
-#ifdef HAVE_MALLOC_H
-# include <malloc.h>
-#endif
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "popt.h"
-
-int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr) {
-    char * buf = strcpy(alloca(strlen(s) + 1), s);
-    char * bufStart = buf;
-    char * src, * dst;
-    char quote = '\0';
-    int argvAlloced = 5;
-    char ** argv = malloc(sizeof(*argv) * argvAlloced);
-    char ** argv2;
-    int argc = 0;
-    int i;
-
-    src = s;
-    dst = buf;
-    argv[argc] = buf;
-
-    memset(buf, '\0', strlen(s) + 1);
-
-    while (*src) {
-	if (quote == *src) {
-	    quote = '\0';
-	} else if (quote) {
-	    if (*src == '\\') {
-		src++;
-		if (!*src) {
-		    free(argv);
-		    return POPT_ERROR_BADQUOTE;
-		}
-		if (*src != quote) *buf++ = '\\';
-	    }
-	    *buf++ = *src;
-	} else if (isspace(*src)) {
-	    if (*argv[argc]) {
-		buf++, argc++;
-		if (argc == argvAlloced) {
-		    argvAlloced += 5;
-		    argv = realloc(argv, sizeof(*argv) * argvAlloced);
-		}
-		argv[argc] = buf;
-	    }
-	} else switch (*src) {
-	  case '"':
-	  case '\'':
-	    quote = *src;
-	    break;
-	  case '\\':
-	    src++;
-	    if (!*src) {
-		free(argv);
-		return POPT_ERROR_BADQUOTE;
-	    }
-	    /* fallthrough */
-	  default:
-	    *buf++ = *src;
-	}
-
-	src++;
-    }
-
-    if (strlen(argv[argc])) {
-	argc++, buf++;
-    }
-
-    dst = malloc(argc * sizeof(*argv) + (buf - bufStart));
-    argv2 = (void *) dst;
-    dst += argc * sizeof(*argv);
-    memcpy(argv2, argv, argc * sizeof(*argv));
-    memcpy(dst, bufStart, buf - bufStart);
-
-    for (i = 0; i < argc; i++) {
-	argv2[i] = dst + (argv[i] - bufStart);
-    }
-
-    free(argv);
-
-    *argvPtr = argv2;
-    *argcPtr = argc;
-
-    return 0;
-}
-- 
1.6.6.1



More information about the pkg-config mailing list