diff options
author | Igor Pashev <igor.pashev@nexenta.com> | 2012-06-29 14:36:07 +0400 |
---|---|---|
committer | Igor Pashev <igor.pashev@nexenta.com> | 2012-06-29 14:36:07 +0400 |
commit | e0463df9c3d2ee6155221cc443c571d5da47098a (patch) | |
tree | 5c6b99e64c1b65d986e2722728c74f202a578be6 /usr/src/make_src/Make/bin/make/common/macro.cc | |
download | sunmake-e0463df9c3d2ee6155221cc443c571d5da47098a.tar.gz |
Initial import of DevPro make sourcesorig
Downloaded from http://dlc.sun.com/osol/devpro/downloads/current/
Licensed under CDDL http://www.opensource.org/licenses/CDDL-1.0
Diffstat (limited to 'usr/src/make_src/Make/bin/make/common/macro.cc')
-rw-r--r-- | usr/src/make_src/Make/bin/make/common/macro.cc | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/usr/src/make_src/Make/bin/make/common/macro.cc b/usr/src/make_src/Make/bin/make/common/macro.cc new file mode 100644 index 0000000..0f5bf82 --- /dev/null +++ b/usr/src/make_src/Make/bin/make/common/macro.cc @@ -0,0 +1,214 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ +/* + * @(#)macro.cc 1.28 06/12/12 + */ + +#pragma ident "@(#)macro.cc 1.28 06/12/12" + +/* + * macro.cc + * + * Handle expansion of make macros + */ + +/* + * Included files + */ +#ifdef DISTRIBUTED +#include <avo/strings.h> /* AVO_STRDUP() */ +#include <dm/Avo_DoJobMsg.h> +#endif +#include <mk/defs.h> +#include <mksh/macro.h> /* getvar(), expand_value() */ +#include <mksh/misc.h> /* getmem() */ + +/* + * Defined macros + */ + +/* + * typedefs & structs + */ + +/* + * Static variables + */ + +/* + * File table of contents + */ + +void +setvar_append(register Name name, register Name value) +{ + register Property macro_apx = get_prop(name->prop, macro_append_prop); + register Property macro = get_prop(name->prop, macro_prop); + int length; + String_rec destination; + wchar_t buffer[STRING_BUFFER_LENGTH]; + register Chain chain; + Name val = NULL; + + if(macro_apx == NULL) { + macro_apx = append_prop(name, macro_append_prop); + if(macro != NULL) { + macro_apx->body.macro_appendix.value = macro->body.macro.value; + } + } + + val = macro_apx->body.macro_appendix.value_to_append; + + INIT_STRING_FROM_STACK(destination, buffer); + buffer[0] = 0; + if (val != NULL) { + APPEND_NAME(val, + &destination, + (int) val->hash.length); + if (value != NULL) { + MBTOWC(wcs_buffer, " "); + append_char(wcs_buffer[0], &destination); + } + } + if (value != NULL) { + APPEND_NAME(value, + &destination, + (int) value->hash.length); + } + value = GETNAME(destination.buffer.start, FIND_LENGTH); + if (destination.free_after_use) { + retmem(destination.buffer.start); + } + macro_apx->body.macro_appendix.value_to_append = value; + + SETVAR(name, empty_name, true); +} + +/* + * setvar_envvar() + * + * This function scans the list of environment variables that have + * dynamic values and sets them. + * + * Parameters: + * + * Global variables used: + * envvar A list of environment vars with $ in value + */ +void +#ifdef DISTRIBUTED +setvar_envvar(Avo_DoJobMsg *dmake_job_msg) +#else +setvar_envvar(void) +#endif +{ + wchar_t buffer[STRING_BUFFER_LENGTH]; + int length; +#ifdef DISTRIBUTED + Property macro; +#endif + register char *mbs, *tmp_mbs_buffer = NULL; + register char *env, *tmp_mbs_buffer2 = NULL; + Envvar p; + String_rec value; + + for (p = envvar; p != NULL; p = p->next) { + if (p->already_put +#ifdef DISTRIBUTED + && !dmake_job_msg +#endif + ) { + continue; + } + INIT_STRING_FROM_STACK(value, buffer); + expand_value(p->value, &value, false); + if ((length = wslen(value.buffer.start)) >= MAXPATHLEN) { + mbs = tmp_mbs_buffer = getmem((length + 1) * MB_LEN_MAX); + (void) wcstombs(mbs, + value.buffer.start, + (length + 1) * MB_LEN_MAX); + } else { + mbs = mbs_buffer; + WCSTOMBS(mbs, value.buffer.start); + } + length = 2 + strlen(p->name->string_mb) + strlen(mbs); + if (!p->already_put || length > (MAXPATHLEN * MB_LEN_MAX)) { + env = tmp_mbs_buffer2 = getmem(length); + } else { + env = mbs_buffer2; + } + (void) sprintf(env, + "%s=%s", + p->name->string_mb, + mbs); + if (!p->already_put) { + (void) putenv(env); + p->already_put = true; + if (p->env_string) { + retmem_mb(p->env_string); + } + p->env_string = env; + tmp_mbs_buffer2 = NULL; // We should not return this memory now + } +#ifdef DISTRIBUTED + if (dmake_job_msg) { + dmake_job_msg->appendVar(env); + } +#endif + if (tmp_mbs_buffer2) { + retmem_mb(tmp_mbs_buffer2); + tmp_mbs_buffer2 = NULL; + } + if (tmp_mbs_buffer) { + retmem_mb(tmp_mbs_buffer); + tmp_mbs_buffer = NULL; + } + } +#ifdef DISTRIBUTED + /* Append SUNPRO_DEPENDENCIES to the dmake_job_msg. */ + if (keep_state && dmake_job_msg) { + macro = get_prop(sunpro_dependencies->prop, macro_prop); + length = 2 + + strlen(sunpro_dependencies->string_mb) + + strlen(macro->body.macro.value->string_mb); + if (length > (MAXPATHLEN * MB_LEN_MAX)) { + env = tmp_mbs_buffer2 = getmem(length); + } else { + env = mbs_buffer2; + } + (void) sprintf(env, + "%s=%s", + sunpro_dependencies->string_mb, + macro->body.macro.value->string_mb); + dmake_job_msg->appendVar(env); + if (tmp_mbs_buffer2) { + retmem_mb(tmp_mbs_buffer2); + tmp_mbs_buffer2 = NULL; + } + } +#endif +} + + |