|
Mixe for Privacy and Anonymity in the Internet
|
#include "../StdAfx.h"Go to the source code of this file.
Defines | |
| #define | POPT_ARGV_ARRAY_GROW_DELTA 5 |
Functions | |
| int | poptDupArgv (int argc, const char **argv, int *argcPtr, const char ***argvPtr) |
| int | poptParseArgvString (const char *s, int *argcPtr, const char ***argvPtr) |
| #define POPT_ARGV_ARRAY_GROW_DELTA 5 |
Definition at line 8 of file poptparse.cpp.
Referenced by poptParseArgvString().
| int poptDupArgv | ( | int | argc, |
| const char ** | argv, | ||
| int * | argcPtr, | ||
| const char *** | argvPtr | ||
| ) |
Definition at line 10 of file poptparse.cpp.
References POPT_ERROR_NOARG.
Referenced by poptParseArgvString(), and poptStuffArgs().
{
size_t nb = (argc + 1) * sizeof(*argv);
const char ** argv2;
char * dst;
int i;
for (i = 0; i < argc; i++) {
if (argv[i] == NULL)
return POPT_ERROR_NOARG;
nb += strlen(argv[i]) + 1;
}
dst = (char *)malloc(nb);
argv2 = (const char**) dst;
dst += (argc + 1) * sizeof(*argv);
for (i = 0; i < argc; i++) {
argv2[i] = dst;
dst += strlen(strcpy(dst, argv[i])) + 1;
}
argv2[argc] = NULL;
*argvPtr = argv2;
*argcPtr = argc;
return 0;
}
| int poptParseArgvString | ( | const char * | s, |
| int * | argcPtr, | ||
| const char *** | argvPtr | ||
| ) |
Definition at line 39 of file poptparse.cpp.
References alloca(), POPT_ARGV_ARRAY_GROW_DELTA, POPT_ERROR_BADQUOTE, and poptDupArgv().
{
const char * src;
char quote = '\0';
int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
const char ** argv = (const char **)malloc(sizeof(*argv) * argvAlloced);
int argc = 0;
int buflen = strlen(s) + 1;
char * buf = (char*)memset(alloca(buflen), 0, buflen);
argv[argc] = buf;
for (src = s; *src; src++) {
if (quote == *src) {
quote = '\0';
} else if (quote) {
if (*src == '\\') {
src++;
if (!*src) {
free((void*)argv);
return POPT_ERROR_BADQUOTE;
}
if (*src != quote) *buf++ = '\\';
}
*buf++ = *src;
} else if (isspace(*src)) {
if (*argv[argc]) {
buf++, argc++;
if (argc == argvAlloced) {
argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
argv = (const char**)realloc((void*)argv, sizeof(*argv) * argvAlloced);
}
argv[argc] = buf;
}
} else switch (*src) {
case '"':
case '\'':
quote = *src;
break;
case '\\':
src++;
if (!*src) {
free((void*)argv);
return POPT_ERROR_BADQUOTE;
}
/*@fallthrough@*/
default:
*buf++ = *src;
break;
}
}
if (strlen(argv[argc])) {
argc++, buf++;
}
(void) poptDupArgv(argc, argv, argcPtr, argvPtr);
free((void*)argv);
return 0;
}
1.7.6.1