mirror of
https://salsa.debian.org/srivasta/make-dfsg.git
synced 2024-12-27 23:06:54 +00:00
Formerly expand.c.~2~
This commit is contained in:
parent
92dc493189
commit
e309bb2f76
1 changed files with 66 additions and 14 deletions
80
expand.c
80
expand.c
|
@ -1,5 +1,5 @@
|
||||||
/* Variable expansion functions for GNU Make.
|
/* 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.
|
This file is part of GNU Make.
|
||||||
|
|
||||||
GNU Make is free software; you can redistribute it and/or modify
|
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 "file.h"
|
||||||
#include "variable.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. */
|
/* Recursively expand V. The returned string is malloc'd. */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
@ -313,30 +365,30 @@ variable_expand_for_file (line, file)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like variable_expand, but the returned string is malloc'd. */
|
/* Like variable_expand_for_file, but the returned string is malloc'd.
|
||||||
char *
|
This function is called a lot. It wants to be efficient. */
|
||||||
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. */
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
allocated_variable_expand_for_file (line, file)
|
allocated_variable_expand_for_file (line, file)
|
||||||
char *line;
|
char *line;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
{
|
{
|
||||||
char *save;
|
|
||||||
char *value;
|
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 = 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;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue