diff options
-rw-r--r-- | ChangeLog | 36 | ||||
-rw-r--r-- | dir.c | 27 | ||||
-rw-r--r-- | expand.c | 25 | ||||
-rw-r--r-- | variable.c | 18 | ||||
-rw-r--r-- | variable.h | 12 |
5 files changed, 98 insertions, 20 deletions
@@ -1,3 +1,31 @@ +2000-02-07 Paul D. Smith <psmith@gnu.org> + + For += target-specific variables we need to remember which + variable set we found the variable in, so we can start looking + there in the next iteration (otherwise we'll see it again in + recursively_expand and fail!). This is getting to be a hack; if + it gets any worse we'll have to rethink this entire algorithm; + probably implementing expansion of these separately from the + "normal" expansion, instead of alongside. + + * variable.h (recursively_expand_setlist): Rename + recursively_expand to add a struct variable_set_list argument, and + make a macro for recursively_expand. + (lookup_variable_setlist): Rename lookup_variable to add a struct + variable_set_list argument, and make a macro for lookup_variable. + + * expand.c (recursively_expand_setlist): Take an extra struct + variable_set_list argument and pass it to + allocated_variable_append(). + (reference_variable): Use lookup_variable_setlist() and pass the + returned variable_set_list to recursively_expand_setlist. + (allocated_variable_append): Take an extra setlist argument and + use this as the starting place when searching for the appended + expansion. If it's null, use current_variable_set_list as before. + + * variable.c (lookup_variable_setlist): If the LISTP argument is + not nil, return the list where we found the variable in it. + 2000-02-04 Paul D. Smith <psmith@gnu.org> * variable.c (print_variable): Write out filename/linenumber @@ -130,6 +158,10 @@ * variable.c, vmsdir.h, vmsfunctions.c, vmsify.c, glob/glob.c: * glob/glob.h: Installed patches. See readme.vms for details. +2000-01-14 Andreas Schwab <schwab@suse.de> + + * dir.c (read_dirstream): Initialize d_type if it exists. + 2000-01-11 Paul D. Smith <psmith@gnu.org> Resolve PR/xxxx: don't automatically evaluate the $(call ...) @@ -137,7 +169,7 @@ protocol to always use simple nul-terminated strings, instead of sometimes using offset pointers to mark the end of arguments. This change also fixes PR/1517. - Both PR's by Damien GIBOU <damien.gibou@st.com>. + Reported by Damien GIBOU <damien.gibou@st.com>. * function.c (struct function_table_entry): Remove the negative required_args hack; put in explicit min and max # of arguments. @@ -173,7 +205,7 @@ * implicit.c (pattern_search): Remove the extra check of the implicit flag added on 8/24/1998. This causes problems and the reason for the change was better resolved by the change made to - check_deps() on 8/26/1998. This fixes PR/1423. + check_deps() on 1998-08-26. This fixes PR/1423. 1999-12-08 Paul D. Smith <psmith@gnu.org> @@ -1059,6 +1059,9 @@ read_dirstream (stream) #ifdef _DIRENT_HAVE_D_NAMLEN d->d_namlen = len - 1; #endif +#ifdef _DIRENT_HAVE_D_TYPE + d->d_type = DT_UNKNOWN; +#endif memcpy (d->d_name, df->name, len); return d; } @@ -1079,19 +1082,33 @@ ansi_free(p) free(p); } +/* On 64 bit ReliantUNIX (5.44 and above) in LFS mode, stat() is actually a + * macro for stat64(). If stat is a macro, make a local wrapper function to + * invoke it. + */ +#ifndef stat +# ifndef VMS +extern int stat (); +# endif +# define local_stat stat +#else +static int local_stat (path, buf) + char *path; + struct stat *buf; +{ + return stat (path, buf); +} +#endif + void dir_setup_glob (gl) glob_t *gl; { -#ifndef VMS - extern int stat (); -#endif - /* Bogus sunos4 compiler complains (!) about & before functions. */ gl->gl_opendir = open_dirstream; gl->gl_readdir = read_dirstream; gl->gl_closedir = ansi_free; - gl->gl_stat = stat; + gl->gl_stat = local_stat; /* We don't bother setting gl_lstat, since glob never calls it. The slot is only there for compatibility with 4.4 BSD. */ } @@ -91,11 +91,13 @@ initialize_variable_output () /* Recursively expand V. The returned string is malloc'd. */ -static char *allocated_variable_append PARAMS ((struct variable *v)); +static char *allocated_variable_append PARAMS ((struct variable *v, + struct variable_set_list *l)); char * -recursively_expand (v) +recursively_expand_setlist (v, list) register struct variable *v; + struct variable_set_list *list; { char *value; @@ -107,7 +109,7 @@ recursively_expand (v) v->expanding = 1; if (v->append) - value = allocated_variable_append (v); + value = allocated_variable_append (v, list); else value = allocated_variable_expand (v->value); v->expanding = 0; @@ -141,16 +143,19 @@ reference_variable (o, name, length) char *name; unsigned int length; { - register struct variable *v = lookup_variable (name, length); + register struct variable *v; + struct variable_set_list *setlist; char *value; + v = lookup_variable_setlist (name, length, &setlist); + if (v == 0) warn_undefined (name, length); if (v == 0 || *v->value == '\0') return o; - value = (v->recursive ? recursively_expand (v) : v->value); + value = (v->recursive ? recursively_expand_setlist (v, setlist) : v->value); o = variable_buffer_output (o, value, strlen (value)); @@ -467,8 +472,9 @@ variable_expand_for_file (line, file) context of the next variable set, then we append the expanded value. */ static char * -allocated_variable_append (v) +allocated_variable_append (v, list) struct variable *v; + struct variable_set_list *list; { struct variable_set_list *save; int len = strlen (v->name); @@ -480,9 +486,12 @@ allocated_variable_append (v) variable_buffer = 0; - assert(current_variable_set_list->next != 0); + if (!list) + list = current_variable_set_list; + + assert(list->next != 0); save = current_variable_set_list; - current_variable_set_list = current_variable_set_list->next; + current_variable_set_list = list->next; var[0] = '$'; var[1] = '('; @@ -134,12 +134,17 @@ define_variable_in_set (name, length, value, origin, recursive, set, flocp) /* Lookup a variable whose name is a string starting at NAME and with LENGTH chars. NAME need not be null-terminated. Returns address of the `struct variable' containing all info - on the variable, or nil if no such variable is defined. */ + on the variable, or nil if no such variable is defined. + + If LISTP is not nil, return a pointer to the setlist where + the variable was found. If the variable wasn't found, the + value of LISTP is unchanged. */ struct variable * -lookup_variable (name, length) +lookup_variable_setlist (name, length, listp) char *name; unsigned int length; + struct variable_set_list **listp; { register struct variable_set_list *setlist; @@ -160,7 +165,11 @@ lookup_variable (name, length) if (*v->name == *name && strneq (v->name + 1, name + 1, length - 1) && v->name[length] == 0) - return v; + { + if (listp) + *listp = setlist; + return v; + } } #ifdef VMS @@ -181,6 +190,9 @@ lookup_variable (name, length) sptr = value; scnt = 0; + if (listp) + *listp = current_variable_set_list; + while ((sptr = strchr (sptr, '$'))) { scnt++; @@ -95,7 +95,10 @@ extern char *patsubst_expand PARAMS ((char *o, char *text, char *pattern, char * char *pattern_percent, char *replace_percent)); /* expand.c */ -extern char *recursively_expand PARAMS ((struct variable *v)); +extern char *recursively_expand_setlist PARAMS ((struct variable *v, + struct variable_set_list *l)); + +#define recursively_expand(v) recursively_expand_setlist((v),(struct variable_set_list *)0) /* variable.c */ extern struct variable_set_list *create_new_variable_set PARAMS ((void)); @@ -108,7 +111,12 @@ extern void print_variable_set PARAMS ((struct variable_set *set, char *prefix)) extern void merge_variable_set_lists PARAMS ((struct variable_set_list **setlist0, struct variable_set_list *setlist1)); extern struct variable *try_variable_definition PARAMS ((const struct floc *flocp, char *line, enum variable_origin origin, int target_var)); -extern struct variable *lookup_variable PARAMS ((char *name, unsigned int length)); +extern struct variable *lookup_variable_setlist + PARAMS ((char *name, unsigned int length, + struct variable_set_list **lisp)); + +#define lookup_variable(n,l) lookup_variable_setlist((n),(l),\ + (struct variable_set_list **)0) extern struct variable *define_variable_in_set PARAMS ((char *name, unsigned int length, char *value, |