Mixe for Privacy and Anonymity in the Internet
Defines | Functions
poptparse.cpp File Reference
#include "../StdAfx.h"
Include dependency graph for poptparse.cpp:

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 Documentation

Definition at line 8 of file poptparse.cpp.

Referenced by poptParseArgvString().


Function Documentation

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;
}

Here is the call graph for this function: