diff options
author | Carlos Perelló MarÃn <carlos@gnome.org> | 2003-10-19 16:10:32 +0000 |
---|---|---|
committer | Carlos Perelló Marín <carlos@src.gnome.org> | 2003-10-19 16:10:32 +0000 |
commit | e08096f464bc32e1695493d23a72da9e58b14b61 (patch) | |
tree | acb8e9155b51036faffecfea60d99fc6aca1682f /support/poptparse.c | |
parent | ad87f865578a31c085b031ec46808f057949a671 (diff) | |
download | shared-mime-info-e08096f464bc32e1695493d23a72da9e58b14b61.tar.gz |
libgtop-GNOME-2-0-branch moved to HEAD.
2003-10-19 Carlos Perelló MarÃn <carlos@gnome.org>
* libgtop-GNOME-2-0-branch moved to HEAD.
svn path=/trunk/; revision=3059
Diffstat (limited to 'support/poptparse.c')
-rw-r--r-- | support/poptparse.c | 105 |
1 files changed, 50 insertions, 55 deletions
diff --git a/support/poptparse.c b/support/poptparse.c index 65c948b6..fa708155 100644 --- a/support/poptparse.c +++ b/support/poptparse.c @@ -2,53 +2,53 @@ file accompanying popt source distributions, available from ftp://ftp.redhat.com/pub/code/popt */ -#include "system.h" -#include "poptint.h" - -#define POPT_ARGV_ARRAY_GROW_DELTA 5 - -int poptDupArgv(int argc, const char **argv, - int * argcPtr, const char *** argvPtr) -{ - size_t nb = (argc + 1) * sizeof(*argv); - const char ** argv2; - char * dst; - int i; +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif - for (i = 0; i < argc; i++) { - if (argv[i] == NULL) - return POPT_ERROR_NOARG; - nb += strlen(argv[i]) + 1; - } - - dst = malloc(nb); - argv2 = (void *) dst; - dst += (argc + 1) * sizeof(*argv); +#include <ctype.h> +#include <stdlib.h> +#include <string.h> + +/* AIX requires this to be the first thing in the file. */ +#ifndef __GNUC__ +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX +#pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +#elif defined(__GNUC__) && defined(__STRICT_ANSI__) +#define alloca __builtin_alloca +#endif - for (i = 0; i < argc; i++) { - argv2[i] = dst; - dst += strlen(strcpy(dst, argv[i])) + 1; - } - argv2[argc] = NULL; +#include "popt-gnome.h" - *argvPtr = argv2; - *argcPtr = argc; - return 0; -} +#define POPT_ARGV_ARRAY_GROW_DELTA 5 -int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) -{ +int poptParseArgvString(const char * s, int * argcPtr, char *** argvPtr) { + char * buf, * bufStart, * dst; const char * src; char quote = '\0'; int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA; - const char ** argv = malloc(sizeof(*argv) * argvAlloced); + char ** argv = malloc(sizeof(*argv) * argvAlloced); + const char ** argv2; int argc = 0; - int buflen = strlen(s) + 1; - char * buf = memset(alloca(buflen), 0, buflen); + int i, buflen; + + buflen = strlen(s) + 1; + bufStart = buf = alloca(buflen); + memset(buf, '\0', buflen); + src = s; argv[argc] = buf; - for (src = s; *src; src++) { + while (*src) { if (quote == *src) { quote = '\0'; } else if (quote) { @@ -81,38 +81,33 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) free(argv); return POPT_ERROR_BADQUOTE; } - /*@fallthrough@*/ + /* fallthrough */ default: *buf++ = *src; - break; } + + src++; } if (strlen(argv[argc])) { argc++, buf++; } -#if 0 - { char * dst = malloc((argc + 1) * sizeof(*argv) + (buf - argv[0])); - const char ** argv2 = (void *) dst; - int i; - - dst += (argc + 1) * sizeof(*argv); - memcpy(argv2, argv, argc * sizeof(*argv)); - argv2[argc] = NULL; - memcpy(dst, argv[0], buf - argv[0]); - - for (i = 0; i < argc; i++) - argv2[i] = dst + (argv[i] - argv[0]); + dst = malloc((argc + 1) * sizeof(*argv) + (buf - bufStart)); + argv2 = (void *) dst; + dst += (argc + 1) * sizeof(*argv); + memcpy(argv2, argv, argc * sizeof(*argv)); + argv2[argc] = NULL; + memcpy(dst, bufStart, buf - bufStart); - *argvPtr = argv2; - *argcPtr = argc; + for (i = 0; i < argc; i++) { + argv2[i] = dst + (argv[i] - bufStart); } -#else - (void) poptDupArgv(argc, argv, argcPtr, argvPtr); -#endif free(argv); + *argvPtr = (char **)argv2; /* XXX don't change the API */ + *argcPtr = argc; + return 0; } |