summaryrefslogtreecommitdiff
path: root/support/poptparse.c
diff options
context:
space:
mode:
authorErik Troan <ewt@src.gnome.org>1998-09-27 15:56:18 +0000
committerErik Troan <ewt@src.gnome.org>1998-09-27 15:56:18 +0000
commitd38f4f030efc6a68420e683a749756f1e338bef4 (patch)
treef6bd0b337a2860a1e9cb662dcf0a04eb4744d8db /support/poptparse.c
parent7e8d04d2ac6e9b8015a0e299ce7a7fcf27afc963 (diff)
downloadshared-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.c85
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;
+}