xref: /illumos-gate/usr/src/cmd/make/bin/macro.cc (revision e7afc443)
110d63b7dSRichard Lowe /*
210d63b7dSRichard Lowe  * CDDL HEADER START
310d63b7dSRichard Lowe  *
410d63b7dSRichard Lowe  * The contents of this file are subject to the terms of the
510d63b7dSRichard Lowe  * Common Development and Distribution License (the "License").
610d63b7dSRichard Lowe  * You may not use this file except in compliance with the License.
710d63b7dSRichard Lowe  *
810d63b7dSRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910d63b7dSRichard Lowe  * or http://www.opensolaris.org/os/licensing.
1010d63b7dSRichard Lowe  * See the License for the specific language governing permissions
1110d63b7dSRichard Lowe  * and limitations under the License.
1210d63b7dSRichard Lowe  *
1310d63b7dSRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
1410d63b7dSRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510d63b7dSRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
1610d63b7dSRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
1710d63b7dSRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
1810d63b7dSRichard Lowe  *
1910d63b7dSRichard Lowe  * CDDL HEADER END
2010d63b7dSRichard Lowe  */
2110d63b7dSRichard Lowe /*
2210d63b7dSRichard Lowe  * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
2310d63b7dSRichard Lowe  * Use is subject to license terms.
2410d63b7dSRichard Lowe  */
2510d63b7dSRichard Lowe 
2610d63b7dSRichard Lowe /*
2710d63b7dSRichard Lowe  *	macro.cc
2810d63b7dSRichard Lowe  *
2910d63b7dSRichard Lowe  *	Handle expansion of make macros
3010d63b7dSRichard Lowe  */
3110d63b7dSRichard Lowe 
3210d63b7dSRichard Lowe /*
3310d63b7dSRichard Lowe  * Included files
3410d63b7dSRichard Lowe  */
3510d63b7dSRichard Lowe #include <mk/defs.h>
3610d63b7dSRichard Lowe #include <mksh/macro.h>		/* getvar(), expand_value() */
3710d63b7dSRichard Lowe #include <mksh/misc.h>		/* getmem() */
3810d63b7dSRichard Lowe 
3910d63b7dSRichard Lowe /*
4010d63b7dSRichard Lowe  * Defined macros
4110d63b7dSRichard Lowe  */
4210d63b7dSRichard Lowe 
4310d63b7dSRichard Lowe /*
4410d63b7dSRichard Lowe  * typedefs & structs
4510d63b7dSRichard Lowe  */
4610d63b7dSRichard Lowe 
4710d63b7dSRichard Lowe /*
4810d63b7dSRichard Lowe  * Static variables
4910d63b7dSRichard Lowe  */
5010d63b7dSRichard Lowe 
5110d63b7dSRichard Lowe /*
5210d63b7dSRichard Lowe  * File table of contents
5310d63b7dSRichard Lowe  */
5410d63b7dSRichard Lowe 
5510d63b7dSRichard Lowe void
setvar_append(Name name,Name value)56*e7afc443SToomas Soome setvar_append(Name name, Name value)
5710d63b7dSRichard Lowe {
58*e7afc443SToomas Soome 	Property	macro_apx = get_prop(name->prop, macro_append_prop);
59*e7afc443SToomas Soome 	Property	macro = get_prop(name->prop, macro_prop);
6010d63b7dSRichard Lowe 	int			length;
6110d63b7dSRichard Lowe 	String_rec		destination;
6210d63b7dSRichard Lowe 	wchar_t			buffer[STRING_BUFFER_LENGTH];
63*e7afc443SToomas Soome 	Chain		chain;
6410d63b7dSRichard Lowe 	Name			val = NULL;
6510d63b7dSRichard Lowe 
6610d63b7dSRichard Lowe 	if(macro_apx == NULL) {
6710d63b7dSRichard Lowe 		macro_apx = append_prop(name, macro_append_prop);
6810d63b7dSRichard Lowe 		if(macro != NULL) {
6910d63b7dSRichard Lowe 			macro_apx->body.macro_appendix.value = macro->body.macro.value;
7010d63b7dSRichard Lowe 		}
7110d63b7dSRichard Lowe 	}
7210d63b7dSRichard Lowe 
7310d63b7dSRichard Lowe 	val = macro_apx->body.macro_appendix.value_to_append;
7410d63b7dSRichard Lowe 
7510d63b7dSRichard Lowe 	INIT_STRING_FROM_STACK(destination, buffer);
7610d63b7dSRichard Lowe 	buffer[0] = 0;
7710d63b7dSRichard Lowe 	if (val != NULL) {
7810d63b7dSRichard Lowe 		APPEND_NAME(val,
7910d63b7dSRichard Lowe 			      &destination,
8010d63b7dSRichard Lowe 			      (int) val->hash.length);
8110d63b7dSRichard Lowe 		if (value != NULL) {
8210d63b7dSRichard Lowe 			MBTOWC(wcs_buffer, " ");
8310d63b7dSRichard Lowe 			append_char(wcs_buffer[0], &destination);
8410d63b7dSRichard Lowe 		}
8510d63b7dSRichard Lowe 	}
8610d63b7dSRichard Lowe 	if (value != NULL) {
8710d63b7dSRichard Lowe 		APPEND_NAME(value,
8810d63b7dSRichard Lowe 			      &destination,
8910d63b7dSRichard Lowe 			      (int) value->hash.length);
9010d63b7dSRichard Lowe 	}
9110d63b7dSRichard Lowe 	value = GETNAME(destination.buffer.start, FIND_LENGTH);
9210d63b7dSRichard Lowe 	if (destination.free_after_use) {
9310d63b7dSRichard Lowe 		retmem(destination.buffer.start);
9410d63b7dSRichard Lowe 	}
9510d63b7dSRichard Lowe 	macro_apx->body.macro_appendix.value_to_append = value;
9610d63b7dSRichard Lowe 
9710d63b7dSRichard Lowe 	SETVAR(name, empty_name, true);
9810d63b7dSRichard Lowe }
9910d63b7dSRichard Lowe 
10010d63b7dSRichard Lowe /*
10110d63b7dSRichard Lowe  *	setvar_envvar()
10210d63b7dSRichard Lowe  *
10310d63b7dSRichard Lowe  *	This function scans the list of environment variables that have
10410d63b7dSRichard Lowe  *	dynamic values and sets them.
10510d63b7dSRichard Lowe  *
10610d63b7dSRichard Lowe  *	Parameters:
10710d63b7dSRichard Lowe  *
10810d63b7dSRichard Lowe  *	Global variables used:
10910d63b7dSRichard Lowe  *		envvar		A list of environment vars with $ in value
11010d63b7dSRichard Lowe  */
11110d63b7dSRichard Lowe void
setvar_envvar(void)11210d63b7dSRichard Lowe setvar_envvar(void)
11310d63b7dSRichard Lowe {
11410d63b7dSRichard Lowe 	wchar_t			buffer[STRING_BUFFER_LENGTH];
11510d63b7dSRichard Lowe 	int			length;
116*e7afc443SToomas Soome 	char	*mbs, *tmp_mbs_buffer = NULL;
117*e7afc443SToomas Soome 	char	*env, *tmp_mbs_buffer2 = NULL;
11810d63b7dSRichard Lowe 	Envvar			p;
11910d63b7dSRichard Lowe 	String_rec		value;
12010d63b7dSRichard Lowe 
12110d63b7dSRichard Lowe 	for (p = envvar; p != NULL; p = p->next) {
12210d63b7dSRichard Lowe 		if (p->already_put
12310d63b7dSRichard Lowe 		    ) {
12410d63b7dSRichard Lowe 			continue;
12510d63b7dSRichard Lowe 		}
126ae389aa9SAndy Fiddaman 		INIT_STRING_FROM_STACK(value, buffer);
12710d63b7dSRichard Lowe 		expand_value(p->value, &value, false);
12810d63b7dSRichard Lowe 		if ((length = wcslen(value.buffer.start)) >= MAXPATHLEN) {
12910d63b7dSRichard Lowe 			mbs = tmp_mbs_buffer = getmem((length + 1) * MB_LEN_MAX);
13010d63b7dSRichard Lowe 			(void) wcstombs(mbs,
13110d63b7dSRichard Lowe 			                value.buffer.start,
13210d63b7dSRichard Lowe 			                (length + 1) * MB_LEN_MAX);
13310d63b7dSRichard Lowe 		} else {
13410d63b7dSRichard Lowe 			mbs = mbs_buffer;
13510d63b7dSRichard Lowe 			WCSTOMBS(mbs, value.buffer.start);
13610d63b7dSRichard Lowe 		}
13710d63b7dSRichard Lowe 		length = 2 + strlen(p->name->string_mb) + strlen(mbs);
13810d63b7dSRichard Lowe 		if (!p->already_put || length > (MAXPATHLEN * MB_LEN_MAX)) {
13910d63b7dSRichard Lowe 			env = tmp_mbs_buffer2 = getmem(length);
14010d63b7dSRichard Lowe 		} else {
14110d63b7dSRichard Lowe 			env = mbs_buffer2;
14210d63b7dSRichard Lowe 		}
14310d63b7dSRichard Lowe 		(void) sprintf(env,
14410d63b7dSRichard Lowe 			       "%s=%s",
14510d63b7dSRichard Lowe 			       p->name->string_mb,
14610d63b7dSRichard Lowe 			       mbs);
14710d63b7dSRichard Lowe 		if (!p->already_put) {
14810d63b7dSRichard Lowe 			(void) putenv(env);
14910d63b7dSRichard Lowe 			p->already_put = true;
15010d63b7dSRichard Lowe 			if (p->env_string) {
15110d63b7dSRichard Lowe 				retmem_mb(p->env_string);
15210d63b7dSRichard Lowe 			}
15310d63b7dSRichard Lowe 			p->env_string = env;
15410d63b7dSRichard Lowe 			tmp_mbs_buffer2 = NULL; // We should not return this memory now
15510d63b7dSRichard Lowe 		}
15610d63b7dSRichard Lowe 		if (tmp_mbs_buffer2) {
15710d63b7dSRichard Lowe 			retmem_mb(tmp_mbs_buffer2);
15810d63b7dSRichard Lowe 			tmp_mbs_buffer2 = NULL;
15910d63b7dSRichard Lowe 		}
16010d63b7dSRichard Lowe 		if (tmp_mbs_buffer) {
16110d63b7dSRichard Lowe 			retmem_mb(tmp_mbs_buffer);
16210d63b7dSRichard Lowe 			tmp_mbs_buffer = NULL;
16310d63b7dSRichard Lowe 		}
16410d63b7dSRichard Lowe 	}
16510d63b7dSRichard Lowe }
16610d63b7dSRichard Lowe 
16710d63b7dSRichard Lowe 
168