xref: /openbsd-src/usr.bin/make/var.c (revision 4c1e55dc91edd6e69ccc60ce855900fbc12cf34f)
1 /*	$OpenBSD: var.c,v 1.89 2012/03/22 13:47:12 espie Exp $	*/
2 /*	$NetBSD: var.c,v 1.18 1997/03/18 19:24:46 christos Exp $	*/
3 
4 /*
5  * Copyright (c) 1999,2000,2007 Marc Espie.
6  *
7  * Extensive code modifications for the OpenBSD project.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OPENBSD
22  * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 /*
31  * Copyright (c) 1988, 1989, 1990, 1993
32  *	The Regents of the University of California.  All rights reserved.
33  * Copyright (c) 1989 by Berkeley Softworks
34  * All rights reserved.
35  *
36  * This code is derived from software contributed to Berkeley by
37  * Adam de Boor.
38  *
39  * Redistribution and use in source and binary forms, with or without
40  * modification, are permitted provided that the following conditions
41  * are met:
42  * 1. Redistributions of source code must retain the above copyright
43  *    notice, this list of conditions and the following disclaimer.
44  * 2. Redistributions in binary form must reproduce the above copyright
45  *    notice, this list of conditions and the following disclaimer in the
46  *    documentation and/or other materials provided with the distribution.
47  * 3. Neither the name of the University nor the names of its contributors
48  *    may be used to endorse or promote products derived from this software
49  *    without specific prior written permission.
50  *
51  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
52  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
55  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61  * SUCH DAMAGE.
62  */
63 
64 #include <assert.h>
65 #include <stddef.h>
66 #include <stdio.h>
67 #include <stdint.h>
68 #include <stdlib.h>
69 #include <string.h>
70 
71 #include "config.h"
72 #include "defines.h"
73 #include "buf.h"
74 #include "stats.h"
75 #include "ohash.h"
76 #include "pathnames.h"
77 #include "varmodifiers.h"
78 #include "var.h"
79 #include "varname.h"
80 #include "error.h"
81 #include "str.h"
82 #include "var_int.h"
83 #include "memory.h"
84 #include "symtable.h"
85 #include "gnode.h"
86 
87 /*
88  * This is a harmless return value for Var_Parse that can be used by Var_Subst
89  * to determine if there was an error in parsing -- easier than returning
90  * a flag, as things outside this module don't give a hoot.
91  */
92 char	var_Error[] = "";
93 
94 /*
95  * Similar to var_Error, but returned when the 'err' flag for Var_Parse is
96  * set false. Why not just use a constant? Well, gcc likes to condense
97  * identical string instances...
98  */
99 static char	varNoError[] = "";
100 bool		errorIsOkay;
101 static bool	checkEnvFirst;	/* true if environment should be searched for
102 				 * variables before the global context */
103 
104 void
105 Var_setCheckEnvFirst(bool yes)
106 {
107 	checkEnvFirst = yes;
108 }
109 
110 /*
111  * The rules for variable look-up are complicated.
112  *
113  * - Dynamic variables like $@ and $* are special. They always pertain to
114  * a given variable.  In this implementation of make, it is an error to
115  * try to affect them manually. They are stored in a local symtable directly
116  * inside the gnode.
117  *
118  * Global variables can be obtained:
119  * - from the command line
120  * - from the environment
121  * - from the Makefile proper.
122  * All of these are stored in a hash global_variables.
123  *
124  * Variables set on the command line override Makefile contents, are
125  * passed to submakes (see Var_AddCmdLine), and are also exported to the
126  * environment.
127  *
128  * Without -e (!checkEnvFirst), make will see variables set in the
129  * Makefile, and default to the environment otherwise.
130  *
131  * With -e (checkEnvFirst), make will see the environment first, and that
132  * will override anything that's set in the Makefile (but not set on
133  * the command line).
134  *
135  * The SHELL variable is very special: it is never obtained from the
136  * environment, and never passed to the environment.
137  */
138 
139 /* definitions pertaining to dynamic variables */
140 
141 /* full names of dynamic variables */
142 static char *varnames[] = {
143 	TARGET,
144 	PREFIX,
145 	ARCHIVE,
146 	MEMBER,
147 	OODATE,
148 	ALLSRC,
149 	IMPSRC,
150 	FTARGET,
151 	DTARGET,
152 	FPREFIX,
153 	DPREFIX,
154 	FARCHIVE,
155 	DARCHIVE,
156 	FMEMBER,
157 	DMEMBER
158 };
159 
160 /* hashed names of dynamic variables */
161 #include    "varhashconsts.h"
162 
163 /* extended indices for System V stuff */
164 #define FTARGET_INDEX	7
165 #define DTARGET_INDEX	8
166 #define FPREFIX_INDEX	9
167 #define DPREFIX_INDEX	10
168 #define FARCHIVE_INDEX	11
169 #define DARCHIVE_INDEX	12
170 #define FMEMBER_INDEX	13
171 #define DMEMBER_INDEX	14
172 
173 #define GLOBAL_INDEX	-1
174 
175 #define EXTENDED2SIMPLE(i)	(((i)-LOCAL_SIZE)/2)
176 #define IS_EXTENDED_F(i)	((i)%2 == 1)
177 
178 
179 static struct ohash global_variables;
180 
181 
182 typedef struct Var_ {
183 	BUFFER val;		/* the variable value */
184 	unsigned int flags;	/* miscellaneous status flags */
185 #define VAR_IN_USE	1	/* Variable's value currently being used. */
186 				/* (Used to avoid recursion) */
187 #define VAR_DUMMY	2	/* Variable is currently just a name */
188 				/* In particular: BUFFER is invalid */
189 #define VAR_FROM_CMD	4	/* Special source: command line */
190 #define VAR_FROM_ENV	8	/* Special source: environment */
191 #define VAR_SEEN_ENV	16	/* No need to go look up environment again */
192 #define VAR_SHELL	32	/* Magic behavior */
193 
194 #define POISONS (POISON_NORMAL | POISON_EMPTY | POISON_NOT_DEFINED)
195 				/* Defined in var.h */
196 	char name[1];		/* the variable's name */
197 }  Var;
198 
199 
200 static struct ohash_info var_info = {
201 	offsetof(Var, name),
202 	NULL,
203 	hash_alloc, hash_free, element_alloc
204 };
205 
206 static int classify_var(const char *, const char **, uint32_t *);
207 static Var *find_global_var(const char *, const char *, uint32_t);
208 static Var *find_global_var_without_env(const char *, const char *, uint32_t);
209 static void fill_from_env(Var *);
210 static Var *create_var(const char *, const char *);
211 static void var_set_initial_value(Var *, const char *);
212 static void var_set_value(Var *, const char *);
213 #define var_get_value(v)	Buf_Retrieve(&((v)->val))
214 static void var_append_value(Var *, const char *);
215 static void poison_check(Var *);
216 static void var_set_append(const char *, const char *, const char *, int, bool);
217 static void set_magic_shell_variable(void);
218 
219 static void delete_var(Var *);
220 static void print_var(Var *);
221 
222 
223 static const char *find_rparen(const char *);
224 static const char *find_ket(const char *);
225 typedef const char * (*find_t)(const char *);
226 static find_t find_pos(int);
227 static void push_used(Var *);
228 static void pop_used(Var *);
229 static char *get_expanded_value(const char *, const char *, int, uint32_t,
230     SymTable *, bool, bool *);
231 static bool parse_base_variable_name(const char **, struct Name *, SymTable *);
232 
233 
234 
235 /* Variable lookup function: return idx for dynamic variable, or
236  * GLOBAL_INDEX if name is not dynamic. Set up *pk for further use.
237  */
238 static int
239 classify_var(const char *name, const char **enamePtr, uint32_t *pk)
240 {
241 	size_t len;
242 
243 	*pk = ohash_interval(name, enamePtr);
244 	len = *enamePtr - name;
245 	    /* substitute short version for long local name */
246 	switch (*pk % MAGICSLOTS1) {	/* MAGICSLOTS should be the    */
247 	case K_LONGALLSRC % MAGICSLOTS1:/* smallest constant yielding  */
248 					/* distinct case values	   */
249 		if (*pk == K_LONGALLSRC && len == strlen(LONGALLSRC) &&
250 		    strncmp(name, LONGALLSRC, len) == 0)
251 			return ALLSRC_INDEX;
252 		break;
253 	case K_LONGARCHIVE % MAGICSLOTS1:
254 		if (*pk == K_LONGARCHIVE && len == strlen(LONGARCHIVE) &&
255 		    strncmp(name, LONGARCHIVE, len) == 0)
256 			return ARCHIVE_INDEX;
257 		break;
258 	case K_LONGIMPSRC % MAGICSLOTS1:
259 		if (*pk == K_LONGIMPSRC && len == strlen(LONGIMPSRC) &&
260 		    strncmp(name, LONGIMPSRC, len) == 0)
261 			return IMPSRC_INDEX;
262 		break;
263 	case K_LONGMEMBER % MAGICSLOTS1:
264 		if (*pk == K_LONGMEMBER && len == strlen(LONGMEMBER) &&
265 		    strncmp(name, LONGMEMBER, len) == 0)
266 			return MEMBER_INDEX;
267 		break;
268 	case K_LONGOODATE % MAGICSLOTS1:
269 		if (*pk == K_LONGOODATE && len == strlen(LONGOODATE) &&
270 		    strncmp(name, LONGOODATE, len) == 0)
271 			return OODATE_INDEX;
272 		break;
273 	case K_LONGPREFIX % MAGICSLOTS1:
274 		if (*pk == K_LONGPREFIX && len == strlen(LONGPREFIX) &&
275 		    strncmp(name, LONGPREFIX, len) == 0)
276 			return PREFIX_INDEX;
277 		break;
278 	case K_LONGTARGET % MAGICSLOTS1:
279 		if (*pk == K_LONGTARGET && len == strlen(LONGTARGET) &&
280 		    strncmp(name, LONGTARGET, len) == 0)
281 			return TARGET_INDEX;
282 		break;
283 	case K_TARGET % MAGICSLOTS1:
284 		if (name[0] == TARGET[0] && len == 1)
285 			return TARGET_INDEX;
286 		break;
287 	case K_OODATE % MAGICSLOTS1:
288 		if (name[0] == OODATE[0] && len == 1)
289 			return OODATE_INDEX;
290 		break;
291 	case K_ALLSRC % MAGICSLOTS1:
292 		if (name[0] == ALLSRC[0] && len == 1)
293 			return ALLSRC_INDEX;
294 		break;
295 	case K_IMPSRC % MAGICSLOTS1:
296 		if (name[0] == IMPSRC[0] && len == 1)
297 			return IMPSRC_INDEX;
298 		break;
299 	case K_PREFIX % MAGICSLOTS1:
300 		if (name[0] == PREFIX[0] && len == 1)
301 			return PREFIX_INDEX;
302 		break;
303 	case K_ARCHIVE % MAGICSLOTS1:
304 		if (name[0] == ARCHIVE[0] && len == 1)
305 			return ARCHIVE_INDEX;
306 		break;
307 	case K_MEMBER % MAGICSLOTS1:
308 		if (name[0] == MEMBER[0] && len == 1)
309 			return MEMBER_INDEX;
310 		break;
311 	case K_FTARGET % MAGICSLOTS1:
312 		if (name[0] == FTARGET[0] && name[1] == FTARGET[1] && len == 2)
313 			return FTARGET_INDEX;
314 		break;
315 	case K_DTARGET % MAGICSLOTS1:
316 		if (name[0] == DTARGET[0] && name[1] == DTARGET[1] && len == 2)
317 			return DTARGET_INDEX;
318 		break;
319 	case K_FPREFIX % MAGICSLOTS1:
320 		if (name[0] == FPREFIX[0] && name[1] == FPREFIX[1] && len == 2)
321 			return FPREFIX_INDEX;
322 		break;
323 	case K_DPREFIX % MAGICSLOTS1:
324 		if (name[0] == DPREFIX[0] && name[1] == DPREFIX[1] && len == 2)
325 			return DPREFIX_INDEX;
326 		break;
327 	case K_FARCHIVE % MAGICSLOTS1:
328 		if (name[0] == FARCHIVE[0] && name[1] == FARCHIVE[1] &&
329 		    len == 2)
330 			return FARCHIVE_INDEX;
331 		break;
332 	case K_DARCHIVE % MAGICSLOTS1:
333 		if (name[0] == DARCHIVE[0] && name[1] == DARCHIVE[1] &&
334 		    len == 2)
335 			return DARCHIVE_INDEX;
336 		break;
337 	case K_FMEMBER % MAGICSLOTS1:
338 		if (name[0] == FMEMBER[0] && name[1] == FMEMBER[1] && len == 2)
339 			return FMEMBER_INDEX;
340 		break;
341 	case K_DMEMBER % MAGICSLOTS1:
342 		if (name[0] == DMEMBER[0] && name[1] == DMEMBER[1] && len == 2)
343 		    return DMEMBER_INDEX;
344 		break;
345 	default:
346 		break;
347 	}
348 	return GLOBAL_INDEX;
349 }
350 
351 
352 /***
353  ***	Internal handling of variables.
354  ***/
355 
356 
357 /* Create a new variable, does not initialize anything except the name.
358  * in particular, buffer is invalid, and flag value is invalid. Accordingly,
359  * must either:
360  * - set flags to VAR_DUMMY
361  * - set flags to !VAR_DUMMY, and initialize buffer, for instance with
362  * var_set_initial_value().
363  */
364 static Var *
365 create_var(const char *name, const char *ename)
366 {
367 	return ohash_create_entry(&var_info, name, &ename);
368 }
369 
370 /* Initial version of var_set_value(), to be called after create_var().
371  */
372 static void
373 var_set_initial_value(Var *v, const char *val)
374 {
375 	size_t len;
376 
377 	len = strlen(val);
378 	Buf_Init(&(v->val), len+1);
379 	Buf_AddChars(&(v->val), len, val);
380 }
381 
382 /* Normal version of var_set_value(), to be called after variable is fully
383  * initialized.
384  */
385 static void
386 var_set_value(Var *v, const char *val)
387 {
388 	if ((v->flags & VAR_DUMMY) == 0) {
389 		Buf_Reset(&(v->val));
390 		Buf_AddString(&(v->val), val);
391 	} else {
392 		var_set_initial_value(v, val);
393 		v->flags &= ~VAR_DUMMY;
394 	}
395 }
396 
397 /* Add to a variable, insert a separating space if the variable was already
398  * defined.
399  */
400 static void
401 var_append_value(Var *v, const char *val)
402 {
403 	if ((v->flags & VAR_DUMMY) == 0) {
404 		Buf_AddSpace(&(v->val));
405 		Buf_AddString(&(v->val), val);
406 	} else {
407 		var_set_initial_value(v, val);
408 		v->flags &= ~VAR_DUMMY;
409 	}
410 }
411 
412 
413 /* Delete a variable and all the space associated with it.
414  */
415 static void
416 delete_var(Var *v)
417 {
418 	if ((v->flags & VAR_DUMMY) == 0)
419 		Buf_Destroy(&(v->val));
420 	free(v);
421 }
422 
423 
424 
425 
426 /***
427  ***	Dynamic variable handling.
428  ***/
429 
430 
431 
432 /* create empty symtable.
433  * XXX: to save space, dynamic variables may be NULL pointers.
434  */
435 void
436 SymTable_Init(SymTable *ctxt)
437 {
438 	static SymTable sym_template;
439 	memcpy(ctxt, &sym_template, sizeof(*ctxt));
440 }
441 
442 /* free symtable.
443  */
444 #ifdef CLEANUP
445 void
446 SymTable_Destroy(SymTable *ctxt)
447 {
448 	int i;
449 
450 	for (i = 0; i < LOCAL_SIZE; i++)
451 		if (ctxt->locals[i] != NULL)
452 			delete_var(ctxt->locals[i]);
453 }
454 #endif
455 
456 /***
457  ***	Global variable handling.
458  ***/
459 
460 /* Create a new global var if necessary, and set it up correctly.
461  * Do not take environment into account.
462  */
463 static Var *
464 find_global_var_without_env(const char *name, const char *ename, uint32_t k)
465 {
466 	unsigned int slot;
467 	Var *v;
468 
469 	slot = ohash_lookup_interval(&global_variables, name, ename, k);
470 	v = ohash_find(&global_variables, slot);
471 	if (v == NULL) {
472 		v = create_var(name, ename);
473 		v->flags = VAR_DUMMY;
474 		ohash_insert(&global_variables, slot, v);
475 	}
476 	return v;
477 }
478 
479 /* Helper for find_global_var(): grab environment value if needed.
480  */
481 static void
482 fill_from_env(Var *v)
483 {
484 	char	*env;
485 
486 	env = getenv(v->name);
487 	if (env == NULL)
488 		v->flags |= VAR_SEEN_ENV;
489 	else {
490 		var_set_value(v, env);
491 		v->flags |= VAR_FROM_ENV | VAR_SEEN_ENV;
492 	}
493 
494 #ifdef STATS_VAR_LOOKUP
495 	STAT_VAR_FROM_ENV++;
496 #endif
497 }
498 
499 /* Find global var, and obtain its value from the environment if needed.
500  */
501 static Var *
502 find_global_var(const char *name, const char *ename, uint32_t k)
503 {
504 	Var *v;
505 
506 	v = find_global_var_without_env(name, ename, k);
507 
508 	if ((v->flags & VAR_SEEN_ENV) == 0)
509 		if ((checkEnvFirst && (v->flags & VAR_FROM_CMD) == 0) ||
510 		    (v->flags & VAR_DUMMY) != 0)
511 			fill_from_env(v);
512 
513 	return v;
514 }
515 
516 /* mark variable as poisoned, in a given setup.
517  */
518 void
519 Var_MarkPoisoned(const char *name, const char *ename, unsigned int type)
520 {
521 	Var   *v;
522 	uint32_t	k;
523 	int		idx;
524 	idx = classify_var(name, &ename, &k);
525 
526 	if (idx != GLOBAL_INDEX) {
527 		Parse_Error(PARSE_FATAL,
528 		    "Trying to poison dynamic variable $%s",
529 		    varnames[idx]);
530 		return;
531 	}
532 
533 	v = find_global_var(name, ename, k);
534 	v->flags |= type;
535 	/* POISON_NORMAL is not lazy: if the variable already exists in
536 	 * the Makefile, then it's a mistake.
537 	 */
538 	if (v->flags & POISON_NORMAL) {
539 		if (v->flags & VAR_DUMMY)
540 			return;
541 		if (v->flags & VAR_FROM_ENV)
542 			return;
543 		Parse_Error(PARSE_FATAL,
544 		    "Poisoned variable %s is already set\n", v->name);
545 	}
546 }
547 
548 /* Check if there's any reason not to use the variable in this context.
549  */
550 static void
551 poison_check(Var *v)
552 {
553 	if (v->flags & POISON_NORMAL) {
554 		Parse_Error(PARSE_FATAL,
555 		    "Poisoned variable %s has been referenced\n", v->name);
556 		return;
557 	}
558 	if (v->flags & VAR_DUMMY) {
559 		Parse_Error(PARSE_FATAL,
560 		    "Poisoned variable %s is not defined\n", v->name);
561 		return;
562 	}
563 	if (v->flags & POISON_EMPTY)
564 		if (strcmp(var_get_value(v), "") == 0)
565 			Parse_Error(PARSE_FATAL,
566 			    "Poisoned variable %s is empty\n", v->name);
567 }
568 
569 /* Delete global variable.
570  */
571 void
572 Var_Deletei(const char *name, const char *ename)
573 {
574 	Var *v;
575 	uint32_t k;
576 	unsigned int slot;
577 	int idx;
578 
579 	idx = classify_var(name, &ename, &k);
580 	if (idx != GLOBAL_INDEX) {
581 		Parse_Error(PARSE_FATAL,
582 		    "Trying to delete dynamic variable $%s", varnames[idx]);
583 		return;
584 	}
585 	slot = ohash_lookup_interval(&global_variables, name, ename, k);
586 	v = ohash_find(&global_variables, slot);
587 
588 	if (v == NULL)
589 		return;
590 
591 	if (checkEnvFirst && (v->flags & VAR_FROM_ENV))
592 		return;
593 
594 	if (v->flags & VAR_FROM_CMD)
595 		return;
596 
597 	ohash_remove(&global_variables, slot);
598 	delete_var(v);
599 }
600 
601 /* Set or add a global variable, in VAR_CMD or VAR_GLOBAL context.
602  */
603 static void
604 var_set_append(const char *name, const char *ename, const char *val, int ctxt,
605     bool append)
606 {
607 	Var *v;
608 	uint32_t k;
609 	int idx;
610 
611 	idx = classify_var(name, &ename, &k);
612 	if (idx != GLOBAL_INDEX) {
613 		Parse_Error(PARSE_FATAL, "Trying to %s dynamic variable $%s",
614 		    append ? "append to" : "set", varnames[idx]);
615 		return;
616 	}
617 
618 	v = find_global_var(name, ename, k);
619 	if (v->flags & POISON_NORMAL)
620 		Parse_Error(PARSE_FATAL, "Trying to %s poisoned variable %s\n",
621 		    append ? "append to" : "set", v->name);
622 	/* so can we write to it ? */
623 	if (ctxt == VAR_CMD) {	/* always for command line */
624 		(append ? var_append_value : var_set_value)(v, val);
625 		v->flags |= VAR_FROM_CMD;
626 		if ((v->flags & VAR_SHELL) == 0) {
627 			/* Any variables given on the command line are
628 			 * automatically exported to the environment,
629 			 * except for SHELL (as per POSIX standard).
630 			 */
631 			esetenv(v->name, val);
632 		}
633 		if (DEBUG(VAR))
634 			printf("command:%s = %s\n", v->name, var_get_value(v));
635 	} else if ((v->flags & VAR_FROM_CMD) == 0 &&
636 	     (!checkEnvFirst || (v->flags & VAR_FROM_ENV) == 0)) {
637 		(append ? var_append_value : var_set_value)(v, val);
638 		if (DEBUG(VAR))
639 			printf("global:%s = %s\n", v->name, var_get_value(v));
640 	} else if (DEBUG(VAR))
641 		printf("overridden:%s = %s\n", v->name, var_get_value(v));
642 }
643 
644 void
645 Var_Seti_with_ctxt(const char *name, const char *ename, const char *val,
646     int ctxt)
647 {
648 	var_set_append(name, ename, val, ctxt, false);
649 }
650 
651 void
652 Var_Appendi_with_ctxt(const char *name, const char *ename, const char *val,
653     int ctxt)
654 {
655 	var_set_append(name, ename, val, ctxt, true);
656 }
657 
658 /* XXX different semantics for Var_Valuei() and Var_Definedi():
659  * references to poisoned value variables will error out in Var_Valuei(),
660  * but not in Var_Definedi(), so the following construct works:
661  *	.poison BINDIR
662  *	BINDIR ?= /usr/bin
663  */
664 char *
665 Var_Valuei(const char *name, const char *ename)
666 {
667 	Var *v;
668 	uint32_t k;
669 	int idx;
670 
671 	idx = classify_var(name, &ename, &k);
672 	if (idx != GLOBAL_INDEX) {
673 		Parse_Error(PARSE_FATAL,
674 		    "Trying to get value of dynamic variable $%s",
675 			varnames[idx]);
676 		return NULL;
677 	}
678 	v = find_global_var(name, ename, k);
679 	if (v->flags & POISONS)
680 		poison_check(v);
681 	if ((v->flags & VAR_DUMMY) == 0)
682 		return var_get_value(v);
683 	else
684 		return NULL;
685 }
686 
687 bool
688 Var_Definedi(const char *name, const char *ename)
689 {
690 	Var *v;
691 	uint32_t k;
692 	int idx;
693 
694 	idx = classify_var(name, &ename, &k);
695 	/* We don't bother writing an error message for dynamic variables,
696 	 * these will be caught when getting set later, usually.
697 	 */
698 	if (idx == GLOBAL_INDEX) {
699 		v = find_global_var(name, ename, k);
700 		if (v->flags & POISON_NORMAL)
701 			poison_check(v);
702 		if ((v->flags & VAR_DUMMY) == 0)
703 			return true;
704 	}
705 	return false;
706 }
707 
708 
709 /***
710  ***	Substitution functions, handling both global and dynamic variables.
711  ***/
712 
713 
714 /* All the scanning functions needed to account for all the forms of
715  * variable names that exist:
716  *	$A, ${AB}, $(ABC), ${A:mod}, $(A:mod)
717  */
718 
719 static const char *
720 find_rparen(const char *p)
721 {
722 	while (*p != '$' && *p != '\0' && *p != ')' && *p != ':')
723 		p++;
724 	return p;
725 }
726 
727 static const char *
728 find_ket(const char *p)
729 {
730 	while (*p != '$' && *p != '\0' && *p != '}' && *p != ':')
731 		p++;
732 	return p;
733 }
734 
735 /* Figure out what kind of name we're looking for from a start character.
736  */
737 static find_t
738 find_pos(int c)
739 {
740 	switch(c) {
741 	case '(':
742 		return find_rparen;
743 	case '{':
744 		return find_ket;
745 	default:
746 		Parse_Error(PARSE_FATAL,
747 		    "Wrong character in variable spec %c (can't happen)");
748 		return find_rparen;
749 	}
750 }
751 
752 static bool
753 parse_base_variable_name(const char **pstr, struct Name *name, SymTable *ctxt)
754 {
755 	const char *str = *pstr;
756 	const char *tstr;
757 	bool has_modifier = false;
758 
759 	switch(str[1]) {
760 	case '(':
761 	case '{':
762 		/* Find eventual modifiers in the variable */
763 		tstr = VarName_Get(str+2, name, ctxt, false, find_pos(str[1]));
764 		if (*tstr == ':')
765 			has_modifier = true;
766 		else if (*tstr != '\0') {
767 			tstr++;
768 		}
769 		break;
770 	default:
771 		name->s = str+1;
772 		name->e = str+2;
773 		name->tofree = false;
774 		tstr = str + 2;
775 		break;
776 	}
777 	*pstr = tstr;
778 	return has_modifier;
779 }
780 
781 bool
782 Var_ParseSkip(const char **pstr, SymTable *ctxt)
783 {
784 	const char *str = *pstr;
785 	struct Name name;
786 	bool result;
787 	bool has_modifier;
788 	const char *tstr = str;
789 
790 	has_modifier = parse_base_variable_name(&tstr, &name, ctxt);
791 	VarName_Free(&name);
792 	result = true;
793 	if (has_modifier) {
794 		bool freePtr = false;
795 		char *s = VarModifiers_Apply(NULL, NULL, ctxt, true, &freePtr,
796 		    &tstr, str[1]);
797 		if (s == var_Error)
798 			result = false;
799 		if (freePtr)
800 			free(s);
801 	}
802 	*pstr = tstr;
803 	return result;
804 }
805 
806 /* As of now, Var_ParseBuffer is just a wrapper around Var_Parse. For
807  * speed, it may be better to revisit the implementation to do things
808  * directly. */
809 bool
810 Var_ParseBuffer(Buffer buf, const char *str, SymTable *ctxt, bool err,
811     size_t *lengthPtr)
812 {
813 	char *result;
814 	bool freeIt;
815 
816 	result = Var_Parse(str, ctxt, err, lengthPtr, &freeIt);
817 	if (result == var_Error)
818 		return false;
819 
820 	Buf_AddString(buf, result);
821 	if (freeIt)
822 		free(result);
823 	return true;
824 }
825 
826 /* Helper function for Var_Parse: still recursive, but we tag what variables
827  * we expand for better error messages.
828  */
829 #define MAX_DEPTH 350
830 static Var *call_trace[MAX_DEPTH];
831 static int current_depth = 0;
832 
833 static void
834 push_used(Var *v)
835 {
836 	if (v->flags & VAR_IN_USE) {
837 		int i;
838 		fprintf(stderr, "Problem with variable expansion chain: ");
839 		for (i = 0;
840 		    i < (current_depth > MAX_DEPTH ? MAX_DEPTH : current_depth);
841 		    i++)
842 			fprintf(stderr, "%s -> ", call_trace[i]->name);
843 		fprintf(stderr, "%s\n", v->name);
844 		Fatal("\tVariable %s is recursive.", v->name);
845 		/*NOTREACHED*/
846 	}
847 
848 	v->flags |= VAR_IN_USE;
849 	if (current_depth < MAX_DEPTH)
850 		call_trace[current_depth] = v;
851 	current_depth++;
852 }
853 
854 static void
855 pop_used(Var *v)
856 {
857 	v->flags &= ~VAR_IN_USE;
858 	current_depth--;
859 }
860 
861 static char *
862 get_expanded_value(const char *name, const char *ename, int idx, uint32_t k,
863     SymTable *ctxt, bool err, bool *freePtr)
864 {
865 	char *val;
866 
867 	/* Before doing any modification, we have to make sure the
868 	 * value has been fully expanded. If it looks like recursion
869 	 * might be necessary (there's a dollar sign somewhere in
870 	 * the variable's value) we just call Var_Subst to do any
871 	 * other substitutions that are necessary. Note that the
872 	 * value returned by Var_Subst will have been dynamically
873 	 * allocated, so it will need freeing when we return.
874 	 */
875 	if (idx == GLOBAL_INDEX) {
876 		Var *v = find_global_var(name, ename, k);
877 
878 		if (v == NULL)
879 			return NULL;
880 
881 		if ((v->flags & POISONS) != 0)
882 			poison_check(v);
883 		if ((v->flags & VAR_DUMMY) != 0)
884 			return NULL;
885 
886 		val = var_get_value(v);
887 		if (strchr(val, '$') != NULL) {
888 			push_used(v);
889 			val = Var_Subst(val, ctxt, err);
890 			pop_used(v);
891 			*freePtr = true;
892 		}
893 	} else {
894 		if (ctxt != NULL) {
895 			if (idx < LOCAL_SIZE)
896 				val = ctxt->locals[idx];
897 			else
898 				val = ctxt->locals[EXTENDED2SIMPLE(idx)];
899 		} else
900 			val = NULL;
901 		if (val == NULL)
902 			return NULL;
903 
904 		if (idx >= LOCAL_SIZE) {
905 			if (IS_EXTENDED_F(idx))
906 				val = Var_GetTail(val);
907 			else
908 				val = Var_GetHead(val);
909 			*freePtr = true;
910 		}
911 	}
912 	return val;
913 }
914 
915 char *
916 Var_Parse(const char *str,	/* The string to parse */
917     SymTable *ctxt,		/* The context for the variable */
918     bool err,			/* true if undefined variables are an error */
919     size_t *lengthPtr,		/* OUT: The length of the specification */
920     bool *freePtr)		/* OUT: true if caller should free result */
921 {
922 	const char *tstr;
923 	struct Name name;
924 	char *val;
925 	uint32_t k;
926 	int idx;
927 	bool has_modifier;
928 
929 	*freePtr = false;
930 
931 	tstr = str;
932 
933 	has_modifier = parse_base_variable_name(&tstr, &name, ctxt);
934 
935 	idx = classify_var(name.s, &name.e, &k);
936 	val = get_expanded_value(name.s, name.e, idx, k, ctxt, err, freePtr);
937 	if (has_modifier) {
938 		val = VarModifiers_Apply(val, &name, ctxt, err, freePtr,
939 		    &tstr, str[1]);
940 	}
941 	if (val == NULL) {
942 		val = err ? var_Error : varNoError;
943 		/* Dynamic source */
944 		if (idx != GLOBAL_INDEX) {
945 			/* can't be expanded for now: copy the spec instead. */
946 			if (ctxt == NULL) {
947 				*freePtr = true;
948 				val = Str_dupi(str, tstr);
949 			} else {
950 			/* somehow, this should have been expanded already. */
951 				GNode *n;
952 
953 				/* XXX */
954 				n = (GNode *)(((char *)ctxt) -
955 				    offsetof(GNode, context));
956 				if (idx >= LOCAL_SIZE)
957 					idx = EXTENDED2SIMPLE(idx);
958 				switch(idx) {
959 				case IMPSRC_INDEX:
960 					Fatal(
961 "Using $< in a non-suffix rule context is a GNUmake idiom (line %lu of %s)",
962 					    n->origin.lineno, n->origin.fname);
963 					break;
964 				default:
965 					Error(
966 "Using undefined dynamic variable $%s (line %lu of %s)",
967 					    varnames[idx], n->origin.lineno,
968 					    n->origin.fname);
969 					break;
970 				}
971 			}
972 		}
973 	}
974 	VarName_Free(&name);
975 	*lengthPtr = tstr - str;
976 	return val;
977 }
978 
979 
980 char *
981 Var_Subst(const char *str,	/* the string in which to substitute */
982     SymTable *ctxt,		/* the context wherein to find variables */
983     bool undefErr)		/* true if undefineds are an error */
984 {
985 	BUFFER buf;		/* Buffer for forming things */
986 	static bool errorReported;
987 
988 	Buf_Init(&buf, MAKE_BSIZE);
989 	errorReported = false;
990 
991 	for (;;) {
992 		char *val;	/* Value to substitute for a variable */
993 		size_t length;	/* Length of the variable invocation */
994 		bool doFree;	/* Set true if val should be freed */
995 		const char *cp;
996 
997 		/* copy uninteresting stuff */
998 		for (cp = str; *str != '\0' && *str != '$'; str++)
999 			;
1000 		Buf_Addi(&buf, cp, str);
1001 		if (*str == '\0')
1002 			break;
1003 		if (str[1] == '$') {
1004 			/* A $ may be escaped with another $. */
1005 			Buf_AddChar(&buf, '$');
1006 			str += 2;
1007 			continue;
1008 		}
1009 		val = Var_Parse(str, ctxt, undefErr, &length, &doFree);
1010 		/* When we come down here, val should either point to the
1011 		 * value of this variable, suitably modified, or be NULL.
1012 		 * Length should be the total length of the potential
1013 		 * variable invocation (from $ to end character...) */
1014 		if (val == var_Error || val == varNoError) {
1015 			/* If errors are not an issue, skip over the variable
1016 			 * and continue with the substitution. Otherwise, store
1017 			 * the dollar sign and advance str so we continue with
1018 			 * the string...  */
1019 			if (errorIsOkay)
1020 				str += length;
1021 			else if (undefErr) {
1022 				/* If variable is undefined, complain and
1023 				 * skip the variable name. The complaint
1024 				 * will stop us from doing anything when
1025 				 * the file is parsed.  */
1026 				if (!errorReported)
1027 					Parse_Error(PARSE_FATAL,
1028 					     "Undefined variable \"%.*s\"",
1029 					     length, str);
1030 				str += length;
1031 				errorReported = true;
1032 			} else {
1033 				Buf_AddChar(&buf, *str);
1034 				str++;
1035 			}
1036 		} else {
1037 			/* We've now got a variable structure to store in.
1038 			 * But first, advance the string pointer.  */
1039 			str += length;
1040 
1041 			/* Copy all the characters from the variable value
1042 			 * straight into the new string.  */
1043 			Buf_AddString(&buf, val);
1044 			if (doFree)
1045 				free(val);
1046 		}
1047 	}
1048 	return  Buf_Retrieve(&buf);
1049 }
1050 
1051 static BUFFER subst_buffer;
1052 
1053 /* we would like to subst on intervals, but it's complicated, so we cheat
1054  * by storing the interval in a static buffer.
1055  */
1056 char *
1057 Var_Substi(const char *str, const char *estr, SymTable *ctxt, bool undefErr)
1058 {
1059 	/* delimited string: no need to copy */
1060 	if (estr == NULL || *estr == '\0')
1061 		return Var_Subst(str, ctxt, undefErr);
1062 
1063 	Buf_Reset(&subst_buffer);
1064 	Buf_Addi(&subst_buffer, str, estr);
1065 	return Var_Subst(Buf_Retrieve(&subst_buffer), ctxt, undefErr);
1066 }
1067 
1068 /***
1069  ***	Supplementary support for .for loops.
1070  ***/
1071 
1072 
1073 
1074 struct LoopVar
1075 {
1076 	Var old;	/* keep old variable value (before the loop) */
1077 	Var *me;	/* the variable we're dealing with */
1078 };
1079 
1080 
1081 struct LoopVar *
1082 Var_NewLoopVar(const char *name, const char *ename)
1083 {
1084 	struct LoopVar *l;
1085 	uint32_t k;
1086 
1087 	l = emalloc(sizeof(struct LoopVar));
1088 
1089 	/* we obtain a new variable quickly, make a snapshot of its old
1090 	 * value, and make sure the environment cannot touch us.
1091 	 */
1092 	/* XXX: should we avoid dynamic variables ? */
1093 	k = ohash_interval(name, &ename);
1094 
1095 	l->me = find_global_var_without_env(name, ename, k);
1096 	l->old = *(l->me);
1097 	l->me->flags = VAR_SEEN_ENV | VAR_DUMMY;
1098 	return l;
1099 }
1100 
1101 char *
1102 Var_LoopVarName(struct LoopVar *v)
1103 {
1104 	return v->me->name;
1105 }
1106 
1107 void
1108 Var_DeleteLoopVar(struct LoopVar *l)
1109 {
1110 	if ((l->me->flags & VAR_DUMMY) == 0)
1111 		Buf_Destroy(&(l->me->val));
1112 	*(l->me) = l->old;
1113 	free(l);
1114 }
1115 
1116 void
1117 Var_SubstVar(Buffer buf,	/* To store result */
1118     const char *str,		/* The string in which to substitute */
1119     struct LoopVar *l,		/* Handle */
1120     const char *val)		/* Its value */
1121 {
1122 	const char *var = l->me->name;
1123 
1124 	var_set_value(l->me, val);
1125 
1126 	for (;;) {
1127 		const char *start;
1128 		/* Copy uninteresting stuff */
1129 		for (start = str; *str != '\0' && *str != '$'; str++)
1130 			;
1131 		Buf_Addi(buf, start, str);
1132 
1133 		start = str;
1134 		if (*str++ == '\0')
1135 			break;
1136 		str++;
1137 		/* and escaped dollars */
1138 		if (start[1] == '$') {
1139 			Buf_Addi(buf, start, start+2);
1140 			continue;
1141 		}
1142 		/* Simple variable, if it's not us, copy.  */
1143 		if (start[1] != '(' && start[1] != '{') {
1144 			if (start[1] != *var || var[1] != '\0') {
1145 				Buf_AddChars(buf, 2, start);
1146 				continue;
1147 		    }
1148 		} else {
1149 			const char *p;
1150 			char paren = start[1];
1151 
1152 
1153 			/* Find the end of the variable specification.  */
1154 			p = find_pos(paren)(str);
1155 			/* A variable inside the variable. We don't know how to
1156 			 * expand the external variable at this point, so we
1157 			 * try  again with the nested variable.	*/
1158 			if (*p == '$') {
1159 				Buf_Addi(buf, start, p);
1160 				str = p;
1161 				continue;
1162 			}
1163 
1164 			if (strncmp(var, str, p - str) != 0 ||
1165 				var[p - str] != '\0') {
1166 				/* Not the variable we want to expand.	*/
1167 				Buf_Addi(buf, start, p);
1168 				str = p;
1169 				continue;
1170 			}
1171 			if (*p == ':') {
1172 				bool doFree;	/* should val be freed ? */
1173 				char *newval;
1174 				struct Name name;
1175 
1176 				doFree = false;
1177 				name.s = var;
1178 				name.e = var + (p-str);
1179 
1180 				/* val won't be freed since !doFree, but
1181 				 * VarModifiers_Apply doesn't know that,
1182 				 * hence the cast. */
1183 				newval = VarModifiers_Apply((char *)val,
1184 				    &name, NULL, false, &doFree, &p, paren);
1185 				Buf_AddString(buf, newval);
1186 				if (doFree)
1187 					free(newval);
1188 				str = p;
1189 				continue;
1190 			} else
1191 				str = p+1;
1192 		}
1193 		Buf_AddString(buf, val);
1194 	}
1195 }
1196 
1197 /***
1198  ***	Odds and ends
1199  ***/
1200 
1201 static void
1202 set_magic_shell_variable()
1203 {
1204 	const char *name = "SHELL";
1205 	const char *ename = NULL;
1206 	uint32_t k;
1207 	Var *v;
1208 
1209 	k = ohash_interval(name, &ename);
1210 	v = find_global_var_without_env(name, ename, k);
1211 	var_set_value(v, _PATH_BSHELL);
1212 	/* XXX the environment shall never affect it */
1213 	v->flags = VAR_SHELL | VAR_SEEN_ENV;
1214 }
1215 
1216 /*
1217  * Var_Init
1218  *	Initialize the module
1219  */
1220 void
1221 Var_Init(void)
1222 {
1223 	ohash_init(&global_variables, 10, &var_info);
1224 	set_magic_shell_variable();
1225 
1226 
1227 	errorIsOkay = true;
1228 	Var_setCheckEnvFirst(false);
1229 
1230 	VarModifiers_Init();
1231 	Buf_Init(&subst_buffer, MAKE_BSIZE);
1232 }
1233 
1234 
1235 #ifdef CLEANUP
1236 void
1237 Var_End(void)
1238 {
1239 	Var *v;
1240 	unsigned int i;
1241 
1242 	for (v = ohash_first(&global_variables, &i); v != NULL;
1243 	    v = ohash_next(&global_variables, &i))
1244 		delete_var(v);
1245 }
1246 #endif
1247 
1248 static const char *interpret(int);
1249 
1250 static const char *
1251 interpret(int f)
1252 {
1253 	if (f & VAR_DUMMY)
1254 		return "(D)";
1255 	return "";
1256 }
1257 
1258 
1259 static void
1260 print_var(Var *v)
1261 {
1262 	printf("%-16s%s = %s\n", v->name, interpret(v->flags),
1263 	    (v->flags & VAR_DUMMY) == 0 ? var_get_value(v) : "(none)");
1264 }
1265 
1266 void
1267 Var_Dump(void)
1268 {
1269 	Var *v;
1270 	unsigned int i;
1271 
1272 	printf("#*** Global Variables:\n");
1273 
1274 	for (v = ohash_first(&global_variables, &i); v != NULL;
1275 	    v = ohash_next(&global_variables, &i))
1276 		print_var(v);
1277 }
1278 
1279 static const char *quotable = " \t\n\\'\"";
1280 
1281 /* POSIX says that variable assignments passed on the command line should be
1282  * propagated to sub makes through MAKEFLAGS.
1283  */
1284 void
1285 Var_AddCmdline(const char *name)
1286 {
1287 	Var *v;
1288 	unsigned int i;
1289 	BUFFER buf;
1290 	char *s;
1291 
1292 	Buf_Init(&buf, MAKE_BSIZE);
1293 
1294 	for (v = ohash_first(&global_variables, &i); v != NULL;
1295 	    v = ohash_next(&global_variables, &i)) {
1296 		/* This is not as expensive as it looks: this function is
1297 		 * called before parsing Makefiles, so there are just a
1298 		 * few non cmdling variables in there.
1299 		 */
1300 		if (!(v->flags & VAR_FROM_CMD)) {
1301 			continue;
1302 		}
1303 		/* We assume variable names don't need quoting */
1304 		Buf_AddString(&buf, v->name);
1305 		Buf_AddChar(&buf, '=');
1306 		for (s = var_get_value(v); *s != '\0'; s++) {
1307 			if (strchr(quotable, *s))
1308 				Buf_AddChar(&buf, '\\');
1309 			Buf_AddChar(&buf, *s);
1310 		}
1311 		Buf_AddSpace(&buf);
1312 	}
1313 	Var_Append(name, Buf_Retrieve(&buf));
1314 	Buf_Destroy(&buf);
1315 }
1316