diff options
author | Erik Troan <ewt@src.gnome.org> | 1998-09-27 15:56:18 +0000 |
---|---|---|
committer | Erik Troan <ewt@src.gnome.org> | 1998-09-27 15:56:18 +0000 |
commit | d38f4f030efc6a68420e683a749756f1e338bef4 (patch) | |
tree | f6bd0b337a2860a1e9cb662dcf0a04eb4744d8db /support/poptparse.c | |
parent | 7e8d04d2ac6e9b8015a0e299ce7a7fcf27afc963 (diff) | |
download | shared-mime-info-d38f4f030efc6a68420e683a749756f1e338bef4.tar.gz |
1) modified test to display callback val field
2) split popt stuff into multiple iles
svn path=/trunk/; revision=412
Diffstat (limited to 'support/poptparse.c')
-rw-r--r-- | support/poptparse.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/support/poptparse.c b/support/poptparse.c new file mode 100644 index 00000000..ade5a791 --- /dev/null +++ b/support/poptparse.c @@ -0,0 +1,85 @@ +#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; +} |