From 17f2dda0acc8f97e40819d75d99d85283d9027a1 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 7 Feb 2000 19:54:04 +0000 Subject: * Fix for dir.c from Andreas Schwab. * Fix += target-specific variables: if your direct parent doesn't have a setting for the variable but his parent does, you'll get recursive expansion errors. --- ChangeLog | 36 ++++++++++++++++++++++++++++++++++-- dir.c | 27 ++++++++++++++++++++++----- expand.c | 25 +++++++++++++++++-------- variable.c | 18 +++++++++++++++--- variable.h | 12 ++++++++++-- 5 files changed, 98 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2988bd4..3888642 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2000-02-07 Paul D. Smith + + 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 * 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 + + * dir.c (read_dirstream): Initialize d_type if it exists. + 2000-01-11 Paul D. Smith 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 . + Reported by Damien GIBOU . * 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 diff --git a/dir.c b/dir.c index caa8042..9221c44 100644 --- a/dir.c +++ b/dir.c @@ -1058,6 +1058,9 @@ read_dirstream (stream) FAKE_DIR_ENTRY (d); #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. */ } diff --git a/expand.c b/expand.c index f15da02..070b893 100644 --- a/expand.c +++ b/expand.c @@ -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] = '('; diff --git a/variable.c b/variable.c index 58af121..5089657 100644 --- a/variable.c +++ b/variable.c @@ -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++; diff --git a/variable.h b/variable.h index d449ef8..4c707dc 100644 --- a/variable.h +++ b/variable.h @@ -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, -- cgit v1.2.3