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