Mixe for Privacy and Anonymity in the Internet
poptparse.cpp
Go to the documentation of this file.
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 }