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 2005 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * read.c
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This file contains the makefile reader.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Included files
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mk/defs.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/dosys.h> /* sh_command2string() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/macro.h> /* expand_value() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/misc.h> /* retmem() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <stdarg.h> /* va_list, va_start(), va_end() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <libintl.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Defined macros
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * typedefs & structs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean built_last_make_run_seen;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * File table of contents
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Name_vector enter_member_name(register wchar_t *lib_start, register wchar_t *member_start, register wchar_t *string_end, Name_vector current_names, Name_vector *extra_names);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name normalize_name(register wchar_t *name_string, register int length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void read_suffixes_list(register Name_vector depes);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void make_relative(wchar_t *to, wchar_t *result);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void print_rule(register Cmd_line command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void sh_transform(Name *name, Name *value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_name(string, tail_present, string_start, string_end,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_names, extra_names, target_group_seen)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Take one string and enter it as a name. The string is passed in
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * two parts. A make string and possibly a C string to append to it.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The result is stuffed in the vector current_names.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * extra_names points to a vector that is used if current_names overflows.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is allocad in the calling routine.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Here we handle the "lib.a[members]" notation.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The name vector that was used
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * tail_present Indicates if both C and make string was passed
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * string_start C string
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * string_end Pointer to char after last in C string
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * string make style string with head of name
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_names Vector to deposit the name in
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * extra_names Where to get next name vector if we run out
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target_group_seen Pointer to boolean that is set if "+" is seen
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * makefile_type When we read a report file we normalize paths
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * plus Points to the Name "+"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweName_vector
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_name(String string, Boolean tail_present, register wchar_t *string_start, register wchar_t *string_end, Name_vector current_names, Name_vector *extra_names, Boolean *target_group_seen)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *cp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t ch;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If we were passed a separate tail of the name we append it to the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* make string with the rest of it */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (tail_present) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append_string(string_start, string, string_end - string_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string_start = string->buffer.start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string_end = string->text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ch = *string_end;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *string_end = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Check if there are any ( or [ that are not prefixed with $.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If there are, we have to deal with the lib.a(members) format.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (cp = (wchar_t *) wcschr(string_start, (int) parenleft_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = (wchar_t *) wcschr(cp + 1, (int) parenleft_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*(cp - 1) != (int) dollar_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *string_end = ch;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return enter_member_name(string_start,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string_end,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe extra_names);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *string_end = ch;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (makefile_type == reading_cpp_file) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Remove extra ../ constructs if we are reading from a report file */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = normalize_name(string_start, string_end - string_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * /tolik, fix bug 1197477/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Normalize every target name before entering.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ..//obj/a.o and ../obj//a.o are not two different targets.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * There is only one target ../obj/a.o
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*name = GETNAME(string_start, string_end - string_start);*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = normalize_name(string_start, string_end - string_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Internalize the name. Detect the name "+" (target group here) */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweif(current_names->used != 0 && current_names->names[current_names->used-1] == plus) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(name == plus) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return current_names;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If the current_names vector is full we patch in the one from */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* extra_names */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (current_names->used == VSIZEOF(current_names->names)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (current_names->next != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names = current_names->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->next = *extra_names;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *extra_names = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names = current_names->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->used = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->target_group[current_names->used] = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->names[current_names->used++] = name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == plus) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *target_group_seen = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (tail_present && string->free_after_use) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(string->buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return current_names;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_member_name(lib_start, member_start, string_end,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_names, extra_names)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * A string has been found to contain member names.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * (The "lib.a[members]" and "lib.a(members)" notation)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Handle it pretty much as enter_name() does for simple names.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The name vector that was used
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * lib_start Points to the of start of "lib.a(member.o)"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * member_start Points to "member.o" from above string.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * string_end Points to char after last of above string.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_names Vector to deposit the name in
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * extra_names Where to get next name vector if we run out
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Name_vector
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_member_name(register wchar_t *lib_start, register wchar_t *member_start, register wchar_t *string_end, Name_vector current_names, Name_vector *extra_names)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Boolean entry = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t buffer[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name lib;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property prop;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *memberp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *q;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int paren_count;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Boolean has_dollar;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *cq;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name long_member_name = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Internalize the name of the library */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe lib = GETNAME(lib_start, member_start - lib_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe lib->is_member = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member_start++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*member_start == (int) parenleft_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* This is really the "lib.a((entries))" format */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member_start++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Move the library name to the buffer where we intend to build the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* "lib.a(member)" for each member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcsncpy(buffer, lib_start, member_start - lib_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe memberp = buffer + (member_start-lib_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe long_member_name = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Skip leading spaces */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (member_start < string_end) && iswspace(*member_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member_start++);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Find the end of the member name. Allow nested (). Detect $*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (cq = memberp, has_dollar = false, paren_count = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (member_start < string_end) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((*member_start != (int) parenright_char) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (paren_count > 0)) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !iswspace(*member_start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cq++ = *member_start++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (*member_start) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case parenleft_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe paren_count++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case parenright_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe paren_count--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case dollar_char:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe has_dollar = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Internalize the member name */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member = GETNAME(memberp, cq - memberp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cq = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((q = (wchar_t *) wcsrchr(memberp, (int) slash_char)) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe q = memberp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((cq - q > (int) ar_member_name_len) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !has_dollar) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cq++ = (int) parenright_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (entry) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cq++ = (int) parenright_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe long_member_name = GETNAME(buffer, cq - buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cq = q + (int) ar_member_name_len;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cq++ = (int) parenright_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (entry) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cq++ = (int) parenright_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Internalize the "lib.a(member)" notation for this member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(buffer, cq - buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->is_member = lib->is_member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (long_member_name != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop = append_prop(name, long_member_name_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->has_long_member_name = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop->body.long_member_name.member_name =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe long_member_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* And add the member prop */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop = append_prop(name, member_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop->body.member.library = lib;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (entry) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* "lib.a((entry))" notation */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop->body.member.entry = member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop->body.member.member = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* "lib.a(member)" Notation */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop->body.member.entry = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe prop->body.member.member = member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Handle overflow of current_names */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (current_names->used == VSIZEOF(current_names->names)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (current_names->next != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names = current_names->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*extra_names == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->next =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ALLOC(Name_vector);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->next =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *extra_names;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *extra_names = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->used = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->target_group[current_names->used] = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_names->names[current_names->used++] = name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (iswspace(*member_start)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member_start++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check if there are more members */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*member_start == (int) parenright_char) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (member_start >= string_end)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return current_names;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* NOTREACHED */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * normalize_name(name_string, length)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Take a namestring and remove redundant ../, // and ./ constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The normalized name
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name_string Path string to normalize
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * length Length of that string
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dot The Name ".", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dotdot The Name "..", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweName
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowenormalize_name(register wchar_t *name_string, register int length)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Name dotdot;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *string = ALLOC_WC(length + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *string2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *cdp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *current_component;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int count;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dotdot == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "..");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dotdot = GETNAME(wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Copy string removing ./ and //.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * First strip leading ./
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((length > 1) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[0] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[1] == (int) slash_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string += 2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length -= 2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((length > 0) && (name_string[0] == (int) slash_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Then copy the rest of the string removing /./ & // */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cdp = string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (length > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((length > 2) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[0] == (int) slash_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[1] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[2] == (int) slash_char)) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((length == 2) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[0] == (int) slash_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[1] == (int) period_char))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string += 2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length -= 2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((length > 1) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[0] == (int) slash_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[1] == (int) slash_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cdp++ = *name_string++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cdp = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Now scan for <name>/../ and remove such combinations iff <name>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * is not another ..
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Each time something is removed, the whole process is restarted.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweremoved_one:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string = string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string2 = name_string; /*save for free*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_component =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cdp =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ALLOC_WC((length = wcslen(name_string)) + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (length > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((length > 3) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[0] == (int) slash_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[1] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[2] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[3] == (int) slash_char)) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((length == 3) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[0] == (int) slash_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[1] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (name_string[2] == (int) period_char))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Positioned on the / that starts a /.. sequence */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((count = cdp - current_component) != 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (exists(name = GETNAME(string, cdp - string)) > file_doesnt_exist) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (!name->stat.is_sym_link)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(current_component, count);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(name != dotdot) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cdp = current_component;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string += 3;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length -= 3;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (length > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name_string++; /* skip slash */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (length > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cdp++ = *name_string++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cdp = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(string2);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto removed_one;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((*cdp++ = *name_string++) == (int) slash_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_component = cdp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe length--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cdp = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (string[0] == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = dot;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(string, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(string);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(string2);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * find_target_groups(target_list)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If a "+" was seen when the target list was scanned we need to extract
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the groups. Each target in the name vector that is a member of a
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * group gets a pointer to a chain of all the members stuffed in its
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target_group vector slot
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target_list The list of targets that contains "+"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * plus The Name "+", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweChain
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowefind_target_groups(register Name_vector target_list, register int i, Boolean reset)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Chain target_group = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Chain tail_target_group = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Name *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static Boolean clear_target_group = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (reset) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tail_target_group = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe clear_target_group = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Scan the list of targets */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If the previous target terminated a group */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* we flush the pointer to that member chain */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (clear_target_group) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe clear_target_group = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Pick up a pointer to the cell with */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* the next target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (i + 1 != target_list->used) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe next = &target_list->names[i + 1];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe next = (target_list->next != NULL) ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &target_list->next->names[0] : NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* We have four states here :
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * 0: No target group started and next element is not "+"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is not interesting.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * 1: A target group is being built and the next element
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * is not "+". This terminates the group.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * 2: No target group started and the next member is "+"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is the first target in a group.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * 3: A target group started and the next member is a "+"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The group continues.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch ((target_group ? 1 : 0) +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (next && (*next == plus) ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe 2 : 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 0: /* Not target_group */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 1: /* Last group member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* We need to keep this pointer so */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* we can stuff it for last member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe clear_target_group = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* fall into */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 3: /* Middle group member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Add this target to the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* current chain */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tail_target_group->next = ALLOC(Chain);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tail_target_group = tail_target_group->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tail_target_group->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tail_target_group->name = target_list->names[i];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 2: /* First group member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Start a new chain */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group = tail_target_group = ALLOC(Chain);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group->name = target_list->names[i];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Stuff the current chain, if any, in the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* targets group slot */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_list->target_group[i] = target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((next != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*next == plus)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (tail_target_group);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_dependencies(target, target_group, depes, command, separator)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Take one target and a list of dependencies and process the whole thing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The target might be special in some sense in which case that is handled
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target The target we want to enter
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target_group Non-NULL if target is part of a group this time
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * depes A list of dependencies for the target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command The command the target should be entered with
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * separator Indicates if this is a ":" or a "::" rule
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * built_last_make_run_seen If the previous target was
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * .BUILT_LAST_MAKE_RUN we say to rewrite
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the state file later on
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command_changed Set to indicate if .make.state needs rewriting
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * default_target_to_build Set to the target if reading makefile
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and this is the first regular target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * force The Name " FORCE", used with "::" targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * makefile_type We do different things for makefile vs. report
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * not_auto The Name ".NOT_AUTO", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursive_name The Name ".RECURSIVE", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * temp_file_number Used to figure out when to clear stale
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * automatic dependencies
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_dependencies(register Name target, Chain target_group, register Name_vector depes, register Cmd_line command, register Separator separator)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int i;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name directory;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *namep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *mb_namep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency *dpp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t relative[MAXPATHLEN];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int recursive_state;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean register_as_auto;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean not_auto_found;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *slash;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring depstr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check if this is a .RECURSIVE line */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((depes->used >= 3) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (depes->names[0] == recursive_name)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->has_recursive_dependency = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[0] = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursive_state = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dpp = &dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Read the dependencies. They are "<directory> <target-made>*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* <makefile>*" */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (i = 0; i < depes->used; i++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->names[i] != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (recursive_state++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 0: /* Directory */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depstr.init(depes->names[i]);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_relative(depstr.get_string(),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe relative);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe directory =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe GETNAME(relative,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 1: /* Target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = depes->names[i];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default: /* Makefiles */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *dpp = ALLOC(Dependency);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*dpp)->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*dpp)->name = depes->names[i];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*dpp)->automatic = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*dpp)->stale = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*dpp)->built = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dpp = &((*dpp)->next);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check if this recursion already has been reported else */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* enter the recursive prop for the target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* The has_built flag is used to tell if this .RECURSIVE */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* was discovered from this run (read from a tmp file) */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* or was from discovered from the original .make.state */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* file */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (line = get_prop(target->prop, recursive_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = get_prop(line->next, recursive_prop)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((line->body.recursive.directory == directory) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (line->body.recursive.target == name)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.recursive.makefiles = dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.recursive.has_built =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (Boolean)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (makefile_type == reading_cpp_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2 = append_prop(target, recursive_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2->body.recursive.directory = directory;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2->body.recursive.target = name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2->body.recursive.makefiles = dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2->body.recursive.has_built =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (Boolean) (makefile_type == reading_cpp_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2->body.recursive.in_depinfo = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If this is the first target that doesnt start with a "." in the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* makefile we remember that */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring tstr(target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb = tstr.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((makefile_type == reading_makefile) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (default_target_to_build == NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((wcb[0] != (int) period_char) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcschr(wcb, (int) slash_char))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* BID 1181577: $(EMPTY_MACRO) + $(EMPTY_MACRO):
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe** The target with empty name cannot be default_target_to_build
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->hash.length != 0)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default_target_to_build = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check if the line is ":" or "::" */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (makefile_type == reading_makefile) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->colons == no_colon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->colons = separator;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->colons != separator) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext(":/:: conflict for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->colons == two_colon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If this is a "::" type line with no */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* dependencies we add one "FRC" type */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* dependency for free */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->used = 1; /* Force :: targets with no
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * depes to always run */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[0] = force;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Do not delete "::" type targets when interrupted */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->stat.is_precious = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Build a synthetic target "<number>%target"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * for "target".
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mb_namep = getmem((int) (strlen(target->string_mb) + 10));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe namep = ALLOC_WC((int) (target->hash.length + 10));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe slash = strrchr(target->string_mb, (int) slash_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (slash == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(mb_namep,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "%d@%s",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->colon_splits++,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *slash = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(mb_namep,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "%s/%d@%s",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->colon_splits++,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe slash + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *slash = (int) slash_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(namep, mb_namep);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb(mb_namep);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name = GETNAME(namep, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(namep);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t", target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Make "target" depend on "<number>%target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2 = maybe_append_prop(target, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe enter_dependency(line2, name, true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2->body.line.target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Put a prop on "<number>%target that makes */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* appear as "target" */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* when it is processed */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe maybe_append_prop(name, target_prop)->
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe body.target.target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->is_double_colon_parent = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->is_double_colon = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->has_target_prop = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (target = name)->stat.is_file = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* This really is a regular dependency line. Just enter it */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = maybe_append_prop(target, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Depending on what kind of makefile we are reading we have to */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* treat things differently */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (makefile_type) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case reading_makefile:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Reading regular makefile. Just notice whether this */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* redefines the rule for the target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (command != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line->body.line.command_template != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.command_template_redefined =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((wcb[0] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !wcschr(wcb, (int) slash_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.command_template =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.command_template = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((wcb[0] == (int) period_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !wcschr(wcb, (int) slash_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.command_template = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case rereading_statefile:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Rereading the statefile. We only enter thing that changed */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* since the previous time we read it */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!built_last_make_run_seen) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (Cmd_line next, cmd = command; cmd != NULL; cmd = next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe next = cmd->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe free(cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe built_last_make_run_seen = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command_changed = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->ran_command = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case reading_statefile:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Reading the statefile for the first time. Enter the rules */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* as "Commands used" not "templates to use" */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (command != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (Cmd_line next, cmd = line->body.line.command_used;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cmd != NULL; cmd = next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe next = cmd->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe free(cmd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.command_used = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case reading_cpp_file:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Reading report file from programs that reports */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* dependencies. If this is the first time the target is */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* read from this reportfile we clear all old */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* automatic depes */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->temp_file_number == temp_file_number) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->temp_file_number = temp_file_number;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command_changed = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dp = line->body.line.dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp = dp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->automatic) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->stale = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Internal error. Unknown makefile type %d"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe makefile_type);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* A target may only be involved in one target group */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line->body.line.target_group != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target_group != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Too many target groups for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.target_group = target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t", target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Enter the dependencies */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register_as_auto = BOOLEAN(makefile_type != reading_makefile);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe not_auto_found = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (depes != NULL) && !not_auto_found;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (i = 0; i < depes->used; i++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* the dependency .NOT_AUTO signals beginning of
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * explicit dependancies which were put at end of
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * list in .make.state file - we stop entering
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dependencies at this point
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->names[i] == not_auto) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe not_auto_found = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe enter_dependency(line,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[i],
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register_as_auto);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_dependency(line, depe, automatic)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Enter one dependency. Do not enter duplicates.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * line The line block that the dependeny is
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * entered for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * depe The dependency to enter
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * automatic Used to set the field "automatic"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * makefile_type We do different things for makefile vs. report
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * wait_name The Name ".WAIT", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_dependency(Property line, register Name depe, Boolean automatic)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dependency dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dependency *insert;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s ", depe->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Find the end of the list and check for duplicates */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (insert = &line->body.line.dependencies, dp = *insert;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe insert = &dp->next, dp = *insert) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((dp->name == depe) && (depe != wait_name)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->automatic) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->automatic = automatic;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (automatic) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->built = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->stat.is_file = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->stale = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Insert the new dependency since we couldnt find it */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp = *insert = ALLOC(Dependency);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->name = depe;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->automatic = automatic;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->stale = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->built = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->stat.is_file = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((makefile_type == reading_makefile) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (line != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (line->body.line.target != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.target->has_regular_dependency = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_percent(target, depes, command)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Enter "x%y : a%b" type lines
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * % patterns are stored in four parts head and tail for target and source
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Left hand side of pattern
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * depes The dependency list with the rh pattern
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command The command for the pattern
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * empty_name The Name "", compared against
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * percent_list The list of all percent rules, added to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LowePercent
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_percent(register Name target, Chain target_group, register Name_vector depes, Cmd_line command)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Percent result = ALLOC(Percent);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Percent depe;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Percent *depe_tail = &result->dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Percent *insert;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register wchar_t *cp, *cp1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name_vector nvp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int i;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int pattern;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns_total = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->command_template = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->being_expanded = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->name = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->dependencies = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->target_group = target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* get patterns count */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring wcb(target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = wcb.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (true) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = (wchar_t *) wcschr(cp, (int) percent_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (cp != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns_total++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns_total++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* allocate storage for patterns */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns = (Name *) getmem(sizeof(Name) * result->patterns_total);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* then create patterns */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = wcb.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (true) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp1 = (wchar_t *) wcschr(cp, (int) percent_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (cp1 != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns[pattern] = GETNAME(cp, cp1 - cp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = cp1 + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->patterns[pattern] = GETNAME(cp, (int) target->hash.length - (cp - wcb.get_string()));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring wcb1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* build dependencies list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (nvp = depes; nvp != NULL; nvp = nvp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (i = 0; i < nvp->used; i++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe = ALLOC(Percent);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns_total = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->name = nvp->names[i];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->dependencies = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->command_template = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->being_expanded = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->target_group = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *depe_tail = depe;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe_tail = &depe->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depe->name->percent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* get patterns count */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wcb1.init(depe->name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = wcb1.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (true) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = (wchar_t *) wcschr(cp, (int) percent_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (cp != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns_total++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns_total++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* allocate storage for patterns */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns = (Name *) getmem(sizeof(Name) * depe->patterns_total);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* then create patterns */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = wcb1.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (true) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp1 = (wchar_t *) wcschr(cp, (int) percent_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (cp1 != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns[pattern] = GETNAME(cp, cp1 - cp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = cp1 + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depe->patterns[pattern] = GETNAME(cp, (int) depe->name->hash.length - (cp - wcb1.get_string()));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Find the end of the percent list and append the new pattern */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (insert = &percent_list; (*insert) != NULL; insert = &(*insert)->next);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *insert = result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:", result->name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (depe = result->dependencies; depe != NULL; depe = depe->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf(" %s", depe->name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_dyntarget(target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Enter "$$(MACRO) : b" type lines
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Left hand side of pattern
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dyntarget_list The list of all percent rules, added to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweDyntarget
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_dyntarget(register Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dyntarget result = ALLOC(Dyntarget);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dyntarget p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dyntarget *insert;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int i;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result->name = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Find the end of the dyntarget list and append the new pattern */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (insert = &dyntarget_list, p = *insert;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe insert = &p->next, p = *insert);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *insert = result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("Dynamic target %s:\n", result->name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return( result);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * special_reader(target, depes, command)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Read the pseudo targets make knows about
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This handles the special targets that should not be entered as regular
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target/dependency sets.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target The special target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * depes The list of dependencies it was entered with
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command The command it was entered with
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * built_last_make_run_seen Set to indicate .BUILT_LAST... seen
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * all_parallel Set to indicate that everything runs parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * svr4 Set when ".SVR4" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * svr4_name The Name ".SVR4"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * posix Set when ".POSIX" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * posix_name The Name ".POSIX"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_make_version The Name "<current version number>"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * default_rule Set when ".DEFAULT" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * default_rule_name The Name ".DEFAULT", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dot_keep_state The Name ".KEEP_STATE", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ignore_errors Set if ".IGNORE" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ignore_name The Name ".IGNORE", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * keep_state Set if ".KEEP_STATE" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * no_parallel_name The Name ".NO_PARALLEL", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * only_parallel Set to indicate only some targets runs parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * parallel_name The Name ".PARALLEL", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * precious The Name ".PRECIOUS", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * sccs_get_name The Name ".SCCS_GET", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * sccs_get_posix_name The Name ".SCCS_GET_POSIX", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * get_name The Name ".GET", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * sccs_get_rule Set when ".SCCS_GET" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * silent Set when ".SILENT" target is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * silent_name The Name ".SILENT", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowespecial_reader(Name target, register Name_vector depes, Cmd_line command)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int n;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (target->special_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case svr4_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe svr4 = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe posix = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe keep_state = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe only_parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", svr4_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case posix_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe posix = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* with posix on, use the posix get rule */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_rule = sccs_get_posix_rule;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* turn keep state off being SunPro make specific */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe keep_state = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Use /usr/xpg4/bin/sh on Solaris */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "/usr/xpg4/bin/sh");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) SETVAR(shell_name, GETNAME(wcs_buffer, FIND_LENGTH), false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", posix_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case built_last_make_run_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe built_last_make_run_seen = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case default_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("Illegal dependency list for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default_rule_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case ignore_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((depes->used != 0) &&(!posix)){
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore_errors_all = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore_errors_all = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->ignore_error_mode = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", ignore_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case keep_state_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* ignore keep state, being SunPro make specific */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(posix)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe keep_state = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dot_keep_state->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case keep_state_file_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(posix)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* it's not necessary to specify KEEP_STATE, if this
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ** is given, so set the keep_state.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe keep_state = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if((!make_state) ||(!strcmp(make_state->string_mb,".make.state"))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_state = depes->names[0];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case make_version_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependency list for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->names[0] != current_make_version) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Special case the fact that version 1.0 and 1.1
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * are identical.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!IS_EQUAL(depes->names[0]->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "VERSION-1.1") ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !IS_EQUAL(current_make_version->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "VERSION-1.0")) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Version mismatches should cause the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * .make.state file to be skipped.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is currently not true - it is read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * anyway.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("Version mismatch between current version `%s' and `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_make_version->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[0]->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case no_parallel_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Set the no_parallel bit for all the targets on */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* the dependency list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* only those explicitly made parallel */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe only_parallel = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t%s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_parallel_name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->no_parallel = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case parallel_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* everything runs in parallel */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_parallel = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe only_parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Set the parallel bit for all the targets on */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* the dependency list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t%s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parallel_name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->parallel = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->no_parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case localhost_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Set the no_parallel bit for all the targets on */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* the dependency list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* only those explicitly made parallel */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe only_parallel = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t%s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe localhost_name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->no_parallel = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->parallel = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->localhost = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case precious_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* everything is precious */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_precious = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_precious = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe all_precious = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Set the precious bit for all the targets on */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* the dependency list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t%s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe precious->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->stat.is_precious = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case sccs_get_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_org_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", sccs_get_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case sccs_get_posix_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_posix_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", sccs_get_posix_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case get_posix_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_posix_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", get_posix_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case get_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(!svr4) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_rule = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", get_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe print_rule(command);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case silent_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((depes->used != 0) && (!posix)){
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Illegal dependencies for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_all = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(svr4) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_all = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depes->names[n]->silent_mode = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", silent_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case suffixes_special:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe read_suffixes_list(depes);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_reader(gettext("Internal error: Unknown special reader"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * read_suffixes_list(depes)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Read the special list .SUFFIXES. If it is empty the old list is
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * cleared. Else the new one is appended. Suffixes with ~ are extracted
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and marked.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * depes The list of suffixes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * hashtab The central hashtable for Names.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * suffixes The list of suffixes, set or appended to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * suffixes_name The Name ".SUFFIXES", used for tracing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweread_suffixes_list(register Name_vector depes)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register int n;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dependency dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Dependency *insert_dep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Name np;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name np2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Boolean first = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (depes->used == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* .SUFFIXES with no dependency list clears the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* suffixes list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (Name_set::iterator np = hashtab.begin(), e = hashtab.end(); np != e; np++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np->with_squiggle =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np->without_squiggle =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe suffixes = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\n", suffixes_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring str;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Otherwise we append to the list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; depes != NULL; depes = depes->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (n = 0; n < depes->used; n++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np = depes->names[n];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Find the end of the list and check if the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* suffix already has been entered */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (insert_dep = &suffixes, dp = *insert_dep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe insert_dep = &dp->next, dp = *insert_dep) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->name == np) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto duplicate_suffix;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (first) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s:\t",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe suffixes_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe first = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s ", depes->names[n]->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(!(posix|svr4)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If the suffix is suffixed with "~" we */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* strip that and mark the suffix nameblock */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe str.init(np);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb = str.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (wcb[np->hash.length - 1] ==
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) tilde_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np2 = GETNAME(wcb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int)(np->hash.length - 1));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np2->with_squiggle = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (np2->without_squiggle) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np = np2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe np->without_squiggle = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Add the suffix to the list */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp = *insert_dep = ALLOC(Dependency);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe insert_dep = &dp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->name = np;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dp->built = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe duplicate_suffix:;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * make_relative(to, result)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Given a file name compose a relative path name from it to the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current directory.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * to The path we want to make relative
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * result Where to put the resulting relative path
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowemake_relative(wchar_t *to, wchar_t *result)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *from;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *allocated;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *cp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *tocomp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int ncomps;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int i;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int len;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check if the path is already relative. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (to[0] != (int) slash_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(result, to);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, get_current_path());
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe from = allocated = (wchar_t *) wcsdup(wcs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Find the number of components in the from name.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ncomp = number of slashes + 1.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ncomps = 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (cp = from; *cp != (int) nul_char; cp++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*cp == (int) slash_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ncomps++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * See how many components match to determine how many "..",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * if any, will be needed.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result[0] = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tocomp = to;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((*from != (int) nul_char) && (*from == *to)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*from == (int) slash_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ncomps--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tocomp = &to[1];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe from++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe to++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Now for some special cases. Check for exact matches and
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * for either name terminating exactly.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*from == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*to == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, ".");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscpy(result, wcs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(allocated);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*to == (int) slash_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ncomps--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tocomp = &to[1];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if ((*from == (int) slash_char) && (*to == (int) nul_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ncomps--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tocomp = to;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Add on the ".."s. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (i = 0; i < ncomps; i++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "../");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscat(result, wcs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Add on the remainder of the to name, if any. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*tocomp == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe len = wcslen(result);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result[len - 1] = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) wcscat(result, tocomp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(allocated);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * print_rule(command)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Used when tracing the reading of rules
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command Command to print
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprint_rule(register Cmd_line command)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (; command != NULL; command = command->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("\t%s\n", command->command_line->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_conditional(target, name, value, append)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Enter "target := MACRO= value" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target The target the macro is for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name The name of the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * value The value for the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * append Indicates if the assignment is appending or not
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * conditionals A special Name that stores all conditionals
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * where the target is a % pattern
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_conditional(register Name target, Name name, Name value, register Boolean append)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe register Property conditional;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static int sequence;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name orig_target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name == target_arch) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe enter_conditional(target, virtual_root, virtual_root, false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->percent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target = conditionals;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name->colon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sh_transform(&name, &value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Count how many conditionals we must activate before building the */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->percent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target = conditionals;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->conditional_cnt++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe maybe_append_prop(name, macro_prop)->body.macro.is_conditional = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Add the property for the target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional = append_prop(target, conditional_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional->body.conditional.target = orig_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional->body.conditional.name = name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional->body.conditional.value = value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional->body.conditional.sequence = sequence++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional->body.conditional.append = append;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s := %s %c=\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) plus_char : (int) space_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s := %s %c= %s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) plus_char : (int) space_char,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * enter_equal(name, value, append)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Enter "MACRO= value" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name The name of the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * value The value for the macro
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * append Indicates if the assignment is appending or not
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * trace_reader Indicates that we should echo stuff we read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenter_equal(Name name, Name value, register Boolean append)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name temp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (name->colon) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sh_transform(&name, &value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) SETVAR(name, value, append);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* if we're setting FC, we want to set F77 to the same value. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring nms(name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb = nms.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string = wcb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (string[0]=='F' &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string[1]=='C' &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string[2]=='\0') {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "F77");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe temp = GETNAME(wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) SETVAR(temp, value, append);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fprintf(stderr, gettext("warning: FC is obsolete, use F77 instead\n"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (trace_reader) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (value == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s %c=\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) plus_char : (int) space_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s %c= %s\n",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe append ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (int) plus_char : (int) space_char,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * sh_transform(name, value)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name The name of the macro we might transform
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * value The value to transform
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowesh_transform(Name *name, Name *value)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check if we need :sh transform */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *colon;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe String_rec destination;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t buffer[1000];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t buffer1[1000];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static wchar_t colon_sh[4];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static wchar_t colon_shell[7];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (colon_sh[0] == (int) nul_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(colon_sh, ":sh");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(colon_shell, ":shell");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring nms((*name));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * wcb = nms.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon = (wchar_t *) wcsrchr(wcb, (int) colon_char);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((colon != NULL) && (IS_WEQUAL(colon, colon_sh) || IS_WEQUAL(colon, colon_shell))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(destination, buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(*value == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe buffer[0] = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring wcb1((*value));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (IS_WEQUAL(colon, colon_shell)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe INIT_STRING_FROM_STACK(command, buffer1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe expand_value(*value, &command, false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command.text.p = wcb1.get_string() + (*value)->hash.length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command.text.end = command.text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command.buffer.start = wcb1.get_string();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command.buffer.end = command.text.p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sh_command2string(&command, &destination);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*value) = GETNAME(destination.buffer.start, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *colon = (int) nul_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*name) = GETNAME(wcb, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *colon = (int) colon_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fatal_reader(format, args...)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * format printf style format string
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * args arguments to match the format
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * file_being_read Name of the makefile being read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * line_number Line that is being read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * report_pwd Indicates whether current path should be shown
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * temp_file_name When reading tempfile we report that name
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*VARARGS*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowefatal_reader(char * pattern, ...)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe va_list args;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char message[1000];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe va_start(args, pattern);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (file_being_read != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe WCSTOMBS(mbs_buffer, file_being_read);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line_number != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(message,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe gettext("%s, line %d: %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mbs_buffer,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line_number,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(message,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "%s: %s",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mbs_buffer,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pattern = message;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fflush(stdout);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(stderr, gettext("%s: Fatal error in reader: "),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe getprogname());
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) vfprintf(stderr, pattern, args);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(stderr, "\n");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe va_end(args);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (temp_file_name != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(stderr,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe gettext("%s: Temp-file %s not removed\n"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe getprogname(),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe temp_file_name->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe temp_file_name = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (report_pwd) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(stderr,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe gettext("Current working directory %s\n"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_current_path());
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fflush(stderr);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe exit_status = 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe exit(1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe