110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** \ingroup popt 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * \file popt/poptparse.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* (C) 1998-2002 Red Hat, Inc. -- Licensing details are in the COPYING 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project file accompanying popt source distributions, available from 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project ftp://ftp.rpm.org/pub/rpm/dist. */ 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "system.h" 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define POPT_ARGV_ARRAY_GROW_DELTA 5 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/*@-boundswrite@*/ 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint poptDupArgv(int argc, const char **argv, 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int * argcPtr, const char *** argvPtr) 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t nb = (argc + 1) * sizeof(*argv); 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project const char ** argv2; 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * dst; 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int i; 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argc <= 0 || argv == NULL) /* XXX can't happen */ 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return POPT_ERROR_NOARG; 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (i = 0; i < argc; i++) { 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argv[i] == NULL) 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return POPT_ERROR_NOARG; 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project nb += strlen(argv[i]) + 1; 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dst = malloc(nb); 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (dst == NULL) /* XXX can't happen */ 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return POPT_ERROR_MALLOC; 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv2 = (void *) dst; 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dst += (argc + 1) * sizeof(*argv); 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /*@-branchstate@*/ 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (i = 0; i < argc; i++) { 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv2[i] = dst; 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project dst += strlen(strcpy(dst, argv[i])) + 1; 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /*@=branchstate@*/ 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv2[argc] = NULL; 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argvPtr) { 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *argvPtr = argv2; 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project free(argv2); 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv2 = NULL; 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argcPtr) 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *argcPtr = argc; 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/*@=boundswrite@*/ 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/*@-bounds@*/ 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project const char * src; 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char quote = '\0'; 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA; 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project const char ** argv = malloc(sizeof(*argv) * argvAlloced); 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int argc = 0; 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int buflen = strlen(s) + 1; 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * buf = memset(alloca(buflen), 0, buflen); 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int rc = POPT_ERROR_MALLOC; 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argv == NULL) return rc; 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv[argc] = buf; 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project for (src = s; *src != '\0'; src++) { 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (quote == *src) { 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project quote = '\0'; 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (quote != '\0') { 7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*src == '\\') { 7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project src++; 7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!*src) { 7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project rc = POPT_ERROR_BADQUOTE; 7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project goto exit; 8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*src != quote) *buf++ = '\\'; 8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *buf++ = *src; 8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else if (isspace(*src)) { 8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*argv[argc] != '\0') { 8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project buf++, argc++; 8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argc == argvAlloced) { 8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA; 8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv = realloc(argv, sizeof(*argv) * argvAlloced); 9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argv == NULL) goto exit; 9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argv[argc] = buf; 9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else switch (*src) { 9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case '"': 9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case '\'': 9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project quote = *src; 9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /*@switchbreak@*/ break; 9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project case '\\': 10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project src++; 10110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!*src) { 10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project rc = POPT_ERROR_BADQUOTE; 10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project goto exit; 10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /*@fallthrough@*/ 10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project default: 10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *buf++ = *src; 10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /*@switchbreak@*/ break; 10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (strlen(argv[argc])) { 11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argc++, buf++; 11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project rc = poptDupArgv(argc, argv, argcPtr, argvPtr); 11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectexit: 11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argv) free(argv); 12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return rc; 12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 12210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/*@=bounds@*/ 12310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 12410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* still in the dev stage. 12510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * return values, perhaps 1== file erro 12610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 2== line to long 12710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 3== umm.... more? 12810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 12910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint poptConfigFileToString(FILE *fp, char ** argstrp, /*@unused@*/ int flags) 13010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 13110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char line[999]; 13210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * argstr; 13310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * p; 13410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * q; 13510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char * x; 13610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int t; 13710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int argvlen = 0; 13810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t maxlinelen = sizeof(line); 13910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project size_t linelen; 14010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int maxargvlen = 480; 14110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int linenum = 0; 14210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 14310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *argstrp = NULL; 14410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 14510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* | this_is = our_line 14610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * p q x 14710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 14810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 14910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (fp == NULL) 15010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return POPT_ERROR_NULLARG; 15110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argstr = calloc(maxargvlen, sizeof(*argstr)); 15310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argstr == NULL) return POPT_ERROR_MALLOC; 15410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (fgets(line, (int)maxlinelen, fp) != NULL) { 15610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project linenum++; 15710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project p = line; 15810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 15910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* loop until first non-space char or EOL */ 16010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while( *p != '\0' && isspace(*p) ) 16110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project p++; 16210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project linelen = strlen(p); 16410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (linelen >= maxlinelen-1) 16510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return POPT_ERROR_OVERFLOW; /* XXX line too long */ 16610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 16710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*p == '\0' || *p == '\n') continue; /* line is empty */ 16810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*p == '#') continue; /* comment line */ 16910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project q = p; 17110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (*q != '\0' && (!isspace(*q)) && *q != '=') 17310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project q++; 17410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 17510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (isspace(*q)) { 17610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* a space after the name, find next non space */ 17710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *q++='\0'; 17810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while( *q != '\0' && isspace((int)*q) ) q++; 17910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 18010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*q == '\0') { 18110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* single command line option (ie, no name=val, just name) */ 18210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project q[-1] = '\0'; /* kill off newline from fgets() call */ 18310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argvlen += (t = q - p) + (sizeof(" --")-1); 18410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argvlen >= maxargvlen) { 18510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project maxargvlen = (t > maxargvlen) ? t*2 : maxargvlen*2; 18610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argstr = realloc(argstr, maxargvlen); 18710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argstr == NULL) return POPT_ERROR_MALLOC; 18810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 18910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, " --"); 19010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, p); 19110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project continue; 19210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 19310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*q != '=') 19410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project continue; /* XXX for now, silently ignore bogus line */ 19510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* *q is an equal sign. */ 19710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *q++ = '\0'; 19810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 19910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* find next non-space letter of value */ 20010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (*q != '\0' && isspace(*q)) 20110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project q++; 20210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (*q == '\0') 20310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project continue; /* XXX silently ignore missing value */ 20410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 20510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* now, loop and strip all ending whitespace */ 20610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project x = p + linelen; 20710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while (isspace(*--x)) 20810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *x = 0; /* null out last char if space (including fgets() NL) */ 20910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 21010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* rest of line accept */ 21110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project t = x - p; 21210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argvlen += t + (sizeof("' --='")-1); 21310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argvlen >= maxargvlen) { 21410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project maxargvlen = (t > maxargvlen) ? t*2 : maxargvlen*2; 21510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project argstr = realloc(argstr, maxargvlen); 21610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (argstr == NULL) return POPT_ERROR_MALLOC; 21710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 21810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, " --"); 21910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, p); 22010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, "=\""); 22110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, q); 22210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project strcat(argstr, "\""); 22310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 22410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 22510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *argstrp = argstr; 22610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 22710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 228