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