cp2 = Var_Parse(cp, VAR_CMD, TRUE, &len, &doFree);
cp2 = Var_Parse(cp, NULL, TRUE, &len, &doFree);
CondGetArg(linePtr, argPtr, argLen, func, parens)    char    	  **linePtr;    char    	  **argPtr;    size_t    	  *argLen;    char    	  *func;    Boolean 	  parens;   	/* TRUE if arg should be bounded by parens */{    register char *cp;    BUFFER buf;    cp = *linePtr;    if (parens) {	while (*cp != '(' && *cp != '\0') {	    cp++;	}	if (*cp == '(') {	    cp++;	}    }    if (*cp == '\0') {	/*	 * No arguments whatsoever. Because 'make' and 'defined' aren't really	 * "reserved words", we don't print a message. I think this is better	 * than hitting the user with a warning message every time s/he uses	 * the word 'make' or 'defined' at the beginning of a symbol...	 */	*argPtr = cp;	return FALSE;    }    while (*cp == ' ' || *cp == '\t') {	cp++;    }    /*     * Create a buffer for the argument and start it out at 16 characters     * long. Why 16? Why not?     */    Buf_Init(&buf, 16);    while ((strchr(" \t)&|", *cp) == (char *)NULL) && (*cp != '\0')) {	if (*cp == '$') {	    /*	     * Parse the variable spec and install it as part of the argument	     * if it's valid. We tell Var_Parse to complain on an undefined	     * variable, so we don't do it too. Nor do we return an error,	     * though perhaps we should...	     */	    char  	*cp2;	    size_t	len;	    Boolean	doFree;	    cp2 = Var_Parse(cp, VAR_CMD, TRUE, &len, &doFree);	    Buf_AddString(&buf, cp2);	    if (doFree) {		free(cp2);	    }	    cp += len;	} else {	    Buf_AddChar(&buf, *cp);	    cp++;	}    }    *argPtr = Buf_Retrieve(&buf);    *argLen = Buf_Size(&buf);    while (*cp == ' ' || *cp == '\t') {	cp++;    }    if (parens && *cp != ')') {	Parse_Error (PARSE_WARNING, "Missing closing parenthesis for %s()",		     func);	return FALSE;    } else if (parens) {	/*	 * Advance pointer past close parenthesis.	 */	cp++;    }    *linePtr = cp;    return TRUE;}