10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#ifndef _MKSH_DEFS_H
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define _MKSH_DEFS_H
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 2004 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <limits.h> /* MB_LEN_MAX */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <stdio.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <stdlib.h> /* wchar_t */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <string.h> /* strcmp() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/param.h> /* MAXPATHLEN */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/types.h> /* time_t, caddr_t */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <vroot/vroot.h> /* pathpt */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/time.h> /* timestruc_t */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <errno.h> /* errno */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <wctype.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * A type and some utilities for boolean values
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define false BOOLEAN_false
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define true BOOLEAN_true
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false = 0,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true = 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe failed = 0,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe succeeded = 1
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Boolean;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define BOOLEAN(expr) ((expr) ? true : false)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Some random constants (in an enum so dbx knows their values)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe update_delay = 30, /* time between rstat checks */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ar_member_name_len = 1024,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe hashsize = 2048 /* size of hash table */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Symbols that defines all the different char constants make uses
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ampersand_char = '&',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe asterisk_char = '*',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe at_char = '@',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe backquote_char = '`',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe backslash_char = '\\',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe bar_char = '|',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe braceleft_char = '{',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe braceright_char = '}',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe bracketleft_char = '[',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe bracketright_char = ']',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon_char = ':',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe comma_char = ',',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollar_char = '$',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe doublequote_char = '"',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe equal_char = '=',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe exclam_char = '!',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe greater_char = '>',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe hat_char = '^',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe hyphen_char = '-',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe less_char = '<',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe newline_char = '\n',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe nul_char = '\0',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe numbersign_char = '#',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parenleft_char = '(',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parenright_char = ')',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe percent_char = '%',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe period_char = '.',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe plus_char = '+',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe question_char = '?',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_char = '\'',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe semicolon_char = ';',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe slash_char = '/',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe space_char = ' ',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tab_char = '\t',
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tilde_char = '~'
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For make i18n. Codeset independent.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Setup character semantics by identifying all the special characters
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * of make, and assigning each an entry in the char_semantics[] vector.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ampersand_char_entry = 0, /* 0 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe asterisk_char_entry, /* 1 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe at_char_entry, /* 2 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe backquote_char_entry, /* 3 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe backslash_char_entry, /* 4 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe bar_char_entry, /* 5 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe bracketleft_char_entry, /* 6 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe bracketright_char_entry, /* 7 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon_char_entry, /* 8 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollar_char_entry, /* 9 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe doublequote_char_entry, /* 10 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe equal_char_entry, /* 11 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe exclam_char_entry, /* 12 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe greater_char_entry, /* 13 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe hat_char_entry, /* 14 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe hyphen_char_entry, /* 15 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe less_char_entry, /* 16 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe newline_char_entry, /* 17 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe numbersign_char_entry, /* 18 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parenleft_char_entry, /* 19 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parenright_char_entry, /* 20 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe percent_char_entry, /* 21 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe plus_char_entry, /* 22 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe question_char_entry, /* 23 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quote_char_entry, /* 24 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe semicolon_char_entry, /* 25 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_semantics_entry /* 26 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CHAR_SEMANTICS_ENTRIES should be the number of entries above.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The last entry in char_semantics[] should be blank.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define CHAR_SEMANTICS_ENTRIES 27
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define CHAR_SEMANTICS_STRING "&*@`\\|[]:$=!>-\n#()%+?;^<'\""
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Some utility macros
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define ALLOC(x) ((struct _##x *)getmem(sizeof (struct _##x)))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define ALLOC_WC(x) ((wchar_t *)getmem((x) * SIZEOFWCHAR_T))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define FIND_LENGTH -1
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define GETNAME(a,b) getname_fn((a), (b), false)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define IS_EQUAL(a,b) (!strcmp((a), (b)))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define IS_EQUALN(a,b,n) (!strncmp((a), (b), (n)))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define IS_WEQUAL(a,b) (!wcscmp((a), (b)))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define IS_WEQUALN(a,b,n) (!wcsncmp((a), (b), (n)))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define MBLEN(a) mblen((a), MB_LEN_MAX)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define MBSTOWCS(a,b) (void) mbstowcs_with_check((a), (b), MAXPATHLEN)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define MBTOWC(a,b) mbtowc((a), (b), MB_LEN_MAX)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define SIZEOFWCHAR_T (sizeof (wchar_t))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define VSIZEOF(v) (sizeof (v) / sizeof ((v)[0]))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define WCSTOMBS(a,b) (void) wcstombs((a), (b), (MAXPATHLEN * MB_LEN_MAX))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define WCTOMB(a,b) (void) wctomb((a), (b))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define HASH(v, c) (v = (v)*31 + (unsigned int)(c))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern void mbstowcs_with_check(wchar_t *pwcs, const char *s, size_t n);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Bits stored in funny vector to classify chars
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dollar_sem = 0001,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe meta_sem = 0002,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe percent_sem = 0004,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wildcard_sem = 0010,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command_prefix_sem = 0020,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe special_macro_sem = 0040,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe colon_sem = 0100,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parenleft_sem = 0200
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Type returned from doname class functions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_dont_know = 0,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_failed,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_ok,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_in_progress,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_running, /* PARALLEL & DISTRIBUTED */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_pending, /* PARALLEL & DISTRIBUTED */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_serial, /* PARALLEL & DISTRIBUTED */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_subtree /* PARALLEL & DISTRIBUTED */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Doname;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The String struct defines a string with the following layout
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * "xxxxxxxxxxxxxxxCxxxxxxxxxxxxxxx________"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ^ ^ ^ ^
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * | | | |
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * buffer.start text.p text.end buffer.end
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * text.p points to the next char to read/write.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _String {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Text {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *p; /* Read/Write pointer */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *end; /* Read limit pointer */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } text;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Physical_buffer {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *start; /* Points to start of buffer */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *end; /* End of physical buffer */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } buffer;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean free_after_use:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define STRING_BUFFER_LENGTH 1024
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define INIT_STRING_FROM_STACK(str, buf) { \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe str.buffer.start = (buf); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe str.text.p = (buf); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe str.text.end = NULL; \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe str.buffer.end = (buf) \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe + (sizeof (buf)/SIZEOFWCHAR_T); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe str.free_after_use = false; \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define APPEND_NAME(np, dest, len) append_string((np)->string_mb, (dest), (len));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweclass Wstring {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe public:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _String string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t string_buf[STRING_BUFFER_LENGTH];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe public:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Wstring(struct _Name * name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ~Wstring();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe void init(struct _Name * name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe void init(wchar_t * name, unsigned length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe unsigned length() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return wcslen(string.buffer.start);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe void append_to_str(struct _String * str, unsigned off, unsigned length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * get_string() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return string.buffer.start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t * get_string(unsigned off) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return string.buffer.start + off;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equaln(wchar_t * str, unsigned length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equal(wchar_t * str);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equal(wchar_t * str, unsigned off);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equal(wchar_t * str, unsigned off, unsigned length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equaln(Wstring * str, unsigned length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equal(Wstring * str);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equal(Wstring * str, unsigned off);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean equal(Wstring * str, unsigned off, unsigned length);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Used for storing the $? list and also for the "target + target:"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * construct.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Chain {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Chain *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Percent *percent_member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Stores one command line for a rule
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Cmd_line {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Cmd_line *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *command_line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean make_refd:1; /* $(MAKE) referenced? */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Remember any command line prefixes given
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean ignore_command_dependency:1; /* `?' */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean assign:1; /* `=' */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean ignore_error:1; /* `-' */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean silent:1; /* `@' */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean always_exec:1; /* `+' */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Linked list of targets/files
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Dependency {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Dependency *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean automatic:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean stale:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean built:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The specials are markers for targets that the reader should special case
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe built_last_make_run_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_posix_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe keep_state_file_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe keep_state_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_version_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_parallel_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parallel_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe posix_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe precious_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_posix_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_get_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe suffixes_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe svr4_special,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe localhost_special
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Special;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_colon,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe one_colon,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe two_colon,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe equal_seen,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional_seen,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe none_seen
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Separator;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Magic values for the timestamp stored with each name object
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern const timestruc_t file_no_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern const timestruc_t file_doesnt_exist;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern const timestruc_t file_is_dir;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern const timestruc_t file_min_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern const timestruc_t file_max_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Each Name has a list of properties
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The properties are used to store information that only
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * a subset of the Names need
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditional_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe makefile_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursive_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sccs_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe suffix_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe time_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vpath_alias_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe long_member_name_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe macro_append_prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe env_mem_prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Property_id;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe no_daemon = 0,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chain_daemon
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Daemon;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Env_mem {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Macro_appendix {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *value_to_append;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Macro {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For "ABC = xyz" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Name "ABC" get one macro prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean exported:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean read_only:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This macro is defined conditionally
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_conditional:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The list for $? is stored as a structured list that
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * is translated into a string iff it is referenced.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This is why some macro values need a daemon.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Daemon daemon:2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Macro_list {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Macro_list *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *macro_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweenum sccs_stat {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe DONT_KNOW_SCCS = 0,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe NO_SCCS,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe HAS_SCCS
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Name {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Property *prop; /* List of properties */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *string_mb; /* Multi-byte name string */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe unsigned int length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } hash;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe timestruc_t time; /* Modification */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int stat_errno; /* error from "stat" */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe off_t size; /* Of file */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mode_t mode; /* Of file */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_file:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_dir:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_sym_link:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_precious:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe enum sccs_stat has_sccs:2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } stat;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Count instances of :: definitions for this target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe short colon_splits;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * We only clear the automatic depes once per target per report
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe short temp_file_number;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Count how many conditional macros this target has defined
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe short conditional_cnt;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * A conditional macro was used when building this target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean depends_on_conditional:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Pointer to list of conditional macros which were used to build
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * this target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Macro_list *conditional_macro_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_member_depe:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_member:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This target is a directory that has been read
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_read_dir:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This name is a macro that is now being expanded
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean being_expanded:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This name is a magic name that the reader must know about
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Special special_reader:5;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname state:3;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Separator colons:3;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_depe_list_expanded:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean suffix_scan_done:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_complained:1; /* For sccs */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This target has been built during this make run
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean ran_command:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean with_squiggle:1; /* for .SUFFIXES */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean without_squiggle:1; /* for .SUFFIXES */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_read_suffixes:1; /* Suffix list cached*/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_suffixes:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_target_prop:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_vpath_alias_prop:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean dependency_printed:1; /* For dump_make_state() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean dollar:1; /* In namestring */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean meta:1; /* In namestring */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean percent:1; /* In namestring */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean wildcard:1; /* In namestring */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_parent:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_target:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_built:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean colon:1; /* In namestring */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean parenleft:1; /* In namestring */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_recursive_dependency:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_regular_dependency:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_double_colon:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_double_colon_parent:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_long_member_name:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * allowed to run in parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean parallel:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * not allowed to run in parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean no_parallel:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * used in dependency_conflict
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean checking_subtree:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean added_pattern_conditionals:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * rechecking target for possible rebuild
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean rechecking_target:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * build this target in silent mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean silent_mode:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * build this target in ignore error mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean ignore_error_mode:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean dont_activate_cond_values:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * allowed to run serially on local host
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean localhost:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Stores the % matched default rules
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Percent {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Percent *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name **patterns;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Percent *dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Cmd_line *command_template;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Chain *target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int patterns_total;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean being_expanded;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Conditional {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For "foo := ABC [+]= xyz" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Name "foo" gets one conditional prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int sequence;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean append:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Line {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For "target : dependencies" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Name "target" gets one line prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Cmd_line *command_template;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Cmd_line *command_used;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Dependency *dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe timestruc_t dependency_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Chain *target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean is_out_of_date:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean sccs_command:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean command_template_redefined:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean dont_rebuild_command_used:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Values for the dynamic macros
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *star;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *less;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *percent;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Chain *query;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Makefile {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Names that reference makefiles gets one prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *contents;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe off_t size;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Member {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For "lib(member)" and "lib((entry))" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Name "lib(member)" gets one member prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Name "lib((entry))" gets one member prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The member field is filled in when the prop is refd
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *library;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *entry;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Recursive {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For "target: .RECURSIVE dir makefiles" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Used to keep track of recursive calls to make
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Name "target" gets one recursive prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *directory;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Dependency *makefiles;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean has_built;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean in_depinfo;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Sccs {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Each file that has a SCCS s. file gets one prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *file;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Suffix {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Cached list of suffixes that can build this target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * suffix is built from .SUFFIXES
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *suffix;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Cmd_line *command_template;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Target {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For "target:: dependencies" constructs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The "::" construct is handled by converting it to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * "foo: 1@foo" + "1@foo: dependecies"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * "1@foo" gets one target prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This target prop cause $@ to be bound to "foo"
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * not "1@foo" when the rule is evaluated
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct STime {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Save the original time for :: targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe timestruc_t time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Vpath_alias {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If a file was found using the VPATH it gets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * a vpath_alias prop
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *alias;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Long_member_name {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Targets with a truncated member name carries
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the full lib(member) name for the state file
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *member_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweunion Body {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Macro macro;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Conditional conditional;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Line line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Makefile makefile;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Member member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Recursive recursive;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Sccs sccs;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Suffix suffix;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Target target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct STime time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Vpath_alias vpath_alias;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct Long_member_name long_member_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Macro_appendix macro_appendix;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Env_mem env_mem;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define PROPERTY_HEAD_SIZE (sizeof (struct _Property)-sizeof (union Body))
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Property {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Property *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property_id type:4;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe union Body body;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* Structure for dynamic "ascii" arrays */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct ASCII_Dyn_Array {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *start;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe size_t size;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Envvar {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Name *value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Envvar *next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *env_string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean already_put:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Macros for the reader
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define GOTO_STATE(new_state) { \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe SET_STATE(new_state); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto enter_state; \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define SET_STATE(new_state) state = (new_state)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define UNCACHE_SOURCE() if (source != NULL) { \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source->string.text.p = source_p; \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define CACHE_SOURCE(comp) if (source != NULL) { \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_p = source->string.text.p - \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (comp); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source_end = source->string.text.end; \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define GET_NEXT_BLOCK_NOCHK(source) { UNCACHE_SOURCE(); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe source = get_next_block_fn(source); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe CACHE_SOURCE(0) \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define GET_NEXT_BLOCK(source) { GET_NEXT_BLOCK_NOCHK(source); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (source != NULL && source->error_converting) { \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe GOTO_STATE(illegal_bytes_state); \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define GET_CHAR() ((source == NULL) || \
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (source_p >= source_end) ? 0 : *source_p)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct _Source {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _String string;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct _Source *previous;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe off_t bytes_left_in_file;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe short fd;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean already_expanded:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean error_converting:1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *inp_buf;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *inp_buf_end;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *inp_buf_ptr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reading_nothing,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reading_makefile,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reading_statefile,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rereading_statefile,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reading_cpp_file
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} Makefile_type;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Typedefs for all structs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _Chain *Chain, Chain_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _Envvar *Envvar, Envvar_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _Macro_list *Macro_list, Macro_list_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _Name *Name, Name_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _Property *Property, Property_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _Source *Source, Source_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowetypedef struct _String *String, String_rec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * name records hash table.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestruct Name_set {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprivate:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // single node in a tree
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct entry {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry(Name name_, entry *parent_) :
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe name(name_),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parent(parent_),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe left(0),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe right(0),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depth(1)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry *parent;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry *left;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry *right;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe unsigned depth;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe void setup_depth() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe unsigned rdepth = (right != 0) ? right->depth : 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe unsigned ldepth = (left != 0) ? left->depth : 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe depth = 1 + ((ldepth > rdepth) ? ldepth : rdepth);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowepublic:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // make iterator a friend of Name_set to have access to struct entry
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct iterator;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe friend struct Name_set::iterator;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // iterator over tree nodes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct iterator {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe public:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // constructors
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator() : node(0) {}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator(entry *node_) : node(node_) {}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // dereference operator
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name operator->() const { return node->name; }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // conversion operator
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe operator Name() { return node->name; }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // assignment operator
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator& operator=(const iterator &o) { node = o.node; return *this; }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // equality/inequality operators
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int operator==(const iterator &o) const { return (node == o.node); }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int operator!=(const iterator &o) const { return (node != o.node); }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // pre/post increment operators
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator& operator++();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator operator++(int) { iterator it = *this; ++*this; return it; }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe private:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // the node iterator points to
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry *node;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe };
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowepublic:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // constructor
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name_set() : root(0) {}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // lookup, insert and remove operations
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name lookup(const char *key);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name insert(const char *key, Boolean &found);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe void insert(Name name);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // begin/end iterators
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator begin() const;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe iterator end() const { return iterator(); }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprivate:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // rebalance given node
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe void rebalance(entry *node);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprivate:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe // tree root
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe entry *root;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe};
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * extern declarations for all global variables.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The actual declarations are in globals.cc
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern char char_semantics[];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern wchar_t char_semantics_char[];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Macro_list cond_macro_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean conditional_macro_used;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean do_not_exec_rule; /* `-n' */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean dollarget_seen;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean dollarless_flag;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name dollarless_value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern char **environ;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Envvar envvar;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern int exit_status;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern wchar_t *file_being_read;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/* Variable gnu_style=true if env. var. SUN_MAKE_COMPAT_MODE=GNU (RFE 4866328) */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean gnu_style;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name_set hashtab;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name host_arch;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name host_mach;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern int line_number;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern char *make_state_lockfile;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean make_word_mentioned;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Makefile_type makefile_type;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern char mbs_buffer[];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name path_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean posix;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name query;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean query_mentioned;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name hat;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean reading_environment;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name shell_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean svr4;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name target_arch;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name target_mach;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean tilde_rule;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern wchar_t wcs_buffer[];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean working_on_targets;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name virtual_root;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean vpath_defined;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Name vpath_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean make_state_locked;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern Boolean out_err_same;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweextern pid_t childPid;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * RFE 1257407: make does not use fine granularity time info available from stat.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * High resolution time comparison.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinline int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweoperator==(const timestruc_t &t1, const timestruc_t &t2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return ((t1.tv_sec == t2.tv_sec) && (t1.tv_nsec == t2.tv_nsec));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinline int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweoperator!=(const timestruc_t &t1, const timestruc_t &t2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return ((t1.tv_sec != t2.tv_sec) || (t1.tv_nsec != t2.tv_nsec));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinline int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweoperator>(const timestruc_t &t1, const timestruc_t &t2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (t1.tv_sec == t2.tv_sec) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_nsec > t2.tv_nsec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_sec > t2.tv_sec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinline int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweoperator>=(const timestruc_t &t1, const timestruc_t &t2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (t1.tv_sec == t2.tv_sec) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_nsec >= t2.tv_nsec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_sec > t2.tv_sec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinline int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweoperator<(const timestruc_t &t1, const timestruc_t &t2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (t1.tv_sec == t2.tv_sec) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_nsec < t2.tv_nsec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_sec < t2.tv_sec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweinline int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweoperator<=(const timestruc_t &t1, const timestruc_t &t2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (t1.tv_sec == t2.tv_sec) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_nsec <= t2.tv_nsec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (t1.tv_sec < t2.tv_sec);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#endif