summaryrefslogtreecommitdiff
path: root/expand.c
diff options
context:
space:
mode:
Diffstat (limited to 'expand.c')
-rw-r--r--expand.c80
1 files changed, 66 insertions, 14 deletions
diff --git a/expand.c b/expand.c
index 81796d5..e9e29b3 100644
--- a/expand.c
+++ b/expand.c
@@ -1,5 +1,5 @@
/* Variable expansion functions for GNU Make.
-Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
+Copyright (C) 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -21,7 +21,59 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "file.h"
#include "variable.h"
+/* The next two describe the variable output buffer.
+ This buffer is used to hold the variable-expansion of a line of the
+ makefile. It is made bigger with realloc whenever it is too small.
+ variable_buffer_length is the size currently allocated.
+ variable_buffer is the address of the buffer. */
+static unsigned int variable_buffer_length;
+static char *variable_buffer;
+
+/* Subroutine of variable_expand and friends:
+ The text to add is LENGTH chars starting at STRING to the variable_buffer.
+ The text is added to the buffer at PTR, and the updated pointer into
+ the buffer is returned as the value. Thus, the value returned by
+ each call to variable_buffer_output should be the first argument to
+ the following call. */
+
+static char *
+variable_buffer_output (ptr, string, length)
+ char *ptr, *string;
+ unsigned int length;
+{
+ register unsigned int newlen = length + (ptr - variable_buffer);
+
+ if (newlen > variable_buffer_length)
+ {
+ unsigned int offset = ptr - variable_buffer;
+ variable_buffer_length = max (2 * variable_buffer_length, newlen + 100);
+ variable_buffer = (char *) xrealloc (variable_buffer,
+ variable_buffer_length);
+ ptr = variable_buffer + offset;
+ }
+
+ bcopy (string, ptr, length);
+ return ptr + length;
+}
+
+/* Return a pointer to the beginning of the variable buffer. */
+
+static char *
+initialize_variable_output ()
+{
+ /* If we don't have a variable output buffer yet, get one. */
+
+ if (variable_buffer == 0)
+ {
+ variable_buffer_length = 200;
+ variable_buffer = (char *) xmalloc (variable_buffer_length);
+ variable_buffer[0] = '\0';
+ }
+
+ return variable_buffer;
+}
+
/* Recursively expand V. The returned string is malloc'd. */
static char *
@@ -313,30 +365,30 @@ variable_expand_for_file (line, file)
return result;
}
-/* Like variable_expand, but the returned string is malloc'd. */
-char *
-allocated_variable_expand (line)
- char *line;
-{
- return allocated_variable_expand_for_file (line, (struct file *) 0);
-}
-
-/* Like variable_expand_for_file, but the returned string is malloc'd. */
+/* Like variable_expand_for_file, but the returned string is malloc'd.
+ This function is called a lot. It wants to be efficient. */
char *
allocated_variable_expand_for_file (line, file)
char *line;
struct file *file;
{
- char *save;
char *value;
- save = save_variable_output ();
+ char *obuf = variable_buffer;
+ unsigned int olen = variable_buffer_length;
+
+ variable_buffer = 0;
value = variable_expand_for_file (line, file);
- value = savestring (value, strlen (value));
- restore_variable_output (save);
+#if 0
+ /* Waste a little memory and save time. */
+ value = xrealloc (value, strlen (value))
+#endif
+
+ variable_buffer = obuf;
+ variable_buffer_length = olen;
return value;
}