|
Mixe for Privacy and Anonymity in the Internet
|
00001 /* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING 00002 file accompanying popt source distributions, available from 00003 ftp://ftp.redhat.com/pub/code/popt */ 00004 00005 #include "../StdAfx.h" 00006 //#include "system.h" 00007 //#include "popt.h" 00008 #define POPT_ARGV_ARRAY_GROW_DELTA 5 00009 00010 int poptDupArgv(int argc, const char **argv, 00011 int * argcPtr, const char *** argvPtr) 00012 { 00013 size_t nb = (argc + 1) * sizeof(*argv); 00014 const char ** argv2; 00015 char * dst; 00016 int i; 00017 00018 for (i = 0; i < argc; i++) { 00019 if (argv[i] == NULL) 00020 return POPT_ERROR_NOARG; 00021 nb += strlen(argv[i]) + 1; 00022 } 00023 00024 dst = (char *)malloc(nb); 00025 argv2 = (const char**) dst; 00026 dst += (argc + 1) * sizeof(*argv); 00027 00028 for (i = 0; i < argc; i++) { 00029 argv2[i] = dst; 00030 dst += strlen(strcpy(dst, argv[i])) + 1; 00031 } 00032 argv2[argc] = NULL; 00033 00034 *argvPtr = argv2; 00035 *argcPtr = argc; 00036 return 0; 00037 } 00038 00039 int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) 00040 { 00041 const char * src; 00042 char quote = '\0'; 00043 int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA; 00044 const char ** argv = (const char **)malloc(sizeof(*argv) * argvAlloced); 00045 int argc = 0; 00046 int buflen = strlen(s) + 1; 00047 char * buf = (char*)memset(alloca(buflen), 0, buflen); 00048 00049 argv[argc] = buf; 00050 00051 for (src = s; *src; src++) { 00052 if (quote == *src) { 00053 quote = '\0'; 00054 } else if (quote) { 00055 if (*src == '\\') { 00056 src++; 00057 if (!*src) { 00058 free((void*)argv); 00059 return POPT_ERROR_BADQUOTE; 00060 } 00061 if (*src != quote) *buf++ = '\\'; 00062 } 00063 *buf++ = *src; 00064 } else if (isspace(*src)) { 00065 if (*argv[argc]) { 00066 buf++, argc++; 00067 if (argc == argvAlloced) { 00068 argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA; 00069 argv = (const char**)realloc((void*)argv, sizeof(*argv) * argvAlloced); 00070 } 00071 argv[argc] = buf; 00072 } 00073 } else switch (*src) { 00074 case '"': 00075 case '\'': 00076 quote = *src; 00077 break; 00078 case '\\': 00079 src++; 00080 if (!*src) { 00081 free((void*)argv); 00082 return POPT_ERROR_BADQUOTE; 00083 } 00084 /*@fallthrough@*/ 00085 default: 00086 *buf++ = *src; 00087 break; 00088 } 00089 } 00090 00091 if (strlen(argv[argc])) { 00092 argc++, buf++; 00093 } 00094 00095 (void) poptDupArgv(argc, argv, argcPtr, argvPtr); 00096 00097 free((void*)argv); 00098 00099 return 0; 00100 }
1.7.6.1