diff options
-rw-r--r-- | usr.bin/make/make.1 | 6 | ||||
-rw-r--r-- | usr.bin/make/var.c | 45 |
2 files changed, 49 insertions, 2 deletions
diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1 index e4f86fb..e4d9833 100644 --- a/usr.bin/make/make.1 +++ b/usr.bin/make/make.1 @@ -30,7 +30,7 @@ .\" SUCH DAMAGE. .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 -.\" $Id: make.1,v 1.15 1998/11/15 05:51:55 bde Exp $ +.\" $Id: make.1,v 1.16 1998/11/29 13:46:39 pds Exp $ .\" .Dd March 19, 1994 .Dt MAKE 1 @@ -488,6 +488,10 @@ This is identical to .Ql Cm M , but selects all words which do not match the rest of the modifier. +.It Cm Q +Quotes every shell meta-character in the variable, so that it can be passed +safely through recursive invocations of +.Nm make . .It Cm R Replaces each word in the variable with everything but its suffix. .Sm off diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index 0ae601d..5ae9a1a 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: var.c,v 1.10 1997/09/29 03:53:53 imp Exp $ + * $Id: var.c,v 1.11 1998/06/02 13:11:04 thepish Exp $ */ #ifndef lint @@ -166,6 +166,7 @@ static Boolean VarSYSVMatch __P((char *, Boolean, Buffer, ClientData)); #endif static Boolean VarNoMatch __P((char *, Boolean, Buffer, ClientData)); static Boolean VarSubstitute __P((char *, Boolean, Buffer, ClientData)); +static char *VarQuote __P((char *)); static char *VarModify __P((char *, Boolean (*)(char *, Boolean, Buffer, ClientData), ClientData)); @@ -1072,6 +1073,40 @@ VarModify (str, modProc, datum) /*- *----------------------------------------------------------------------- + * VarQuote -- + * Quote shell meta-characters in the string + * + * Results: + * The quoted string + * + * Side Effects: + * None. + * + *----------------------------------------------------------------------- + */ +static char * +VarQuote(str) + char *str; +{ + + Buffer buf; + /* This should cover most shells :-( */ + static char meta[] = "\n \t'`\";&<>()|*?{}[]\\$!#^~"; + + buf = Buf_Init (MAKE_BSIZE); + for (; *str; str++) { + if (strchr(meta, *str) != NULL) + Buf_AddByte(buf, (Byte)'\\'); + Buf_AddByte(buf, (Byte)*str); + } + Buf_AddByte(buf, (Byte) '\0'); + str = (char *)Buf_GetAll (buf, (int *)NULL); + Buf_Destroy (buf, FALSE); + return str; +} + +/*- + *----------------------------------------------------------------------- * Var_Parse -- * Given the start of a variable invocation, extract the variable * name and find its value, then modify it according to the @@ -1613,6 +1648,14 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) free(pattern.rhs); break; } + case 'Q': + if (tstr[1] == endc || tstr[1] == ':') { + newStr = VarQuote (str); + cp = tstr + 1; + termc = *cp; + break; + } + /*FALLTHRU*/ case 'T': if (tstr[1] == endc || tstr[1] == ':') { newStr = VarModify (str, VarTail, (ClientData)0); |