10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER START
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The contents of this file are subject to the terms of the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Common Development and Distribution License (the "License").
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You may not use this file except in compliance with the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or http://www.opensolaris.org/os/licensing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * See the License for the specific language governing permissions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and limitations under the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * When distributing Covered Code, include this CDDL HEADER in each
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If applicable, add the following below this CDDL HEADER, with the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER END
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * macro.cc
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Handle expansion of make macros
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Included files
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/dosys.h> /* sh_command2string() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/i18n.h> /* get_char_semantics_value() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/macro.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/misc.h> /* retmem() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/read.h> /* get_next_block_fn() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <libintl.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * File table of contents
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void add_macro_to_global_list(Name macro_to_add);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void expand_value_with_daemon(Name, register Property macro, register String destination, Boolean cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void init_arch_macros(void);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void init_mach_macros(void);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean init_arch_done = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean init_mach_done = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowelong env_alloc_num = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowelong env_alloc_bytes = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * getvar(name)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return expanded value of macro.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The expanded value of the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name The name of the macro we want the value for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweName
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowegetvar(register Name name)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec destination;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t buffer[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Name result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((name == host_arch) || (name == target_arch)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!init_arch_done) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_arch_done = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_arch_macros();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((name == host_mach) || (name == target_mach)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!init_mach_done) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_mach_done = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_mach_macros();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(destination, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value(maybe_append_prop(name, macro_prop)->body.macro.value,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result = GETNAME(destination.buffer.start, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (destination.free_after_use) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(destination.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * expand_value(value, destination, cmd)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Recursively expands all macros in the string value.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * destination is where the expanded value should be appended.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * value The value we are expanding
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * destination Where to deposit the expansion
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * cmd If we are evaluating a command line we
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * turn \ quoting off
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweexpand_value(Name value, register String destination, Boolean cmd)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Source_rec sourceb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Source source = &sourceb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *source_p = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *source_end = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *block_start = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int quote_seen = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Make sure to get a string allocated even if it
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * will be empty.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(wcs_buffer, destination, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination->text.end = destination->text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!value->dollar) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If the value we are expanding does not contain
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * any $, we don't have to parse it.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe APPEND_NAME(value,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) value->hash.length
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe );
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination->text.end = destination->text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value->being_expanded) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("Loop detected when expanding macro value `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value->being_expanded = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Setup the structure we read from */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring vals(value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.string.text.p = sourceb.string.buffer.start = wcsdup(vals.get_string());
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.string.free_after_use = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.string.text.end =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.string.buffer.end =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.string.text.p + value->hash.length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.previous = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.fd = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.inp_buf =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.inp_buf_ptr =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.inp_buf_end = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sourceb.error_converting = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Lift some pointers from the struct to local register variables */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe CACHE_SOURCE(0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* We parse the string in segments */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* We read chars until we find a $, then we append what we have read so far */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* (since last $ processing) to the destination. When we find a $ we call */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* expand_macro() and let it expand that particular $ reference into dest */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_seen = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; 1; source_p++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (GET_CHAR()) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case backslash_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Quote $ in macro value */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!cmd) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_seen = ~quote_seen;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case dollar_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Save the plain string we found since */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* start of string or previous $ */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (quote_seen) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source->string.text.p = ++source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe UNCACHE_SOURCE();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Go expand the macro reference */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_macro(source, destination, sourceb.string.buffer.start, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe CACHE_SOURCE(1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case nul_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* The string ran out. Get some more */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe GET_NEXT_BLOCK_NOCHK(source);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination->text.end = destination->text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value->being_expanded = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source->error_converting) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh("Internal error: Invalid byte sequence in expand_value()");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_seen = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(sourceb.string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * expand_macro(source, destination, current_string, cmd)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Should be called with source->string.text.p pointing to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the first char after the $ that starts a macro reference.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * source->string.text.p is returned pointing to the first char after
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the macro name.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * It will read the macro name, expanding any macros in it,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and get the value. The value is then expanded.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * destination is a String that is filled in with the expanded macro.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * It may be passed in referencing a buffer to expand the macro into.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Note that most expansions are done on demand, e.g. right
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * before the command is executed and not while the file is
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * being parsed.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * source The source block that references the string
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * to expand
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * destination Where to put the result
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_string The string we are expanding, for error msg
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * cmd If we are evaluating a command line we
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * turn \ quoting off
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * funny Vector of semantic tags for characters
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * is_conditional Set if a conditional macro is refd
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * make_word_mentioned Set if the word "MAKE" is mentioned
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * makefile_type We deliver extra msg when reading makefiles
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * query The Name "?", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * query_mentioned Set if the word "?" is mentioned
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweexpand_macro(register Source source, register String destination, wchar_t *current_string, Boolean cmd)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Name make = (Name)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static wchar_t colon_sh[4];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static wchar_t colon_shell[7];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t buffer[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *source_p = source->string.text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *source_end = source->string.text.end;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int closer = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *block_start = (wchar_t *)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int quote_seen = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int closer_level = 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name name = (Name)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *colon = (wchar_t *)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *percent = (wchar_t *)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *eq = (wchar_t *) NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property macro = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *p = (wchar_t*)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec extracted;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t extracted_string[MAXPATHLEN];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *left_head = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *left_tail = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *right_tail = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int left_head_len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int left_tail_len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int tmp_len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *right_hand[128];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int i = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_extract,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dir_extract,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe file_extract
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } extraction = no_extract;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_replace,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe suffix_replace,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern_replace,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sh_replace
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } replacement = no_replace;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (make == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "MAKE");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make = GETNAME(wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(colon_sh, ":sh");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(colon_shell, ":shell");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[0] = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* First copy the (macro-expanded) macro name into string. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(string, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowerecheck_first_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check the first char of the macro name to figure out what to do. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (GET_CHAR()) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case nul_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe GET_NEXT_BLOCK_NOCHK(source);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe WCSTOMBS(mbs_buffer, current_string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("'$' at end of string `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mbs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source->error_converting) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh("Internal error: Invalid byte sequence in expand_macro()");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto recheck_first_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case parenleft_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Multi char name. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe closer = (int) parenright_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case braceleft_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Multi char name. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe closer = (int) braceright_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case newline_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("'$' at end of line"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Single char macro name. Just suck it up */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_char(*source_p, &string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source->string.text.p = source_p + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto get_macro_value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Handle multi-char macro names */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = ++source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_seen = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; 1; source_p++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (GET_CHAR()) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case nul_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &string,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe GET_NEXT_BLOCK_NOCHK(source);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (current_string != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe WCSTOMBS(mbs_buffer, current_string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("Unmatched `%c' in string `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe closer ==
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) braceright_char ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) braceleft_char :
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) parenleft_char,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mbs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("Premature EOF"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source->error_converting) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh("Internal error: Invalid byte sequence in expand_macro()");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case newline_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("Unmatched `%c' on line"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe closer == (int) braceright_char ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) braceleft_char :
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) parenleft_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case backslash_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Quote dollar in macro value. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!cmd) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_seen = ~quote_seen;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case dollar_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Macro names may reference macros.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This expands the value of such macros into the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * macro name string.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (quote_seen) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &string,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &string,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source->string.text.p = ++source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe UNCACHE_SOURCE();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_macro(source, &string, current_string, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe CACHE_SOURCE(0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = source_p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case parenleft_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Allow nested pairs of () in the macro name. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (closer == (int) parenright_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe closer_level++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case braceleft_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Allow nested pairs of {} in the macro name. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (closer == (int) braceright_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe closer_level++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case parenright_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case braceright_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * End of the name. Save the string in the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name string.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*source_p == closer) && (--closer_level <= 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source->string.text.p = source_p + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &string,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto get_macro_value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_seen = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * We got the macro name. We now inspect it to see if it
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * specifies any translations of the value.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweget_macro_value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* First check if we have a $(@D) type translation. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((get_char_semantics_value(string.buffer.start[0]) &
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) special_macro_sem) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (string.text.p - string.buffer.start >= 2) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((string.buffer.start[1] == 'D') ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (string.buffer.start[1] == 'F'))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (string.buffer.start[1]) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 'D':
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extraction = dir_extract;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 'F':
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extraction = file_extract;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe WCSTOMBS(mbs_buffer, string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("Illegal macro reference `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mbs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Internalize the macro name using the first char only. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(string.buffer.start, 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(string.buffer.start, string.buffer.start + 2);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check for other kinds of translations. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((colon = (wchar_t *) wcschr(string.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) colon_char)) != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * We have a $(FOO:.c=.o) type translation.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Get the name of the macro proper.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(string.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon - string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Pickup all the translations. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (IS_WEQUAL(colon, colon_sh) || IS_WEQUAL(colon, colon_shell)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe replacement = sh_replace;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if ((svr4) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((percent = (wchar_t *) wcschr(colon + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) percent_char)) == NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (colon != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((eq = (wchar_t *) wcschr(colon + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) equal_char)) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("= missing from replacement macro reference"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail_len = eq - colon - 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(left_tail) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(left_tail);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail = ALLOC_WC(left_tail_len + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcsncpy(left_tail,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq - colon - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail[eq - colon - 1] = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe replacement = suffix_replace;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((colon = (wchar_t *) wcschr(eq + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) colon_char)) != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_len = colon - eq;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(right_tail) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(right_tail);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_tail = ALLOC_WC(tmp_len);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcsncpy(right_tail,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon - eq - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_tail[colon - eq - 1] =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(right_tail) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(right_tail);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_tail = ALLOC_WC(wcslen(eq) + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(right_tail, eq + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((eq = (wchar_t *) wcschr(colon + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) equal_char)) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("= missing from replacement macro reference"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((percent = (wchar_t *) wcschr(colon + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) percent_char)) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("%% missing from replacement macro reference"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (eq < percent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader_mksh(gettext("%% missing from replacement macro reference"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (percent > (colon + 1)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_len = percent - colon;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(left_head) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(left_head);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head = ALLOC_WC(tmp_len);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcsncpy(left_head,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe percent - colon - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head[percent-colon-1] = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head_len = percent-colon-1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head_len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (eq > percent+1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_len = eq - percent;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(left_tail) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(left_tail);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail = ALLOC_WC(tmp_len);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcsncpy(left_tail,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe percent + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq - percent - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail[eq-percent-1] = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail_len = eq-percent-1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail_len = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((percent = (wchar_t *) wcschr(++eq,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) percent_char)) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[0] = ALLOC_WC(wcslen(eq) + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[1] = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(right_hand[0], eq);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe do {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[i] = ALLOC_WC(percent-eq+1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcsncpy(right_hand[i],
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe percent - eq);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[i][percent-eq] =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (i++ >= VSIZEOF(right_hand)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_mksh(gettext("Too many %% in pattern"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq = percent + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (eq[0] == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[i] = (wchar_t *) wcsdup(wcs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } while ((percent = (wchar_t *) wcschr(eq, (int) percent_char)) != NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (eq[0] != (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[i] = ALLOC_WC(wcslen(eq) + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(right_hand[i], eq);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right_hand[i] = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe replacement = pattern_replace;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * No translations found.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use the whole string as the macro name.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(string.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string.text.p - string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (string.free_after_use) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == make) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_word_mentioned = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == query) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe query_mentioned = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((name == host_arch) || (name == target_arch)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!init_arch_done) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_arch_done = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_arch_macros();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((name == host_mach) || (name == target_mach)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!init_mach_done) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_mach_done = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe init_mach_macros();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Get the macro value. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro = get_prop(name->prop, macro_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((macro != NULL) && macro->body.macro.is_conditional) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional_macro_used = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Add this conditional macro to the beginning of the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * global list.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe add_macro_to_global_list(name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (makefile_type == reading_makefile) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning_mksh(gettext("Conditional macro `%s' referenced in file `%ws', line %d"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb, file_being_read, line_number);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Macro name read and parsed. Expand the value. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((macro == NULL) || (macro->body.macro.value == NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If the value is empty, we just get out of here. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto exit;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (replacement == sh_replace) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If we should do a :sh transform, we expand the command
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and process it.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(string, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Expand the value into a local string buffer and run cmd. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value_with_daemon(name, macro, &string, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sh_command2string(&string, destination);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if ((replacement != no_replace) || (extraction != no_extract)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If there were any transforms specified in the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name, we deal with them here.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(string, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Expand the value into a local string buffer. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value_with_daemon(name, macro, &string, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Scan the expanded string. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p = string.buffer.start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (*p != (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t chr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * First skip over any white space and append
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * that to the destination string.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((*p != (int) nul_char) && iswspace(*p)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Then find the end of the next word. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe block_start = p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((*p != (int) nul_char) && !iswspace(*p)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If we cant find another word we are done */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (block_start == p) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Then apply the transforms to the word */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(extracted, extracted_string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (extraction) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case dir_extract:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * $(@D) type transform. Extract the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * path from the word. Deliver "." if
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * none is found.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chr = *p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq = (wchar_t *) wcsrchr(block_start, (int) slash_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p = chr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((eq == NULL) || (eq > p)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, ".");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(wcs_buffer, &extracted, 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &extracted,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case file_extract:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * $(@F) type transform. Remove the path
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * from the word if any.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chr = *p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe eq = (wchar_t *) wcsrchr(block_start, (int) slash_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p = chr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((eq == NULL) || (eq > p)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &extracted,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(eq + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &extracted,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p - eq - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case no_extract:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(block_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &extracted,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p - block_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (replacement) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case suffix_replace:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * $(FOO:.o=.c) type transform.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Maybe replace the tail of the word.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((extracted.text.p -
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extracted.buffer.start) >=
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail_len) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe IS_WEQUALN(extracted.text.p - left_tail_len,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail_len)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(extracted.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (extracted.text.p -
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extracted.buffer.start)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe - left_tail_len);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(right_tail,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(extracted.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case pattern_replace:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* $(X:a%b=c%d) type transform. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((extracted.text.p -
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extracted.buffer.start) >=
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head_len+left_tail_len) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe IS_WEQUALN(left_head,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extracted.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head_len) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe IS_WEQUALN(left_tail,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extracted.text.p - left_tail_len,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_tail_len)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (right_hand[i] != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(right_hand[i],
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (right_hand[i] != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(extracted.buffer.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe start +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left_head_len,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (extracted.text.p - extracted.buffer.start)-left_head_len-left_tail_len);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(extracted.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case no_replace:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(extracted.buffer.start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case sh_replace:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (string.free_after_use) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is for the case when the macro name did not
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * specify transforms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!strncmp(name->string_mb, "GET", 3)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollarget_seen = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollarless_flag = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!strncmp(name->string_mb, "<", 1) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollarget_seen) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollarless_flag = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollarget_seen = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value_with_daemon(name, macro, destination, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweexit:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(left_tail) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(left_tail);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(right_tail) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(right_tail);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(left_head) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(left_head);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (right_hand[i] != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(right_hand[i]);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe i++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *destination->text.p = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination->text.end = destination->text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadd_macro_to_global_list(Name macro_to_add)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Macro_list new_macro;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Macro_list macro_on_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *name_on_list = (char*)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *name_to_add = macro_to_add->string_mb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *value_on_list = (char*)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe const char *value_to_add = (char*)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (macro_to_add->prop->body.macro.value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value_to_add = macro_to_add->prop->body.macro.value->string_mb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value_to_add = "";
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Check if this macro is already on list, if so, do nothing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (macro_on_list = cond_macro_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro_on_list != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro_on_list = macro_on_list->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_on_list = macro_on_list->macro_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value_on_list = macro_on_list->value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (IS_EQUAL(name_on_list, name_to_add)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (IS_EQUAL(value_on_list, value_to_add)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_macro = (Macro_list) malloc(sizeof(Macro_list_rec));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_macro->macro_name = strdup(name_to_add);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_macro->value = strdup(value_to_add);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_macro->next = cond_macro_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cond_macro_list = new_macro;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * init_arch_macros(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Set the magic macros TARGET_ARCH, HOST_ARCH,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * host_arch Property for magic macro HOST_ARCH
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target_arch Property for magic macro TARGET_ARCH
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The function does not return a value, but can
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * call fatal() in case of error.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinit_arch_macros(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec result_string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t wc_buf[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char mb_buf[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FILE *pipe;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int set_host, set_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe const char *mach_command = "/bin/mach";
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe set_host = (get_prop(host_arch->prop, macro_prop) == NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe set_target = (get_prop(target_arch->prop, macro_prop) == NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (set_host || set_target) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(result_string, wc_buf);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_char((int) hyphen_char, &result_string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((pipe = popen(mach_command, "r")) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_mksh(gettext("Execute of %s failed"), mach_command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (fgets(mb_buf, sizeof(mb_buf), pipe) != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, mb_buf);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(wcs_buffer, &result_string, wcslen(wcs_buffer));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pclose(pipe) != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_mksh(gettext("Execute of %s failed"), mach_command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value = GETNAME(result_string.buffer.start, wcslen(result_string.buffer.start));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (set_host) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) setvar_daemon(host_arch, value, false, no_daemon, true, 0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (set_target) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) setvar_daemon(target_arch, value, false, no_daemon, true, 0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * init_mach_macros(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Set the magic macros TARGET_MACH, HOST_MACH,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * host_mach Property for magic macro HOST_MACH
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target_mach Property for magic macro TARGET_MACH
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The function does not return a value, but can
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * call fatal() in case of error.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinit_mach_macros(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec result_string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t wc_buf[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char mb_buf[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FILE *pipe;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int set_host, set_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe const char *arch_command = "/bin/arch";
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe set_host = (get_prop(host_mach->prop, macro_prop) == NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe set_target = (get_prop(target_mach->prop, macro_prop) == NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (set_host || set_target) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(result_string, wc_buf);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_char((int) hyphen_char, &result_string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((pipe = popen(arch_command, "r")) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_mksh(gettext("Execute of %s failed"), arch_command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (fgets(mb_buf, sizeof(mb_buf), pipe) != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, mb_buf);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(wcs_buffer, &result_string, wcslen(wcs_buffer));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pclose(pipe) != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_mksh(gettext("Execute of %s failed"), arch_command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value = GETNAME(result_string.buffer.start, wcslen(result_string.buffer.start));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (set_host) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) setvar_daemon(host_mach, value, false, no_daemon, true, 0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (set_target) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) setvar_daemon(target_mach, value, false, no_daemon, true, 0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * expand_value_with_daemon(name, macro, destination, cmd)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Checks for daemons and then maybe calls expand_value().
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name Name of the macro (Added by the NSE)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * macro The property block with the value to expand
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * destination Where the result should be deposited
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * cmd If we are evaluating a command line we
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * turn \ quoting off
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweexpand_value_with_daemon(Name, register Property macro, register String destination, Boolean cmd)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Chain chain;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (macro->body.macro.daemon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case no_daemon:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!svr4 && !posix) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value(macro->body.macro.value, destination, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dollarless_flag && tilde_rule) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value(dollarless_value, destination, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollarless_flag = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tilde_rule = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value(macro->body.macro.value, destination, cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case chain_daemon:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If this is a $? value we call the daemon to translate the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* list of names to a string */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (chain = (Chain) macro->body.macro.value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chain != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chain = chain->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe APPEND_NAME(chain->name,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) chain->name->hash.length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (chain->next != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_char((int) space_char, destination);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * We use a permanent buffer to reset SUNPRO_DEPENDENCIES value.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowechar *sunpro_dependencies_buf = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowechar *sunpro_dependencies_oldbuf = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweint sunpro_dependencies_buf_size = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * setvar_daemon(name, value, append, daemon, strip_trailing_spaces)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Set a macro value, possibly supplying a daemon to be used
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * when referencing the value.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The property block with the new value
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name Name of the macro to set
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * value The value to set
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * append Should we reset or append to the current value?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * daemon Special treatment when reading the value
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * strip_trailing_spaces from the end of value->string
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * debug_level Indicates how much tracing we should do
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * makefile_type Used to check if we should enforce read only
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * path_name The Name "PATH", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * virtual_root The Name "VIRTUAL_ROOT", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * vpath_defined Set if the macro VPATH is set
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * vpath_name The Name "VPATH", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * envvar A list of environment vars with $ in value
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweProperty
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowesetvar_daemon(register Name name, register Name value, Boolean append, Daemon daemon, Boolean strip_trailing_spaces, short debug_level)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Property macro = maybe_append_prop(name, macro_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Property macro_apx = get_prop(name->prop, macro_append_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int length = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec destination;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t buffer[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Chain chain;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name val;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *val_string = (wchar_t*)NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring wcb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((makefile_type != reading_nothing) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro->body.macro.read_only) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return macro;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Strip spaces from the end of the value */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (daemon == no_daemon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcb.init(value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length = wcb.length();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe val_string = wcb.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((length > 0) && iswspace(val_string[length-1])) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(destination, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe buffer[0] = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(val_string, &destination, length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (strip_trailing_spaces) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((length > 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iswspace(destination.buffer.start[length-1])) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe destination.buffer.start[--length] = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value = GETNAME(destination.buffer.start, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(macro_apx != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe val = macro_apx->body.macro_appendix.value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe val = macro->body.macro.value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (append) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If we are appending, we just tack the new value after
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the old one with a space in between.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(destination, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe buffer[0] = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((macro != NULL) && (val != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe APPEND_NAME(val,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) val->hash.length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcb.init(value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(wcb.length() > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBTOWC(wcs_buffer, " ");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_char(wcs_buffer[0], &destination);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe APPEND_NAME(value,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) value->hash.length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value = GETNAME(destination.buffer.start, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcb.init(value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (destination.free_after_use) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(destination.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Debugging trace */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (debug_level > 1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (daemon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case chain_daemon:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s =", name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (chain = (Chain) value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chain != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chain = chain->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf(" %s", chain->name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case no_daemon:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s= %s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s =\n", name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Set the new values in the macro property block */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/**/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(macro_apx != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro_apx->body.macro_appendix.value = value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(destination, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe buffer[0] = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe APPEND_NAME(value,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) value->hash.length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (macro_apx->body.macro_appendix.value_to_append != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBTOWC(wcs_buffer, " ");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_char(wcs_buffer[0], &destination);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (macro_apx->body.macro_appendix.value_to_append != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe APPEND_NAME(macro_apx->body.macro_appendix.value_to_append,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &destination,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) macro_apx->body.macro_appendix.value_to_append->hash.length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value = GETNAME(destination.buffer.start, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (destination.free_after_use) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(destination.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/**/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro->body.macro.value = value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro->body.macro.daemon = daemon;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If the user changes the VIRTUAL_ROOT, we need to flush
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the vroot package cache.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == path_name) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe flush_path_cache();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == virtual_root) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe flush_vroot_cache();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If this sets the VPATH we remember that */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((name == vpath_name) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (value != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (value->hash.length > 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vpath_defined = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For environment variables we also set the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * environment value each time.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (macro->body.macro.exported) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static char *env;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!reading_environment && (value != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Envvar p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (p = envvar; p != NULL; p = p->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (p->name == name) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->value = value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->already_put = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto found_it;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p = ALLOC(Envvar);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->name = name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->value = value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->next = envvar;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->env_string = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p->already_put = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe envvar = p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowefound_it:;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } if (reading_environment || (value == NULL) || !value->dollar) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length = 2 + strlen(name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length += strlen(value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property env_prop = maybe_append_prop(name, env_mem_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * We use a permanent buffer to reset SUNPRO_DEPENDENCIES value.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!strncmp(name->string_mb, "SUNPRO_DEPENDENCIES", 19)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (length >= sunpro_dependencies_buf_size) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sunpro_dependencies_buf_size=length*2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (sunpro_dependencies_buf_size < 4096)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sunpro_dependencies_buf_size = 4096; // Default minimum size
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (sunpro_dependencies_buf)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sunpro_dependencies_oldbuf = sunpro_dependencies_buf;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sunpro_dependencies_buf=getmem(sunpro_dependencies_buf_size);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe env = sunpro_dependencies_buf;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe env = getmem(length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe env_alloc_num++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe env_alloc_bytes += length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(env,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "%s=%s",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value == NULL ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "" : value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) putenv(env);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe env_prop->body.env_mem.value = env;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (sunpro_dependencies_oldbuf) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Return old buffer */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb(sunpro_dependencies_oldbuf);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sunpro_dependencies_oldbuf = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == target_arch) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name ha = getvar(host_arch);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name ta = getvar(target_arch);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name vr = getvar(virtual_root);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *new_value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *old_vr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean new_value_allocated = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring ha_str(ha);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring ta_str(ta);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring vr_str(vr);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb_ha = ha_str.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb_ta = ta_str.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb_vr = vr_str.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length = 32 +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcslen(wcb_ha) +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcslen(wcb_ta) +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcslen(wcb_vr);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe old_vr = wcb_vr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "/usr/arch/");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (IS_WEQUALN(old_vr,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcs_buffer,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcslen(wcs_buffer))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe old_vr = (wchar_t *) wcschr(old_vr, (int) colon_char) + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ( (ha == ta) || (wcslen(wcb_ta) == 0) ) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_value = old_vr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_value = ALLOC_WC(length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe new_value_allocated = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe WCSTOMBS(mbs_buffer, old_vr);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) swprintf(new_value, length * SIZEOFWCHAR_T,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe L"/usr/arch/%s/%s:%s",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ha->string_mb + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ta->string_mb + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mbs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (new_value[0] != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) setvar_daemon(virtual_root,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe GETNAME(new_value, FIND_LENGTH),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_daemon,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe debug_level);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (new_value_allocated) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(new_value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return macro;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}