targ.c

来自「早期freebsd实现」· C语言 代码 · 共 586 行 · 第 1/2 页

C
586
字号
/* * Copyright (c) 1988, 1989, 1990, 1993 *	The Regents of the University of California.  All rights reserved. * Copyright (c) 1989 by Berkeley Softworks * All rights reserved. * * This code is derived from software contributed to Berkeley by * Adam de Boor. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)targ.c	8.2 (Berkeley) 3/19/94";#endif /* not lint *//*- * targ.c -- *	Functions for maintaining the Lst allTargets. Target nodes are * kept in two structures: a Lst, maintained by the list library, and a * hash table, maintained by the hash library. * * Interface: *	Targ_Init 	    	Initialization procedure. * *	Targ_NewGN	    	Create a new GNode for the passed target *	    	  	    	(string). The node is *not* placed in the *	    	  	    	hash table, though all its fields are *	    	  	    	initialized. * *	Targ_FindNode	    	Find the node for a given target, creating *	    	  	    	and storing it if it doesn't exist and the *	    	  	    	flags are right (TARG_CREATE) * *	Targ_FindList	    	Given a list of names, find nodes for all *	    	  	    	of them. If a name doesn't exist and the *	    	  	    	TARG_NOCREATE flag was given, an error message *	    	  	    	is printed. Else, if a name doesn't exist, *	    	  	    	its node is created. * *	Targ_Ignore	    	Return TRUE if errors should be ignored when *	    	  	    	creating the given target. * *	Targ_Silent	    	Return TRUE if we should be silent when *	    	  	    	creating the given target. * *	Targ_Precious	    	Return TRUE if the target is precious and *	    	  	    	should not be removed if we are interrupted. * * Debugging: *	Targ_PrintGraph	    	Print out the entire graphm all variables *	    	  	    	and statistics for the directory cache. Should *	    	  	    	print something for suffixes, too, but... */#include	  <stdio.h>#include	  <time.h>#include	  "make.h"#include	  "hash.h"#include	  "dir.h"static Lst        allTargets;	/* the list of all targets found so far */static Hash_Table targets;	/* a hash table of same */#define HTSIZE	191		/* initial size of hash table *//*- *----------------------------------------------------------------------- * Targ_Init -- *	Initialize this module * * Results: *	None * * Side Effects: *	The allTargets list and the targets hash table are initialized *----------------------------------------------------------------------- */voidTarg_Init (){    allTargets = Lst_Init (FALSE);    Hash_InitTable (&targets, HTSIZE);}/*- *----------------------------------------------------------------------- * Targ_NewGN  -- *	Create and initialize a new graph node * * Results: *	An initialized graph node with the name field filled with a copy *	of the passed name * * Side Effects: *	None. *----------------------------------------------------------------------- */GNode *Targ_NewGN (name)    char           *name;	/* the name to stick in the new node */{    register GNode *gn;    gn = (GNode *) emalloc (sizeof (GNode));    gn->name = strdup (name);    gn->path = (char *) 0;    if (name[0] == '-' && name[1] == 'l') {	gn->type = OP_LIB;    } else {	gn->type = 0;    }    gn->unmade =    	0;    gn->make = 	    	FALSE;    gn->made = 	    	UNMADE;    gn->childMade = 	FALSE;    gn->mtime = gn->cmtime = 0;    gn->iParents =  	Lst_Init (FALSE);    gn->cohorts =   	Lst_Init (FALSE);    gn->parents =   	Lst_Init (FALSE);    gn->children =  	Lst_Init (FALSE);    gn->successors = 	Lst_Init(FALSE);    gn->preds =     	Lst_Init(FALSE);    gn->context =   	Lst_Init (FALSE);    gn->commands =  	Lst_Init (FALSE);    gn->suffix =	NULL;    return (gn);}/*- *----------------------------------------------------------------------- * Targ_FindNode  -- *	Find a node in the list using the given name for matching * * Results: *	The node in the list if it was. If it wasn't, return NILGNODE of *	flags was TARG_NOCREATE or the newly created and initialized node *	if it was TARG_CREATE * * Side Effects: *	Sometimes a node is created and added to the list *----------------------------------------------------------------------- */GNode *Targ_FindNode (name, flags)    char           *name;	/* the name to find */    int             flags;	/* flags governing events when target not				 * found */{    GNode         *gn;	      /* node in that element */    Hash_Entry	  *he;	      /* New or used hash entry for node */    Boolean	  isNew;      /* Set TRUE if Hash_CreateEntry had to create */			      /* an entry for the node */    if (flags & TARG_CREATE) {	he = Hash_CreateEntry (&targets, name, &isNew);	if (isNew) {	    gn = Targ_NewGN (name);	    Hash_SetValue (he, gn);	    (void) Lst_AtEnd (allTargets, (ClientData)gn);	}    } else {	he = Hash_FindEntry (&targets, name);    }    if (he == (Hash_Entry *) NULL) {	return (NILGNODE);    } else {	return ((GNode *) Hash_GetValue (he));    }}/*- *----------------------------------------------------------------------- * Targ_FindList -- *	Make a complete list of GNodes from the given list of names  * * Results: *	A complete list of graph nodes corresponding to all instances of all *	the names in names.  * * Side Effects: *	If flags is TARG_CREATE, nodes will be created for all names in *	names which do not yet have graph nodes. If flags is TARG_NOCREATE, *	an error message will be printed for each name which can't be found. * ----------------------------------------------------------------------- */LstTarg_FindList (names, flags)    Lst        	   names;	/* list of names to find */    int            flags;	/* flags used if no node is found for a given				 * name */{    Lst            nodes;	/* result list */    register LstNode  ln;		/* name list element */    register GNode *gn;		/* node in tLn */    char    	  *name;    nodes = Lst_Init (FALSE);    if (Lst_Open (names) == FAILURE) {	return (nodes);    }    while ((ln = Lst_Next (names)) != NILLNODE) {	name = (char *)Lst_Datum(ln);	gn = Targ_FindNode (name, flags);	if (gn != NILGNODE) {	    /*	     * Note: Lst_AtEnd must come before the Lst_Concat so the nodes	     * are added to the list in the order in which they were	     * encountered in the makefile.	     */	    (void) Lst_AtEnd (nodes, (ClientData)gn);	    if (gn->type & OP_DOUBLEDEP) {		(void)Lst_Concat (nodes, gn->cohorts, LST_CONCNEW);	    }	} else if (flags == TARG_NOCREATE) {	    Error ("\"%s\" -- target unknown.", name);	}    }    Lst_Close (names);    return (nodes);}/*- *----------------------------------------------------------------------- * Targ_Ignore  -- *	Return true if should ignore errors when creating gn * * Results: *	TRUE if should ignore errors * * Side Effects: *	None *----------------------------------------------------------------------- */BooleanTarg_Ignore (gn)    GNode          *gn;		/* node to check for */{    if (ignoreErrors || gn->type & OP_IGNORE) {	return (TRUE);    } else {	return (FALSE);    }}/*- *----------------------------------------------------------------------- * Targ_Silent  -- *	Return true if be silent when creating gn * * Results: *	TRUE if should be silent * * Side Effects: *	None *----------------------------------------------------------------------- */BooleanTarg_Silent (gn)    GNode          *gn;		/* node to check for */{    if (beSilent || gn->type & OP_SILENT) {	return (TRUE);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?