Subject: Re: make: allow setting variable mods in variable?
To: None <tech-toolchain@netbsd.org>
From: Simon J. Gerraty <sjg@crufty.net>
List: tech-toolchain
Date: 02/11/2006 22:20:56
No one has any thoughts on this?
Any one have objections to allowing this?

>I occasionally have a complex set of variable mods that I want to use 
>in multiple places and it would be handy to specify these in variable
>as in (trivial example I know):

>MODS=S,A,a,

>V=Abc

>all:
>	@echo V=${V:${MODS}}

>it would be nice if this printed 'abc' rather than an error about $
>being an unknown modifier.  The patch below does this (and all the
>unit tests still pass), but I'm not convinced it is right wrt cleanup.
>I'd appreciate a 2nd opinion.

>Thanks
>--sjg

>--- var.c.~1~	Sat Sep  3 15:15:09 2005
>+++ var.c	Fri Jan 20 16:58:52 2006
>@@ -1890,6 +1890,7 @@ Var_Parse(const char *str, GNode *ctxt, 
> 	  Boolean *freePtr)
> {
>     const char	   *tstr;    	/* Pointer into str */
>+    const char	   *tstr2;	/* Secondary tstr if we need to recurse  */
>     Var	    	   *v;	    	/* Variable in invocation */
>     const char     *cp;    	/* Secondary pointer into str (place marker
> 				 * for tstr) */
>@@ -1915,6 +1916,7 @@ Var_Parse(const char *str, GNode *ctxt, 
>     start = str;
>     parsestate.oneBigWord = FALSE;
>     parsestate.varSpace = ' ';	/* word separator */
>+    tstr2 = NULL;
> 
>     if (str[1] != PROPEN && str[1] != BROPEN) {
> 	/*
>@@ -2257,6 +2259,9 @@ Var_Parse(const char *str, GNode *ctxt, 
> 	tstr++;
> 	delim = '\0';
> 
>+	if (*tstr == '$') {
>+	    tstr = tstr2 = Var_Subst(NULL, tstr, ctxt, err);
>+	}
> 	while (*tstr && *tstr != endc) {
> 	    char	*newStr;    /* New value to return */
> 	    char	termc;	    /* Character which terminated scan */
>@@ -3235,6 +3240,8 @@ cleanup:
>     *lengthPtr = cp - start + 1;
>     if (*freePtr)
> 	free(nstr);
>+    if (tstr2)
>+	free(tstr2);
>     if (delim != '\0')
> 	Error("Unclosed substitution for %s (%c missing)",
> 	      v->name, delim);