Index: variable.h =================================================================== RCS file: /cvsroot/make/make/variable.h,v retrieving revision 1.24 diff -u -B -b -r1.24 variable.h --- variable.h 8 Aug 2002 00:11:19 -0000 1.24 +++ variable.h 25 Oct 2002 21:37:32 -0000 @@ -107,6 +107,8 @@ extern char *expand_argument PARAMS ((char *str, char *end)); extern char *variable_expand_string PARAMS ((char *line, char *string, long length)); +extern void install_variable_buffer PARAMS ((char **bufp, unsigned int *lenp)); +extern void restore_variable_buffer PARAMS ((char *buf, unsigned int len)); /* function.c */ extern int handle_function PARAMS ((char **op, char **stringp)); Index: expand.c =================================================================== RCS file: /cvsroot/make/make/expand.c,v retrieving revision 1.33 diff -u -B -b -r1.33 expand.c --- expand.c 14 Oct 2002 21:54:04 -0000 1.33 +++ expand.c 25 Oct 2002 21:37:32 -0000 @@ -545,3 +545,28 @@ return value; } + +/* Install a new variable_buffer context, returning the current one for + safe-keeping. */ + +void +install_variable_buffer (char **bufp, unsigned int *lenp) +{ + *bufp = variable_buffer; + *lenp = variable_buffer_length; + + variable_buffer = 0; + initialize_variable_output (); +} + +/* Restore a previously-saved variable_buffer setting (free the current one). + */ + +void +restore_variable_buffer (char *buf, unsigned int len) +{ + free (variable_buffer); + + variable_buffer = buf; + variable_buffer_length = len; +} Index: function.c =================================================================== RCS file: /cvsroot/make/make/function.c,v retrieving revision 1.71 diff -u -B -b -r1.71 function.c --- function.c 14 Oct 2002 21:54:04 -0000 1.71 +++ function.c 25 Oct 2002 21:37:32 -0000 @@ -1196,7 +1196,17 @@ static char * func_eval (char *o, char **argv, const char *funcname) { + char *buf; + unsigned int len; + + /* Eval the buffer. Pop the current variable buffer setting so that the + eval'd code can use its own without conflicting. */ + + install_variable_buffer (&buf, &len); + eval_buffer (argv[0]); + + restore_variable_buffer (buf, len); return o; }