diff options
author | peter <peter@FreeBSD.org> | 1996-10-06 15:57:15 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1996-10-06 15:57:15 +0000 |
commit | 4370a5a248c28b9ebcc0cf8c4b8280ffaabf8e00 (patch) | |
tree | 1a7a5d8132f1feb3d2ce835bc720e0d9f208ff62 /usr.bin | |
parent | 7bee03ad1db0ca4a78d6e5ff8dd19b3286eea5eb (diff) | |
download | FreeBSD-src-4370a5a248c28b9ebcc0cf8c4b8280ffaabf8e00.zip FreeBSD-src-4370a5a248c28b9ebcc0cf8c4b8280ffaabf8e00.tar.gz |
Import the 4.4BSD-Lite2 version of make onto the vendor branch
"for reference". This doesn't change anything since all files
have been touched.
Diffstat (limited to 'usr.bin')
56 files changed, 1604 insertions, 779 deletions
diff --git a/usr.bin/make/Makefile b/usr.bin/make/Makefile index 8ee4ba6..b6ae9fc 100644 --- a/usr.bin/make/Makefile +++ b/usr.bin/make/Makefile @@ -1,7 +1,8 @@ -# @(#)Makefile 8.1 (Berkeley) 6/6/93 +# from: @(#)Makefile 5.2 (Berkeley) 12/28/90 +# $Id: Makefile,v 1.6 1994/06/30 05:33:39 cgd Exp $ PROG= make -CFLAGS+=-I${.CURDIR} +CFLAGS+= -I${.CURDIR} -DPOSIX SRCS= arch.c buf.c compat.c cond.c dir.c for.c hash.c job.c main.c \ make.c parse.c str.c suff.c targ.c var.c SRCS+= lstAppend.c lstAtEnd.c lstAtFront.c lstClose.c lstConcat.c \ @@ -11,4 +12,8 @@ SRCS+= lstAppend.c lstAtEnd.c lstAtFront.c lstClose.c lstConcat.c \ lstMember.c lstNext.c lstOpen.c lstRemove.c lstReplace.c lstSucc.c .PATH: ${.CURDIR}/lst.lib +.if make(install) +SUBDIR+= PSD.doc +.endif + .include <bsd.prog.mk> diff --git a/usr.bin/make/PSD.doc/tutorial.ms b/usr.bin/make/PSD.doc/tutorial.ms index eca49d9..3cd869d 100644 --- a/usr.bin/make/PSD.doc/tutorial.ms +++ b/usr.bin/make/PSD.doc/tutorial.ms @@ -34,7 +34,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)tutorial.ms 8.1 (Berkeley) 8/18/93 +.\" @(#)tutorial.ms 8.4 (Berkeley) 4/28/95 .\" .EH 'PSD:12-%''PMake \*- A Tutorial' .OH 'PMake \*- A Tutorial''PSD:12-%' diff --git a/usr.bin/make/arch.c b/usr.bin/make/arch.c index ad7f61f..64071dc 100644 --- a/usr.bin/make/arch.c +++ b/usr.bin/make/arch.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)arch.c 8.2 (Berkeley) 1/2/94"; +static char sccsid[] = "@(#)arch.c 8.3 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -84,15 +84,19 @@ static char sccsid[] = "@(#)arch.c 8.2 (Berkeley) 1/2/94"; * is out-of-date. * * Arch_Init Initialize this module. + * + * Arch_End Cleanup this module. */ #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> +#include <sys/param.h> #include <ctype.h> #include <ar.h> #include <ranlib.h> #include <stdio.h> +#include <stdlib.h> #include "make.h" #include "hash.h" #include "dir.h" @@ -106,12 +110,47 @@ typedef struct Arch { * by <name, struct ar_hdr *> key/value pairs */ } Arch; -static int ArchFindArchive __P((Arch *, char *)); +static int ArchFindArchive __P((ClientData, ClientData)); +static void ArchFree __P((ClientData)); static struct ar_hdr *ArchStatMember __P((char *, char *, Boolean)); static FILE *ArchFindMember __P((char *, char *, struct ar_hdr *, char *)); /*- *----------------------------------------------------------------------- + * ArchFree -- + * Free memory used by an archive + * + * Results: + * None. + * + * Side Effects: + * None. + * + *----------------------------------------------------------------------- + */ +static void +ArchFree(ap) + ClientData ap; +{ + Arch *a = (Arch *) ap; + Hash_Search search; + Hash_Entry *entry; + + /* Free memory from hash entries */ + for (entry = Hash_EnumFirst(&a->members, &search); + entry != (Hash_Entry *)NULL; + entry = Hash_EnumNext(&search)) + free((Address) Hash_GetValue (entry)); + + free(a->name); + Hash_DeleteTable(&a->members); + free((Address) a); +} + + + +/*- + *----------------------------------------------------------------------- * Arch_ParseArchive -- * Parse the archive specification in the given line and find/create * the nodes for the specified archive members, placing their nodes @@ -375,10 +414,10 @@ Arch_ParseArchive (linePtr, nodeLst, ctxt) */ static int ArchFindArchive (ar, archName) - Arch *ar; /* Current list element */ - char *archName; /* Name we want */ + ClientData ar; /* Current list element */ + ClientData archName; /* Name we want */ { - return (strcmp (archName, ar->name)); + return (strcmp ((char *) archName, ((Arch *) ar)->name)); } /*- @@ -411,19 +450,12 @@ ArchStatMember (archive, member, hash) int size; /* Size of archive member */ char *cp; /* Useful character pointer */ char magic[SARMAG]; - int len; LstNode ln; /* Lst member containing archive descriptor */ Arch *ar; /* Archive descriptor */ Hash_Entry *he; /* Entry containing member's description */ struct ar_hdr arh; /* archive-member header for reading archive */ - char memName[AR_MAX_NAME_LEN+1]; - /* Current member name while hashing. The name is - * truncated to AR_MAX_NAME_LEN bytes, but we need - * room for the null byte... */ - char copy[AR_MAX_NAME_LEN+1]; - /* Holds copy of last path element from member, if - * it has to be truncated, so we don't have to - * figure it out again once the table is hashed. */ + char memName[MAXPATHLEN+1]; + /* Current member name while hashing. */ /* * Because of space constraints and similar things, files are archived @@ -435,13 +467,6 @@ ArchStatMember (archive, member, hash) if (cp != (char *) NULL) { member = cp + 1; } - len = strlen (member); - if (len > AR_MAX_NAME_LEN) { - len = AR_MAX_NAME_LEN; - strncpy(copy, member, AR_MAX_NAME_LEN); - copy[AR_MAX_NAME_LEN] = '\0'; - member = copy; - } ln = Lst_Find (archives, (ClientData) archive, ArchFindArchive); if (ln != NILLNODE) { @@ -452,6 +477,17 @@ ArchStatMember (archive, member, hash) if (he != (Hash_Entry *) NULL) { return ((struct ar_hdr *) Hash_GetValue (he)); } else { + /* Try truncated name */ + char copy[AR_MAX_NAME_LEN+1]; + int len = strlen (member); + + if (len > AR_MAX_NAME_LEN) { + len = AR_MAX_NAME_LEN; + strncpy(copy, member, AR_MAX_NAME_LEN); + copy[AR_MAX_NAME_LEN] = '\0'; + } + if (he = Hash_FindEntry (&ar->members, copy)) + return ((struct ar_hdr *) Hash_GetValue (he)); return ((struct ar_hdr *) NULL); } } @@ -517,10 +553,39 @@ ArchStatMember (archive, member, hash) } cp[1] = '\0'; - he = Hash_CreateEntry (&ar->members, strdup (memName), - (Boolean *)NULL); +#ifdef AR_EFMT1 + /* + * BSD 4.4 extended AR format: #1/<namelen>, with name as the + * first <namelen> bytes of the file + */ + if (strncmp(memName, AR_EFMT1, sizeof(AR_EFMT1) - 1) == 0 && + isdigit(memName[sizeof(AR_EFMT1) - 1])) { + + unsigned int elen = atoi(&memName[sizeof(AR_EFMT1)-1]); + + if (elen > MAXPATHLEN) { + fclose (arch); + Hash_DeleteTable (&ar->members); + free ((Address)ar); + return ((struct ar_hdr *) NULL); + } + if (fread (memName, elen, 1, arch) != 1) { + fclose (arch); + Hash_DeleteTable (&ar->members); + free ((Address)ar); + return ((struct ar_hdr *) NULL); + } + memName[elen] = '\0'; + fseek (arch, -elen, 1); + if (DEBUG(ARCH) || DEBUG(MAKE)) { + printf("ArchStat: Extended format entry for %s\n", memName); + } + } +#endif + + he = Hash_CreateEntry (&ar->members, memName, (Boolean *)NULL); Hash_SetValue (he, (ClientData)emalloc (sizeof (struct ar_hdr))); - memcpy ((Address)Hash_GetValue (he), (Address)&arh, + memcpy ((Address)Hash_GetValue (he), (Address)&arh, sizeof (struct ar_hdr)); } /* @@ -530,7 +595,7 @@ ArchStatMember (archive, member, hash) * 'size' field of the header and round it up during the seek. */ arh.ar_size[sizeof(arh.ar_size)-1] = '\0'; - (void) sscanf (arh.ar_size, "%10d", &size); + size = (int) strtol(arh.ar_size, NULL, 10); fseek (arch, (size + 1) & ~1, 1); } @@ -580,7 +645,7 @@ ArchFindMember (archive, member, arhPtr, mode) int size; /* Size of archive member */ char *cp; /* Useful character pointer */ char magic[SARMAG]; - int len; + int len, tlen; arch = fopen (archive, mode); if (arch == (FILE *) NULL) { @@ -607,9 +672,9 @@ ArchFindMember (archive, member, arhPtr, mode) if (cp != (char *) NULL) { member = cp + 1; } - len = strlen (member); + len = tlen = strlen (member); if (len > sizeof (arhPtr->ar_name)) { - len = sizeof (arhPtr->ar_name); + tlen = sizeof (arhPtr->ar_name); } while (fread ((char *)arhPtr, sizeof (struct ar_hdr), 1, arch) == 1) { @@ -620,7 +685,7 @@ ArchFindMember (archive, member, arhPtr, mode) */ fclose (arch); return ((FILE *) NULL); - } else if (strncmp (member, arhPtr->ar_name, len) == 0) { + } else if (strncmp (member, arhPtr->ar_name, tlen) == 0) { /* * If the member's name doesn't take up the entire 'name' field, * we have to be careful of matching prefixes. Names are space- @@ -628,8 +693,8 @@ ArchFindMember (archive, member, arhPtr, mode) * of the matched string is anything but a space, this isn't the * member we sought. */ - if (len != sizeof(arhPtr->ar_name) && arhPtr->ar_name[len] != ' '){ - continue; + if (tlen != sizeof(arhPtr->ar_name) && arhPtr->ar_name[tlen] != ' '){ + goto skip; } else { /* * To make life easier, we reposition the file at the start @@ -641,7 +706,42 @@ ArchFindMember (archive, member, arhPtr, mode) fseek (arch, -sizeof(struct ar_hdr), 1); return (arch); } - } else { + } else +#ifdef AR_EFMT1 + /* + * BSD 4.4 extended AR format: #1/<namelen>, with name as the + * first <namelen> bytes of the file + */ + if (strncmp(arhPtr->ar_name, AR_EFMT1, + sizeof(AR_EFMT1) - 1) == 0 && + isdigit(arhPtr->ar_name[sizeof(AR_EFMT1) - 1])) { + + unsigned int elen = atoi(&arhPtr->ar_name[sizeof(AR_EFMT1)-1]); + char ename[MAXPATHLEN]; + + if (elen > MAXPATHLEN) { + fclose (arch); + return NULL; + } + if (fread (ename, elen, 1, arch) != 1) { + fclose (arch); + return NULL; + } + ename[elen] = '\0'; + if (DEBUG(ARCH) || DEBUG(MAKE)) { + printf("ArchFind: Extended format entry for %s\n", ename); + } + if (strncmp(ename, member, len) == 0) { + /* Found as extended name */ + fseek (arch, -sizeof(struct ar_hdr) - elen, 1); + return (arch); + } + fseek (arch, -elen, 1); + goto skip; + } else +#endif + { +skip: /* * This isn't the member we're after, so we need to advance the * stream's pointer to the start of the next header. Files are @@ -650,7 +750,7 @@ ArchFindMember (archive, member, arhPtr, mode) * header and round it up during the seek. */ arhPtr->ar_size[sizeof(arhPtr->ar_size)-1] = '\0'; - (void)sscanf (arhPtr->ar_size, "%10d", &size); + size = (int) strtol(arhPtr->ar_size, NULL, 10); fseek (arch, (size + 1) & ~1, 1); } } @@ -684,10 +784,15 @@ Arch_Touch (gn) { FILE * arch; /* Stream open to archive, positioned properly */ struct ar_hdr arh; /* Current header describing member */ + char *p1, *p2; - arch = ArchFindMember(Var_Value (ARCHIVE, gn), - Var_Value (TARGET, gn), + arch = ArchFindMember(Var_Value (ARCHIVE, gn, &p1), + Var_Value (TARGET, gn, &p2), &arh, "r+"); + if (p1) + free(p1); + if (p2) + free(p2); sprintf(arh.ar_date, "%-12ld", (long) now); if (arch != (FILE *) NULL) { @@ -752,12 +857,18 @@ Arch_MTime (gn) { struct ar_hdr *arhPtr; /* Header of desired member */ int modTime; /* Modification time as an integer */ + char *p1, *p2; - arhPtr = ArchStatMember (Var_Value (ARCHIVE, gn), - Var_Value (TARGET, gn), + arhPtr = ArchStatMember (Var_Value (ARCHIVE, gn, &p1), + Var_Value (TARGET, gn, &p2), TRUE); + if (p1) + free(p1); + if (p2) + free(p2); + if (arhPtr != (struct ar_hdr *) NULL) { - (void)sscanf (arhPtr->ar_date, "%12d", &modTime); + modTime = (int) strtol(arhPtr->ar_date, NULL, 10); } else { modTime = 0; } @@ -886,10 +997,14 @@ Arch_FindLib (gn, path) * Its modification time is greater than the time at which the * make began (i.e. it's been modified in the course * of the make, probably by archiving). - * Its modification time doesn't agree with the modification - * time of its RANLIBMAG member (i.e. its table of contents - * is out-of-date). - * + * The modification time of one of its sources is greater than + * the one of its RANLIBMAG member (i.e. its table of contents + * is out-of-date). We don't compare of the archive time + * vs. TOC time because they can be too close. In my + * opinion we should not bother with the TOC at all since + * this is used by 'ar' rules that affect the data contents + * of the archive, not by ranlib rules, which affect the + * TOC. * * Results: * TRUE if the library is out-of-date. FALSE otherwise. @@ -916,12 +1031,12 @@ Arch_LibOODate (gn) arhPtr = ArchStatMember (gn->path, RANLIBMAG, FALSE); if (arhPtr != (struct ar_hdr *)NULL) { - (void)sscanf (arhPtr->ar_date, "%12d", &modTimeTOC); + modTimeTOC = (int) strtol(arhPtr->ar_date, NULL, 10); if (DEBUG(ARCH) || DEBUG(MAKE)) { printf("%s modified %s...", RANLIBMAG, Targ_FmtTime(modTimeTOC)); } - oodate = (gn->mtime > modTimeTOC); + oodate = (gn->cmtime > modTimeTOC); } else { /* * A library w/o a table of contents is out-of-date @@ -953,3 +1068,24 @@ Arch_Init () { archives = Lst_Init (FALSE); } + + + +/*- + *----------------------------------------------------------------------- + * Arch_End -- + * Cleanup things for this module. + * + * Results: + * None. + * + * Side Effects: + * The 'archives' list is freed + * + *----------------------------------------------------------------------- + */ +void +Arch_End () +{ + Lst_Destroy(archives, ArchFree); +} diff --git a/usr.bin/make/buf.c b/usr.bin/make/buf.c index 3d9e9d6..68a534d 100644 --- a/usr.bin/make/buf.c +++ b/usr.bin/make/buf.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)buf.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)buf.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -94,9 +94,9 @@ Buf_OvAddByte (bp, byte) register Buffer bp; int byte; { - + int nbytes = 1; bp->left = 0; - BufExpand (bp, 1); + BufExpand (bp, nbytes); *bp->inPtr++ = byte; bp->left--; diff --git a/usr.bin/make/buf.h b/usr.bin/make/buf.h index 63c85c0..33313b8 100644 --- a/usr.bin/make/buf.h +++ b/usr.bin/make/buf.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)buf.h 8.1 (Berkeley) 6/6/93 + * @(#)buf.h 8.2 (Berkeley) 4/28/95 */ /*- @@ -48,7 +48,7 @@ #include "sprite.h" -typedef unsigned char Byte; +typedef char Byte; typedef struct Buffer { int size; /* Current size of the buffer */ @@ -65,16 +65,16 @@ typedef struct Buffer { #define BUF_ERROR 256 -void Buf_AddBytes __P((Buffer, int, Byte *)); -void Buf_Destroy __P((Buffer, Boolean)); -void Buf_Discard __P((Buffer, int)); -Byte *Buf_GetAll __P((Buffer, int *)); -int Buf_GetByte __P((Buffer)); -int Buf_GetBytes __P((Buffer, int, Byte *)); -Buffer Buf_Init __P((int)); -void Buf_OvAddByte __P((Buffer, int)); -int Buf_Size __P((Buffer)); -void Buf_UngetByte __P((Buffer, int)); -void Buf_UngetBytes __P((Buffer, int, Byte *)); +void Buf_OvAddByte __P((Buffer, int)); +void Buf_AddBytes __P((Buffer, int, Byte *)); +void Buf_UngetByte __P((Buffer, int)); +void Buf_UngetBytes __P((Buffer, int, Byte *)); +int Buf_GetByte __P((Buffer)); +int Buf_GetBytes __P((Buffer, int, Byte *)); +Byte *Buf_GetAll __P((Buffer, int *)); +void Buf_Discard __P((Buffer, int)); +int Buf_Size __P((Buffer)); +Buffer Buf_Init __P((int)); +void Buf_Destroy __P((Buffer, Boolean)); #endif /* _BUF_H */ diff --git a/usr.bin/make/compat.c b/usr.bin/make/compat.c index a14e296..9cab63c 100644 --- a/usr.bin/make/compat.c +++ b/usr.bin/make/compat.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)compat.c 8.2 (Berkeley) 3/19/94"; +static char sccsid[] = "@(#)compat.c 8.3 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -53,15 +53,13 @@ static char sccsid[] = "@(#)compat.c 8.2 (Berkeley) 3/19/94"; * thems as need creatin' */ +#include <stdio.h> #include <sys/types.h> -#include <sys/stat.h> +#include <sys/signal.h> #include <sys/wait.h> - +#include <sys/errno.h> +#include <sys/stat.h> #include <ctype.h> -#include <errno.h> -#include <signal.h> -#include <stdio.h> - #include "make.h" #include "hash.h" #include "dir.h" @@ -80,8 +78,8 @@ static char meta[256]; static GNode *curTarg = NILGNODE; static GNode *ENDNode; static void CompatInterrupt __P((int)); -static int CompatRunCommand __P((char *, GNode *)); -static int CompatMake __P((GNode *, GNode *)); +static int CompatRunCommand __P((ClientData, ClientData)); +static int CompatMake __P((ClientData, ClientData)); /*- *----------------------------------------------------------------------- @@ -102,16 +100,19 @@ static void CompatInterrupt (signo) int signo; { - struct stat sb; GNode *gn; if ((curTarg != NILGNODE) && !Targ_Precious (curTarg)) { - char *file = Var_Value (TARGET, curTarg); + char *p1; + char *file = Var_Value (TARGET, curTarg, &p1); + struct stat st; - if (!stat(file, &sb) && S_ISREG(sb.st_mode) && - unlink (file) == SUCCESS) { + if (!noExecute && lstat(file, &st) != -1 && !S_ISDIR(st.st_mode) && + unlink(file) != -1) { printf ("*** %s removed\n", file); } + if (p1) + free(p1); /* * Run .INTERRUPT only if hit with interrupt signal @@ -122,8 +123,9 @@ CompatInterrupt (signo) Lst_ForEach(gn->commands, CompatRunCommand, (ClientData)gn); } } + } - exit (0); + exit (signo); } /*- @@ -141,9 +143,9 @@ CompatInterrupt (signo) *----------------------------------------------------------------------- */ static int -CompatRunCommand (cmd, gn) - char *cmd; /* Command to execute */ - GNode *gn; /* Node from which the command came */ +CompatRunCommand (cmdp, gnp) + ClientData cmdp; /* Command to execute */ + ClientData gnp; /* Node from which the command came */ { char *cmdStart; /* Start of expanded command */ register char *cp; @@ -159,16 +161,17 @@ CompatRunCommand (cmd, gn) * dynamically allocated */ Boolean local; /* TRUE if command should be executed * locally */ + char *cmd = (char *) cmdp; + GNode *gn = (GNode *) gnp; - /* + /* * Avoid clobbered variable warnings by forcing the compiler * to ``unregister'' variables - */ + */ #if __GNUC__ - (void) &av; + (void) &av; (void) &errCheck; -#endif - +#endif silent = gn->type & OP_SILENT; errCheck = !(gn->type & OP_IGNORE); @@ -183,6 +186,7 @@ CompatRunCommand (cmd, gn) */ if (*cmdStart == '\0') { + free(cmdStart); Error("%s expands to empty string", cmd); return(0); } else { @@ -257,7 +261,7 @@ CompatRunCommand (cmd, gn) * brk_string sticks our name in av[0], so we have to * skip over it... */ - av = brk_string(cmd, &argc); + av = brk_string(cmd, &argc, TRUE); av += 1; } @@ -280,16 +284,13 @@ CompatRunCommand (cmd, gn) } exit(1); } + free(cmdStart); + Lst_Replace (cmdNode, (ClientData) NULL); /* * The child is off and running. Now all we can do is wait... */ while (1) { - int id; - - if (!local) { - id = 0; - } while ((stat = wait((int *)&reason)) != cpid) { if (stat == -1 && errno != EINTR) { @@ -354,10 +355,12 @@ CompatRunCommand (cmd, gn) *----------------------------------------------------------------------- */ static int -CompatMake (gn, pgn) - GNode *gn; /* The node to make */ - GNode *pgn; /* Parent to abort if necessary */ +CompatMake (gnp, pgnp) + ClientData gnp; /* The node to make */ + ClientData pgnp; /* Parent to abort if necessary */ { + GNode *gn = (GNode *) gnp; + GNode *pgn = (GNode *) pgnp; if (gn->type & OP_USE) { Make_HandleUse(gn, pgn); } else if (gn->made == UNMADE) { @@ -380,7 +383,10 @@ CompatMake (gn, pgn) } if (Lst_Member (gn->iParents, pgn) != NILLNODE) { - Var_Set (IMPSRC, Var_Value(TARGET, gn), pgn); + char *p1; + Var_Set (IMPSRC, Var_Value(TARGET, gn, &p1), pgn); + if (p1) + free(p1); } /* @@ -528,7 +534,10 @@ CompatMake (gn, pgn) pgn->make = FALSE; } else { if (Lst_Member (gn->iParents, pgn) != NILLNODE) { - Var_Set (IMPSRC, Var_Value(TARGET, gn), pgn); + char *p1; + Var_Set (IMPSRC, Var_Value(TARGET, gn, &p1), pgn); + if (p1) + free(p1); } switch(gn->made) { case BEINGMADE: diff --git a/usr.bin/make/cond.c b/usr.bin/make/cond.c index cec9e1e..6ea0d6a 100644 --- a/usr.bin/make/cond.c +++ b/usr.bin/make/cond.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)cond.c 8.2 (Berkeley) 1/2/94"; +static char sccsid[] = "@(#)cond.c 8.3 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -96,7 +96,7 @@ typedef enum { */ static int CondGetArg __P((char **, char **, char *, Boolean)); static Boolean CondDoDefined __P((int, char *)); -static int CondStrMatch __P((char *, char *)); +static int CondStrMatch __P((ClientData, ClientData)); static Boolean CondDoMake __P((int, char *)); static Boolean CondDoExists __P((int, char *)); static Boolean CondDoTarget __P((int, char *)); @@ -277,14 +277,17 @@ CondDoDefined (argLen, arg) char *arg; { char savec = arg[argLen]; + char *p1; Boolean result; arg[argLen] = '\0'; - if (Var_Value (arg, VAR_CMD) != (char *)NULL) { + if (Var_Value (arg, VAR_CMD, &p1) != (char *)NULL) { result = TRUE; } else { result = FALSE; } + if (p1) + free(p1); arg[argLen] = savec; return (result); } @@ -305,10 +308,10 @@ CondDoDefined (argLen, arg) */ static int CondStrMatch(string, pattern) - char *string; - char *pattern; + ClientData string; + ClientData pattern; { - return(!Str_Match(string,pattern)); + return(!Str_Match((char *) string,(char *) pattern)); } /*- @@ -532,7 +535,8 @@ CondToken(doEval) } condExpr += varSpecLen; - if (!isspace(*condExpr) && strchr("!=><", *condExpr) == NULL) { + if (!isspace((unsigned char) *condExpr) && + strchr("!=><", *condExpr) == NULL) { Buffer buf; char *cp; @@ -544,7 +548,8 @@ CondToken(doEval) if (doFree) free(lhs); - for (;*condExpr && !isspace(*condExpr); condExpr++) + for (;*condExpr && !isspace((unsigned char) *condExpr); + condExpr++) Buf_AddByte(buf, (Byte)*condExpr); Buf_AddByte(buf, (Byte)'\0'); @@ -557,7 +562,7 @@ CondToken(doEval) /* * Skip whitespace to get to the operator */ - while (isspace(*condExpr)) + while (isspace((unsigned char) *condExpr)) condExpr++; /* @@ -583,7 +588,7 @@ CondToken(doEval) goto do_compare; } - while (isspace(*condExpr)) { + while (isspace((unsigned char) *condExpr)) { condExpr++; } if (*condExpr == '\0') { @@ -703,7 +708,8 @@ do_string_compare: /* * Skip over the right-hand side */ - while(!isspace(*condExpr) && (*condExpr != '\0')) { + while(!isspace((unsigned char) *condExpr) && + (*condExpr != '\0')) { condExpr++; } } @@ -810,9 +816,8 @@ error: for (arglen = 0; condExpr[arglen] != '(' && condExpr[arglen] != '\0'; arglen += 1) - { - /* void */ ; - } + continue; + if (condExpr[arglen] != '\0') { val = Var_Parse(&condExpr[arglen - 1], VAR_CMD, doEval, &length, &doFree); @@ -824,7 +829,7 @@ error: * spaces... 4/15/92, christos */ char *p; - for (p = val; *p && isspace(*p); p++) + for (p = val; *p && isspace((unsigned char)*p); p++) continue; t = (*p == '\0') ? True : False; } diff --git a/usr.bin/make/config.h b/usr.bin/make/config.h index c00ee33..1f70f37 100644 --- a/usr.bin/make/config.h +++ b/usr.bin/make/config.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)config.h 8.1 (Berkeley) 6/6/93 + * @(#)config.h 8.2 (Berkeley) 4/28/95 */ #define DEFSHELL 1 /* Bourne shell */ diff --git a/usr.bin/make/dir.c b/usr.bin/make/dir.c index a3093ad..e515fbb 100644 --- a/usr.bin/make/dir.c +++ b/usr.bin/make/dir.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)dir.c 8.2 (Berkeley) 1/2/94"; +static char sccsid[] = "@(#)dir.c 8.3 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -49,6 +49,8 @@ static char sccsid[] = "@(#)dir.c 8.2 (Berkeley) 1/2/94"; * The interface for this module is: * Dir_Init Initialize the module. * + * Dir_End Cleanup the module. + * * Dir_HasWildcards Returns TRUE if the name given it needs to * be wildcard-expanded. * @@ -184,12 +186,12 @@ static Hash_Table mtimes; /* Results of doing a last-resort stat in * should be ok, but... */ -static int DirFindName __P((Path *, char *)); +static int DirFindName __P((ClientData, ClientData)); static int DirMatchFiles __P((char *, Path *, Lst)); static void DirExpandCurly __P((char *, char *, Lst, Lst)); static void DirExpandInt __P((char *, Lst, Lst)); -static int DirPrintWord __P((char *)); -static int DirPrintDir __P((Path *)); +static int DirPrintWord __P((ClientData, ClientData)); +static int DirPrintDir __P((ClientData, ClientData)); /*- *----------------------------------------------------------------------- @@ -228,6 +230,30 @@ Dir_Init () /*- *----------------------------------------------------------------------- + * Dir_End -- + * cleanup things for this module + * + * Results: + * none + * + * Side Effects: + * none + *----------------------------------------------------------------------- + */ +void +Dir_End() +{ + dot->refCount -= 1; + Dir_Destroy((ClientData) dot); + Dir_ClearPath(dirSearchPath); + Lst_Destroy(dirSearchPath, NOFREE); + Dir_ClearPath(openDirectories); + Lst_Destroy(openDirectories, NOFREE); + Hash_DeleteTable(&mtimes); +} + +/*- + *----------------------------------------------------------------------- * DirFindName -- * See if the Path structure describes the same directory as the * given one by comparing their names. Called from Dir_AddDir via @@ -242,10 +268,10 @@ Dir_Init () */ static int DirFindName (p, dname) - Path *p; /* Current name */ - char *dname; /* Desired name */ + ClientData p; /* Current name */ + ClientData dname; /* Desired name */ { - return (strcmp (p->name, dname)); + return (strcmp (((Path *)p)->name, (char *) dname)); } /*- @@ -490,12 +516,13 @@ DirExpandInt(word, path, expansions) *----------------------------------------------------------------------- */ static int -DirPrintWord(word) - char *word; +DirPrintWord(word, dummy) + ClientData word; + ClientData dummy; { - printf("%s ", word); + printf("%s ", (char *) word); - return(0); + return(dummy ? 0 : 0); } /*- @@ -606,7 +633,7 @@ Dir_Expand (word, path, expansions) } } if (DEBUG(DIR)) { - Lst_ForEach(expansions, DirPrintWord, NULL); + Lst_ForEach(expansions, DirPrintWord, (ClientData) 0); fputc('\n', stdout); } } @@ -712,7 +739,7 @@ Dir_FindFile (name, path) */ p1 = p->name + strlen (p->name) - 1; p2 = cp - 2; - while (p2 >= name && *p1 == *p2) { + while (p2 >= name && p1 >= p->name && *p1 == *p2) { p1 -= 1; p2 -= 1; } if (p2 >= name || (p1 >= p->name && *p1 != '/')) { @@ -824,7 +851,7 @@ Dir_FindFile (name, path) } entry = Hash_CreateEntry(&mtimes, (char *) file, (Boolean *)NULL); - Hash_SetValue(entry, stb.st_mtime); + Hash_SetValue(entry, (long)stb.st_mtime); nearmisses += 1; return (file); } else { @@ -902,7 +929,7 @@ Dir_FindFile (name, path) printf("Caching %s for %s\n", Targ_FmtTime(stb.st_mtime), name); } - Hash_SetValue(entry, stb.st_mtime); + Hash_SetValue(entry, (long)stb.st_mtime); return (strdup (name)); } else { if (DEBUG(DIR)) { @@ -946,7 +973,7 @@ Dir_MTime (gn) } if (fullName == (char *)NULL) { - fullName = gn->name; + fullName = strdup(gn->name); } entry = Hash_FindEntry(&mtimes, fullName); @@ -958,12 +985,14 @@ Dir_MTime (gn) */ if (DEBUG(DIR)) { printf("Using cached time %s for %s\n", - Targ_FmtTime((time_t) Hash_GetValue(entry)), fullName); + Targ_FmtTime((time_t)(long)Hash_GetValue(entry)), fullName); } - stb.st_mtime = (time_t)Hash_GetValue(entry); + stb.st_mtime = (time_t)(long)Hash_GetValue(entry); Hash_DeleteEntry(&mtimes, entry); } else if (stat (fullName, &stb) < 0) { if (gn->type & OP_MEMBER) { + if (fullName != gn->path) + free(fullName); return Arch_MemMTime (gn); } else { stb.st_mtime = 0; @@ -1039,7 +1068,7 @@ Dir_AddDir (path, name) if (dp->d_fileno == 0) { continue; } -#endif sun +#endif /* sun */ (void)Hash_CreateEntry(&p->files, dp->d_name, (Boolean *)NULL); } (void) closedir (d); @@ -1068,9 +1097,9 @@ Dir_AddDir (path, name) */ ClientData Dir_CopyDir(p) - Path *p; /* Directory descriptor to copy */ + ClientData p; { - p->refCount += 1; + ((Path *) p)->refCount += 1; return ((ClientData)p); } @@ -1132,9 +1161,10 @@ Dir_MakeFlags (flag, path) *----------------------------------------------------------------------- */ void -Dir_Destroy (p) - Path *p; /* The directory descriptor to nuke */ +Dir_Destroy (pp) + ClientData pp; /* The directory descriptor to nuke */ { + Path *p = (Path *) pp; p->refCount -= 1; if (p->refCount == 0) { @@ -1170,7 +1200,7 @@ Dir_ClearPath(path) Path *p; while (!Lst_IsEmpty(path)) { p = (Path *)Lst_DeQueue(path); - Dir_Destroy(p); + Dir_Destroy((ClientData) p); } } @@ -1228,7 +1258,13 @@ Dir_PrintDirectories() } } -static int DirPrintDir (p) Path *p; { printf ("%s ", p->name); return (0); } +static int DirPrintDir (p, dummy) + ClientData p; + ClientData dummy; +{ + printf ("%s ", ((Path *) p)->name); + return (dummy ? 0 : 0); +} void Dir_PrintPath (path) diff --git a/usr.bin/make/dir.h b/usr.bin/make/dir.h index 09edcd6..81d76d1 100644 --- a/usr.bin/make/dir.h +++ b/usr.bin/make/dir.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)dir.h 8.1 (Berkeley) 6/6/93 + * @(#)dir.h 8.2 (Berkeley) 4/28/95 */ /* dir.h -- @@ -52,19 +52,19 @@ typedef struct Path { Hash_Table files; /* Hash table of files in directory */ } Path; -void Dir_AddDir __P((Lst, char *)); -void Dir_ClearPath __P((Lst)); -void Dir_Concat __P((Lst, Lst)); -ClientData - Dir_CopyDir __P((Path *)); -void Dir_Destroy __P((Path *)); -void Dir_Expand __P((char *, Lst, Lst)); -char *Dir_FindFile __P((char *, Lst)); -Boolean Dir_HasWildcards __P((char *)); -void Dir_Init __P((void)); -char *Dir_MakeFlags __P((char *, Lst)); -int Dir_MTime __P((GNode *)); -void Dir_PrintDirectories __P((void)); -void Dir_PrintPath __P((Lst)); +void Dir_Init __P((void)); +void Dir_End __P((void)); +Boolean Dir_HasWildcards __P((char *)); +void Dir_Expand __P((char *, Lst, Lst)); +char *Dir_FindFile __P((char *, Lst)); +int Dir_MTime __P((GNode *)); +void Dir_AddDir __P((Lst, char *)); +char *Dir_MakeFlags __P((char *, Lst)); +void Dir_ClearPath __P((Lst)); +void Dir_Concat __P((Lst, Lst)); +void Dir_PrintDirectories __P((void)); +void Dir_PrintPath __P((Lst)); +void Dir_Destroy __P((ClientData)); +ClientData Dir_CopyDir __P((ClientData)); #endif /* _DIR */ diff --git a/usr.bin/make/for.c b/usr.bin/make/for.c index e16d5ff..3ab3cba 100644 --- a/usr.bin/make/for.c +++ b/usr.bin/make/for.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)for.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)for.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -76,13 +76,13 @@ static Lst forLst; /* List of items */ /* * State of a for loop. */ -struct For { +typedef struct _For { Buffer buf; /* Unexpanded buffer */ char* var; /* Index name */ Lst lst; /* List of variables */ -}; +} For; -static int ForExec __P((char *, struct For *)); +static int ForExec __P((ClientData, ClientData)); @@ -118,27 +118,28 @@ For_Eval (line) Buffer buf; int varlen; - for (ptr++; *ptr && isspace(*ptr); ptr++) + for (ptr++; *ptr && isspace((unsigned char) *ptr); ptr++) continue; /* * If we are not in a for loop quickly determine if the statement is * a for. */ - if (ptr[0] != 'f' || ptr[1] != 'o' || ptr[2] != 'r' || !isspace(ptr[3])) + if (ptr[0] != 'f' || ptr[1] != 'o' || ptr[2] != 'r' || + !isspace((unsigned char) ptr[3])) return FALSE; ptr += 3; /* * we found a for loop, and now we are going to parse it. */ - while (*ptr && isspace(*ptr)) + while (*ptr && isspace((unsigned char) *ptr)) ptr++; /* * Grab the variable */ buf = Buf_Init(0); - for (wrd = ptr; *ptr && !isspace(*ptr); ptr++) + for (wrd = ptr; *ptr && !isspace((unsigned char) *ptr); ptr++) continue; Buf_AddBytes(buf, ptr - wrd, (Byte *) wrd); @@ -149,20 +150,21 @@ For_Eval (line) } Buf_Destroy(buf, FALSE); - while (*ptr && isspace(*ptr)) + while (*ptr && isspace((unsigned char) *ptr)) ptr++; /* * Grab the `in' */ - if (ptr[0] != 'i' || ptr[1] != 'n' || !isspace(ptr[2])) { + if (ptr[0] != 'i' || ptr[1] != 'n' || + !isspace((unsigned char) ptr[2])) { Parse_Error (level, "missing `in' in for"); printf("%s\n", ptr); return 0; } ptr += 3; - while (*ptr && isspace(*ptr)) + while (*ptr && isspace((unsigned char) *ptr)) ptr++; /* @@ -178,14 +180,14 @@ For_Eval (line) Lst_AtEnd(forLst, (ClientData) Buf_GetAll(buf, &varlen)), \ Buf_Destroy(buf, FALSE) - for (ptr = sub; *ptr && isspace(*ptr); ptr++) + for (ptr = sub; *ptr && isspace((unsigned char) *ptr); ptr++) continue; for (wrd = ptr; *ptr; ptr++) - if (isspace(*ptr)) { + if (isspace((unsigned char) *ptr)) { ADDWORD(); buf = Buf_Init(0); - while (*ptr && isspace(*ptr)) + while (*ptr && isspace((unsigned char) *ptr)) ptr++; wrd = ptr--; } @@ -203,10 +205,11 @@ For_Eval (line) } else if (*ptr == '.') { - for (ptr++; *ptr && isspace(*ptr); ptr++) + for (ptr++; *ptr && isspace((unsigned char) *ptr); ptr++) continue; - if (strncmp(ptr, "endfor", 6) == 0 && (isspace(ptr[6]) || !ptr[6])) { + if (strncmp(ptr, "endfor", 6) == 0 && + (isspace((unsigned char) ptr[6]) || !ptr[6])) { if (DEBUG(FOR)) (void) fprintf(stderr, "For: end for %d\n", forLevel); if (--forLevel < 0) { @@ -214,7 +217,8 @@ For_Eval (line) return 0; } } - else if (strncmp(ptr, "for", 3) == 0 && isspace(ptr[3])) { + else if (strncmp(ptr, "for", 3) == 0 && + isspace((unsigned char) ptr[3])) { forLevel++; if (DEBUG(FOR)) (void) fprintf(stderr, "For: new loop %d\n", forLevel); @@ -245,10 +249,12 @@ For_Eval (line) *----------------------------------------------------------------------- */ static int -ForExec(name, arg) - char *name; - struct For *arg; +ForExec(namep, argp) + ClientData namep; + ClientData argp; { + char *name = (char *) namep; + For *arg = (For *) argp; int len; Var_Set(arg->var, name, VAR_GLOBAL); if (DEBUG(FOR)) @@ -277,7 +283,7 @@ ForExec(name, arg) void For_Run() { - struct For arg; + For arg; if (forVar == NULL || forBuf == NULL || forLst == NULL) return; @@ -291,6 +297,6 @@ For_Run() Lst_ForEach(arg.lst, ForExec, (ClientData) &arg); free((Address)arg.var); - Lst_Destroy(arg.lst, free); + Lst_Destroy(arg.lst, (void (*) __P((ClientData))) free); Buf_Destroy(arg.buf, TRUE); } diff --git a/usr.bin/make/hash.c b/usr.bin/make/hash.c index 5a6fe0b..37e8398 100644 --- a/usr.bin/make/hash.c +++ b/usr.bin/make/hash.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)hash.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)hash.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /* hash.c -- diff --git a/usr.bin/make/hash.h b/usr.bin/make/hash.h index 9679a87..63e8783 100644 --- a/usr.bin/make/hash.h +++ b/usr.bin/make/hash.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)hash.h 8.1 (Berkeley) 6/6/93 + * @(#)hash.h 8.2 (Berkeley) 4/28/95 */ /* hash.h -- @@ -105,12 +105,12 @@ typedef struct Hash_Search { #define Hash_Size(n) (((n) + sizeof (int) - 1) / sizeof (int)) -Hash_Entry *Hash_CreateEntry __P((Hash_Table *, char *, Boolean *)); -void Hash_DeleteEntry __P((Hash_Table *, Hash_Entry *)); -void Hash_DeleteTable __P((Hash_Table *)); -Hash_Entry *Hash_EnumFirst __P((Hash_Table *, Hash_Search *)); -Hash_Entry *Hash_EnumNext __P((Hash_Search *)); -Hash_Entry *Hash_FindEntry __P((Hash_Table *, char *)); -void Hash_InitTable __P((Hash_Table *, int)); +void Hash_InitTable __P((Hash_Table *, int)); +void Hash_DeleteTable __P((Hash_Table *)); +Hash_Entry *Hash_FindEntry __P((Hash_Table *, char *)); +Hash_Entry *Hash_CreateEntry __P((Hash_Table *, char *, Boolean *)); +void Hash_DeleteEntry __P((Hash_Table *, Hash_Entry *)); +Hash_Entry *Hash_EnumFirst __P((Hash_Table *, Hash_Search *)); +Hash_Entry *Hash_EnumNext __P((Hash_Search *)); #endif /* _HASH */ diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c index e2729ea..166fd97 100644 --- a/usr.bin/make/job.c +++ b/usr.bin/make/job.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)job.c 8.2 (Berkeley) 3/19/94"; +static char sccsid[] = "@(#)job.c 8.3 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -97,17 +97,16 @@ static char sccsid[] = "@(#)job.c 8.2 (Berkeley) 3/19/94"; */ #include <sys/types.h> +#include <sys/signal.h> #include <sys/stat.h> #include <sys/file.h> #include <sys/time.h> #include <sys/wait.h> - -#include <errno.h> #include <fcntl.h> -#include <signal.h> +#include <errno.h> #include <stdio.h> #include <string.h> - +#include <signal.h> #include "make.h" #include "hash.h" #include "dir.h" @@ -202,10 +201,10 @@ static char *shellPath = (char *) NULL, /* full pathname of static int maxJobs; /* The most children we can run at once */ static int maxLocal; /* The most local ones we can have */ -static int nJobs; /* The number of children currently running */ -static int nLocal; /* The number of local children */ -static Lst jobs; /* The structures that describe them */ -static Boolean jobFull; /* Flag to tell when the job table is full. It +int nJobs; /* The number of children currently running */ +int nLocal; /* The number of local children */ +Lst jobs; /* The structures that describe them */ +Boolean jobFull; /* Flag to tell when the job table is full. It * is set TRUE when (1) the total number of * running jobs equals the maximum allowed or * (2) a job can only be run locally, but @@ -215,9 +214,9 @@ static fd_set outputs; /* Set of descriptors of pipes connected to * the output channels of children */ #endif -static GNode *lastNode; /* The node for which output was most recently +GNode *lastNode; /* The node for which output was most recently * produced. */ -static char *targFmt; /* Format string to use to head output from a +char *targFmt; /* Format string to use to head output from a * job when it's not the most-recent job heard * from */ #define TARG_FMT "--- %s ---\n" /* Default format */ @@ -228,7 +227,7 @@ static char *targFmt; /* Format string to use to head output from a * been migrated home, the job is placed on the stoppedJobs queue to be run * when the next job finishes. */ -static Lst stoppedJobs; /* Lst of Job structures describing +Lst stoppedJobs; /* Lst of Job structures describing * jobs that were stopped due to concurrency * limits or migration home */ @@ -243,11 +242,11 @@ static Lst stoppedJobs; /* Lst of Job structures describing # endif #endif -static int JobCondPassSig __P((Job *, int)); +static int JobCondPassSig __P((ClientData, ClientData)); static void JobPassSig __P((int)); -static int JobCmpPid __P((Job *, int)); -static int JobPrintCommand __P((char *, Job *)); -static int JobSaveCommand __P((char *, GNode *)); +static int JobCmpPid __P((ClientData, ClientData)); +static int JobPrintCommand __P((ClientData, ClientData)); +static int JobSaveCommand __P((ClientData, ClientData)); static void JobFinish __P((Job *, union wait)); static void JobExec __P((Job *, char **)); static void JobMakeArgv __P((Job *, char **)); @@ -272,10 +271,12 @@ static void JobInterrupt __P((int)); *----------------------------------------------------------------------- */ static int -JobCondPassSig(job, signo) - Job *job; /* Job to biff */ - int signo; /* Signal to send it */ +JobCondPassSig(jobp, signop) + ClientData jobp; /* Job to biff */ + ClientData signop; /* Signal to send it */ { + Job *job = (Job *) jobp; + int signo = *(int *) signop; #ifdef RMT_WANTS_SIGNALS if (job->flags & JOB_REMOTE) { (void)Rmt_Signal(job, signo); @@ -312,7 +313,7 @@ JobPassSig(signo) { int mask; - Lst_ForEach(jobs, JobCondPassSig, (ClientData)signo); + Lst_ForEach(jobs, JobCondPassSig, (ClientData)(long)signo); /* * Deal with proper cleanup based on the signal received. We only run @@ -344,7 +345,8 @@ JobPassSig(signo) kill(getpid(), signo); - Lst_ForEach(jobs, JobCondPassSig, (ClientData)SIGCONT); + signo = SIGCONT; + Lst_ForEach(jobs, JobCondPassSig, (ClientData) &signo); sigsetmask(mask); signal(signo, JobPassSig); @@ -367,10 +369,10 @@ JobPassSig(signo) */ static int JobCmpPid (job, pid) - int pid; /* process id desired */ - Job *job; /* job to examine */ + ClientData job; /* job to examine */ + ClientData pid; /* process id desired */ { - return (pid - job->pid); + return ( *(int *) pid - ((Job *) job)->pid); } /*- @@ -401,9 +403,9 @@ JobCmpPid (job, pid) *----------------------------------------------------------------------- */ static int -JobPrintCommand (cmd, job) - char *cmd; /* command string to print */ - Job *job; /* job for which to print it */ +JobPrintCommand (cmdp, jobp) + ClientData cmdp; /* command string to print */ + ClientData jobp; /* job for which to print it */ { Boolean noSpecials; /* true if we shouldn't worry about * inserting special commands into @@ -417,6 +419,8 @@ JobPrintCommand (cmd, job) * command */ char *cmdStart; /* Start of expanded command */ LstNode cmdNode; /* Node for replacing the command */ + char *cmd = (char *) cmdp; + Job *job = (Job *) jobp; noSpecials = (noExecute && ! (job->node->type & OP_MAKE)); @@ -556,11 +560,11 @@ JobPrintCommand (cmd, job) */ static int JobSaveCommand (cmd, gn) - char *cmd; - GNode *gn; + ClientData cmd; + ClientData gn; { - cmd = Var_Subst (NULL, cmd, gn, FALSE); - (void)Lst_AtEnd (postCommands->commands, (ClientData)cmd); + cmd = (ClientData) Var_Subst (NULL, (char *) cmd, (GNode *) gn, FALSE); + (void)Lst_AtEnd (postCommands->commands, cmd); return (0); } @@ -904,7 +908,7 @@ Boolean Job_CheckCommands (gn, abortProc) GNode *gn; /* The target whose commands need * verifying */ - void (*abortProc) __P((const char *, ...)); + void (*abortProc) __P((char *, ...)); /* Function to abort with message */ { if (OP_NOP(gn->type) && Lst_IsEmpty (gn->commands) && @@ -914,6 +918,7 @@ Job_CheckCommands (gn, abortProc) * commands */ if ((DEFAULT != NILGNODE) && !Lst_IsEmpty(DEFAULT->commands)) { + char *p1; /* * Make only looks for a .DEFAULT if the node was never the * target of an operator, so that's what we do too. If @@ -924,7 +929,9 @@ Job_CheckCommands (gn, abortProc) * .DEFAULT itself. */ Make_HandleUse(DEFAULT, gn); - Var_Set (IMPSRC, Var_Value (TARGET, gn), gn); + Var_Set (IMPSRC, Var_Value (TARGET, gn, &p1), gn); + if (p1) + free(p1); } else if (Dir_MTime (gn) == 0) { /* * The node wasn't the target of an operator we have no .DEFAULT @@ -1361,7 +1368,7 @@ JobRestart(job) static int JobStart (gn, flags, previous) GNode *gn; /* target to create */ - short flags; /* flags for the job to override normal ones. + int flags; /* flags for the job to override normal ones. * e.g. JOB_SPECIAL or JOB_IGNDOTS */ Job *previous; /* The previous Job structure for this node, * if any. */ @@ -1949,11 +1956,11 @@ Job_CatchChildren (block) printf("Process %d exited or stopped.\n", pid); - jnode = Lst_Find (jobs, (ClientData)pid, JobCmpPid); + jnode = Lst_Find (jobs, (ClientData)&pid, JobCmpPid); if (jnode == NILLNODE) { if (WIFSIGNALED(status) && (status.w_termsig == SIGCONT)) { - jnode = Lst_Find(stoppedJobs, (ClientData)pid, JobCmpPid); + jnode = Lst_Find(stoppedJobs, (ClientData) &pid, JobCmpPid); if (jnode == NILLNODE) { Error("Resumed child (%d) not in table", pid); continue; @@ -2352,7 +2359,7 @@ Job_ParseShell (line) while (isspace (*line)) { line++; } - words = brk_string (line, &wordCount); + words = brk_string (line, &wordCount, TRUE); memset ((Address)&newShell, 0, sizeof(newShell)); @@ -2479,7 +2486,6 @@ JobInterrupt (runINTERRUPT) LstNode ln; /* element in job table */ Job *job; /* job descriptor in that element */ GNode *interrupt; /* the node describing the .INTERRUPT target */ - struct stat sb; aborting = ABORT_INTERRUPT; @@ -2491,8 +2497,9 @@ JobInterrupt (runINTERRUPT) char *file = (job->node->path == (char *)NULL ? job->node->name : job->node->path); - if (!stat(file, &sb) && S_ISREG(sb.st_mode) && - unlink (file) == 0) { + struct stat st; + if (!noExecute && lstat(file, &st) != -1 && !S_ISDIR(st.st_mode) && + unlink(file) != -1) { Error ("*** %s removed", file); } } diff --git a/usr.bin/make/job.h b/usr.bin/make/job.h index 2608990..5feb43f 100644 --- a/usr.bin/make/job.h +++ b/usr.bin/make/job.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)job.h 8.1 (Berkeley) 6/6/93 + * @(#)job.h 8.2 (Berkeley) 4/28/95 */ /*- @@ -215,19 +215,19 @@ extern Lst stoppedJobs; /* List of jobs that are stopped or didn't * quite get started */ extern Boolean jobFull; /* Non-zero if no more jobs should/will start*/ -void JobFlagForMigration __P((int)); -void Job_AbortAll __P((void)); -void Job_CatchChildren __P((Boolean)); -void Job_CatchOutput __P((void)); -Boolean Job_CheckCommands __P((GNode *, - void (*abortProc )(const char *, ...))); -Boolean Job_Empty __P((void)); -int Job_End __P((void)); -Boolean Job_Full __P((void)); -void Job_Init __P((int, int)); -void Job_Make __P((GNode *)); -ReturnStatus Job_ParseShell __P((char *)); -void Job_Touch __P((GNode *, Boolean)); -void Job_Wait __P((void)); + +void Job_Touch __P((GNode *, Boolean)); +Boolean Job_CheckCommands __P((GNode *, void (*abortProc )(char *, ...))); +void Job_CatchChildren __P((Boolean)); +void Job_CatchOutput __P((void)); +void Job_Make __P((GNode *)); +void Job_Init __P((int, int)); +Boolean Job_Full __P((void)); +Boolean Job_Empty __P((void)); +ReturnStatus Job_ParseShell __P((char *)); +int Job_End __P((void)); +void Job_Wait __P((void)); +void Job_AbortAll __P((void)); +void JobFlagForMigration __P((int)); #endif /* _JOB_H_ */ diff --git a/usr.bin/make/list.h b/usr.bin/make/list.h index 13dd586..41b9a19 100644 --- a/usr.bin/make/list.h +++ b/usr.bin/make/list.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)list.h 8.1 (Berkeley) 6/6/93 + * @(#)list.h 8.2 (Berkeley) 4/28/95 */ /* diff --git a/usr.bin/make/lst.h b/usr.bin/make/lst.h index 3cd997d..8d8abe0 100644 --- a/usr.bin/make/lst.h +++ b/usr.bin/make/lst.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)lst.h 8.1 (Berkeley) 6/6/93 + * @(#)lst.h 8.2 (Berkeley) 4/28/95 */ /*- @@ -65,8 +65,8 @@ typedef struct LstNode *LstNode; * not to be freed. * NOCOPY performs similarly when given as the copyProc to Lst_Duplicate. */ -#define NOFREE ((void (*)()) 0) -#define NOCOPY ((ClientData (*)()) 0) +#define NOFREE ((void (*) __P((ClientData))) 0) +#define NOCOPY ((ClientData (*) __P((ClientData))) 0) #define LST_CONCNEW 0 /* create new LstNode's when using Lst_Concat */ #define LST_CONCLINK 1 /* relink LstNode's when using Lst_Concat */ @@ -74,72 +74,90 @@ typedef struct LstNode *LstNode; /* * Creation/destruction functions */ -Lst Lst_Init(); /* Create a new list */ -Lst Lst_Duplicate(); /* Duplicate an existing list */ -void Lst_Destroy(); /* Destroy an old one */ - -int Lst_Length(); /* Find the length of a list */ -Boolean Lst_IsEmpty(); /* True if list is empty */ +/* Create a new list */ +Lst Lst_Init __P((Boolean)); +/* Duplicate an existing list */ +Lst Lst_Duplicate __P((Lst, ClientData (*)(ClientData))); +/* Destroy an old one */ +void Lst_Destroy __P((Lst, void (*)(ClientData))); +/* True if list is empty */ +Boolean Lst_IsEmpty __P((Lst)); /* * Functions to modify a list */ -ReturnStatus Lst_Insert(); /* Insert an element before another */ -ReturnStatus Lst_Append(); /* Insert an element after another */ -ReturnStatus Lst_AtFront(); /* Place an element at the front of - * a lst. */ -ReturnStatus Lst_AtEnd(); /* Place an element at the end of a - * lst. */ -ReturnStatus Lst_Remove(); /* Remove an element */ -ReturnStatus Lst_Replace(); /* Replace a node with a new value */ -ReturnStatus Lst_Move(); /* Move an element to another place */ -ReturnStatus Lst_Concat(); /* Concatenate two lists */ +/* Insert an element before another */ +ReturnStatus Lst_Insert __P((Lst, LstNode, ClientData)); +/* Insert an element after another */ +ReturnStatus Lst_Append __P((Lst, LstNode, ClientData)); +/* Place an element at the front of a lst. */ +ReturnStatus Lst_AtFront __P((Lst, ClientData)); +/* Place an element at the end of a lst. */ +ReturnStatus Lst_AtEnd __P((Lst, ClientData)); +/* Remove an element */ +ReturnStatus Lst_Remove __P((Lst, LstNode)); +/* Replace a node with a new value */ +ReturnStatus Lst_Replace __P((LstNode, ClientData)); +/* Concatenate two lists */ +ReturnStatus Lst_Concat __P((Lst, Lst, int)); /* * Node-specific functions */ -LstNode Lst_First(); /* Return first element in list */ -LstNode Lst_Last(); /* Return last element in list */ -LstNode Lst_Succ(); /* Return successor to given element */ -LstNode Lst_Pred(); /* Return predecessor to given - * element */ -ClientData Lst_Datum(); /* Get datum from LstNode */ +/* Return first element in list */ +LstNode Lst_First __P((Lst)); +/* Return last element in list */ +LstNode Lst_Last __P((Lst)); +/* Return successor to given element */ +LstNode Lst_Succ __P((LstNode)); +/* Get datum from LstNode */ +ClientData Lst_Datum __P((LstNode)); /* * Functions for entire lists */ -LstNode Lst_Find(); /* Find an element in a list */ -LstNode Lst_FindFrom(); /* Find an element starting from - * somewhere */ -LstNode Lst_Member(); /* See if the given datum is on the - * list. Returns the LstNode containing - * the datum */ -int Lst_Index(); /* Returns the index of a datum in the - * list, starting from 0 */ -void Lst_ForEach(); /* Apply a function to all elements of - * a lst */ -void Lst_ForEachFrom(); /* Apply a function to all elements of - * a lst starting from a certain point. - * If the list is circular, the - * application will wrap around to the - * beginning of the list again. */ +/* Find an element in a list */ +LstNode Lst_Find __P((Lst, ClientData, + int (*)(ClientData, ClientData))); +/* Find an element starting from somewhere */ +LstNode Lst_FindFrom __P((Lst, LstNode, ClientData, + int (*cProc)(ClientData, ClientData))); +/* + * See if the given datum is on the list. Returns the LstNode containing + * the datum + */ +LstNode Lst_Member __P((Lst, ClientData)); +/* Apply a function to all elements of a lst */ +void Lst_ForEach __P((Lst, int (*)(ClientData, ClientData), + ClientData)); +/* + * Apply a function to all elements of a lst starting from a certain point. + * If the list is circular, the application will wrap around to the + * beginning of the list again. + */ +void Lst_ForEachFrom __P((Lst, LstNode, + int (*)(ClientData, ClientData), + ClientData)); /* * these functions are for dealing with a list as a table, of sorts. * An idea of the "current element" is kept and used by all the functions * between Lst_Open() and Lst_Close(). */ -ReturnStatus Lst_Open(); /* Open the list */ -LstNode Lst_Prev(); /* Previous element */ -LstNode Lst_Cur(); /* The current element, please */ -LstNode Lst_Next(); /* Next element please */ -Boolean Lst_IsAtEnd(); /* Done yet? */ -void Lst_Close(); /* Finish table access */ +/* Open the list */ +ReturnStatus Lst_Open __P((Lst)); +/* Next element please */ +LstNode Lst_Next __P((Lst)); +/* Done yet? */ +Boolean Lst_IsAtEnd __P((Lst)); +/* Finish table access */ +void Lst_Close __P((Lst)); /* * for using the list as a queue */ -ReturnStatus Lst_EnQueue(); /* Place an element at tail of queue */ -ClientData Lst_DeQueue(); /* Remove an element from head of - * queue */ +/* Place an element at tail of queue */ +ReturnStatus Lst_EnQueue __P((Lst, ClientData)); +/* Remove an element from head of queue */ +ClientData Lst_DeQueue __P((Lst)); -#endif _LST_H_ +#endif /* _LST_H_ */ diff --git a/usr.bin/make/lst.lib/lstAppend.c b/usr.bin/make/lst.lib/lstAppend.c index 0a1d52b..93800db 100644 --- a/usr.bin/make/lst.lib/lstAppend.c +++ b/usr.bin/make/lst.lib/lstAppend.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstAppend.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstAppend.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstAtEnd.c b/usr.bin/make/lst.lib/lstAtEnd.c index dce8a07..e61a28c 100644 --- a/usr.bin/make/lst.lib/lstAtEnd.c +++ b/usr.bin/make/lst.lib/lstAtEnd.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstAtEnd.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstAtEnd.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstAtFront.c b/usr.bin/make/lst.lib/lstAtFront.c index 58a235d..5e8b7f1 100644 --- a/usr.bin/make/lst.lib/lstAtFront.c +++ b/usr.bin/make/lst.lib/lstAtFront.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstAtFront.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstAtFront.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstClose.c b/usr.bin/make/lst.lib/lstClose.c index 624e6c6..6f9174f 100644 --- a/usr.bin/make/lst.lib/lstClose.c +++ b/usr.bin/make/lst.lib/lstClose.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstClose.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstClose.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstConcat.c b/usr.bin/make/lst.lib/lstConcat.c index 505d49f..e7726a8 100644 --- a/usr.bin/make/lst.lib/lstConcat.c +++ b/usr.bin/make/lst.lib/lstConcat.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstConcat.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstConcat.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -102,6 +102,8 @@ Lst_Concat (l1, l2, flags) list2->firstPtr->prevPtr = list1->lastPtr; if (list1->lastPtr != NilListNode) { list1->lastPtr->nextPtr = list2->firstPtr; + } else { + list1->firstPtr = list2->firstPtr; } list1->lastPtr = list2->lastPtr; } diff --git a/usr.bin/make/lst.lib/lstDatum.c b/usr.bin/make/lst.lib/lstDatum.c index 542898b..6b0988e 100644 --- a/usr.bin/make/lst.lib/lstDatum.c +++ b/usr.bin/make/lst.lib/lstDatum.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstDatum.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstDatum.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstDeQueue.c b/usr.bin/make/lst.lib/lstDeQueue.c index 921889a..4b90125 100644 --- a/usr.bin/make/lst.lib/lstDeQueue.c +++ b/usr.bin/make/lst.lib/lstDeQueue.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstDeQueue.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstDeQueue.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstDestroy.c b/usr.bin/make/lst.lib/lstDestroy.c index 3dedbf1..56ea5c5 100644 --- a/usr.bin/make/lst.lib/lstDestroy.c +++ b/usr.bin/make/lst.lib/lstDestroy.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstDestroy.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstDestroy.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -63,7 +63,7 @@ static char sccsid[] = "@(#)lstDestroy.c 8.1 (Berkeley) 6/6/93"; void Lst_Destroy (l, freeProc) Lst l; - register void (*freeProc)(); + register void (*freeProc) __P((ClientData)); { register ListNode ln; register ListNode tln = NilListNode; @@ -76,21 +76,25 @@ Lst_Destroy (l, freeProc) */ return; } - + + /* To ease scanning */ + if (list->lastPtr != NilListNode) + list->lastPtr->nextPtr = NilListNode; + else { + free ((Address)l); + return; + } + if (freeProc) { - for (ln = list->firstPtr; - ln != NilListNode && tln != list->firstPtr; - ln = tln) { - tln = ln->nextPtr; - (*freeProc) (ln->datum); - free ((Address)ln); + for (ln = list->firstPtr; ln != NilListNode; ln = tln) { + tln = ln->nextPtr; + (*freeProc) (ln->datum); + free ((Address)ln); } } else { - for (ln = list->firstPtr; - ln != NilListNode && tln != list->firstPtr; - ln = tln) { - tln = ln->nextPtr; - free ((Address)ln); + for (ln = list->firstPtr; ln != NilListNode; ln = tln) { + tln = ln->nextPtr; + free ((Address)ln); } } diff --git a/usr.bin/make/lst.lib/lstDupl.c b/usr.bin/make/lst.lib/lstDupl.c index 302bb30..184b386 100644 --- a/usr.bin/make/lst.lib/lstDupl.c +++ b/usr.bin/make/lst.lib/lstDupl.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstDupl.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstDupl.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -62,7 +62,8 @@ static char sccsid[] = "@(#)lstDupl.c 8.1 (Berkeley) 6/6/93"; Lst Lst_Duplicate (l, copyProc) Lst l; /* the list to duplicate */ - ClientData (*copyProc)(); /* A function to duplicate each ClientData */ + /* A function to duplicate each ClientData */ + ClientData (*copyProc) __P((ClientData)); { register Lst nl; register ListNode ln; diff --git a/usr.bin/make/lst.lib/lstEnQueue.c b/usr.bin/make/lst.lib/lstEnQueue.c index 14e36e3..1016c88 100644 --- a/usr.bin/make/lst.lib/lstEnQueue.c +++ b/usr.bin/make/lst.lib/lstEnQueue.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstEnQueue.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstEnQueue.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstFind.c b/usr.bin/make/lst.lib/lstFind.c index 1efdc54..bab85cc 100644 --- a/usr.bin/make/lst.lib/lstFind.c +++ b/usr.bin/make/lst.lib/lstFind.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstFind.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstFind.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -63,7 +63,7 @@ LstNode Lst_Find (l, d, cProc) Lst l; ClientData d; - int (*cProc)(); + int (*cProc) __P((ClientData, ClientData)); { return (Lst_FindFrom (l, Lst_First(l), d, cProc)); } diff --git a/usr.bin/make/lst.lib/lstFindFrom.c b/usr.bin/make/lst.lib/lstFindFrom.c index e1da033..08de990 100644 --- a/usr.bin/make/lst.lib/lstFindFrom.c +++ b/usr.bin/make/lst.lib/lstFindFrom.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstFindFrom.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstFindFrom.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -65,7 +65,7 @@ Lst_FindFrom (l, ln, d, cProc) Lst l; register LstNode ln; register ClientData d; - register int (*cProc)(); + register int (*cProc) __P((ClientData, ClientData)); { register ListNode tln; Boolean found = FALSE; diff --git a/usr.bin/make/lst.lib/lstFirst.c b/usr.bin/make/lst.lib/lstFirst.c index 95e0893..9a95018 100644 --- a/usr.bin/make/lst.lib/lstFirst.c +++ b/usr.bin/make/lst.lib/lstFirst.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstFirst.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstFirst.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstForEach.c b/usr.bin/make/lst.lib/lstForEach.c index 9fbdca5..1d6ba93 100644 --- a/usr.bin/make/lst.lib/lstForEach.c +++ b/usr.bin/make/lst.lib/lstForEach.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstForEach.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstForEach.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -64,7 +64,7 @@ static char sccsid[] = "@(#)lstForEach.c 8.1 (Berkeley) 6/6/93"; void Lst_ForEach (l, proc, d) Lst l; - register int (*proc)(); + register int (*proc) __P((ClientData, ClientData)); register ClientData d; { Lst_ForEachFrom(l, Lst_First(l), proc, d); diff --git a/usr.bin/make/lst.lib/lstForEachFrom.c b/usr.bin/make/lst.lib/lstForEachFrom.c index f19357f..7c9e51e 100644 --- a/usr.bin/make/lst.lib/lstForEachFrom.c +++ b/usr.bin/make/lst.lib/lstForEachFrom.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstForEachFrom.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstForEachFrom.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstInit.c b/usr.bin/make/lst.lib/lstInit.c index c548c7f..17276be 100644 --- a/usr.bin/make/lst.lib/lstInit.c +++ b/usr.bin/make/lst.lib/lstInit.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstInit.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstInit.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstInsert.c b/usr.bin/make/lst.lib/lstInsert.c index 45577c4..724924a 100644 --- a/usr.bin/make/lst.lib/lstInsert.c +++ b/usr.bin/make/lst.lib/lstInsert.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstInsert.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstInsert.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstInt.h b/usr.bin/make/lst.lib/lstInt.h index 0296558..1253660 100644 --- a/usr.bin/make/lst.lib/lstInt.h +++ b/usr.bin/make/lst.lib/lstInt.h @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)lstInt.h 8.1 (Berkeley) 6/6/93 + * @(#)lstInt.h 8.2 (Berkeley) 4/28/95 */ /*- diff --git a/usr.bin/make/lst.lib/lstIsAtEnd.c b/usr.bin/make/lst.lib/lstIsAtEnd.c index 2a8fc2f..7fdf68d 100644 --- a/usr.bin/make/lst.lib/lstIsAtEnd.c +++ b/usr.bin/make/lst.lib/lstIsAtEnd.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstIsAtEnd.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstIsAtEnd.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstIsEmpty.c b/usr.bin/make/lst.lib/lstIsEmpty.c index c2a6509..da47561 100644 --- a/usr.bin/make/lst.lib/lstIsEmpty.c +++ b/usr.bin/make/lst.lib/lstIsEmpty.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstIsEmpty.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstIsEmpty.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstLast.c b/usr.bin/make/lst.lib/lstLast.c index 176aafb..a87c50c 100644 --- a/usr.bin/make/lst.lib/lstLast.c +++ b/usr.bin/make/lst.lib/lstLast.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstLast.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstLast.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstMember.c b/usr.bin/make/lst.lib/lstMember.c index 23070b7..a6145ee 100644 --- a/usr.bin/make/lst.lib/lstMember.c +++ b/usr.bin/make/lst.lib/lstMember.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstMember.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstMember.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstNext.c b/usr.bin/make/lst.lib/lstNext.c index 0745b1c..b6986d8 100644 --- a/usr.bin/make/lst.lib/lstNext.c +++ b/usr.bin/make/lst.lib/lstNext.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstNext.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstNext.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstOpen.c b/usr.bin/make/lst.lib/lstOpen.c index f1decd7..9da8cfa 100644 --- a/usr.bin/make/lst.lib/lstOpen.c +++ b/usr.bin/make/lst.lib/lstOpen.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstOpen.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstOpen.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstRemove.c b/usr.bin/make/lst.lib/lstRemove.c index 48a4c00..98eb3ce 100644 --- a/usr.bin/make/lst.lib/lstRemove.c +++ b/usr.bin/make/lst.lib/lstRemove.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstRemove.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstRemove.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstReplace.c b/usr.bin/make/lst.lib/lstReplace.c index 344631a..8adb689 100644 --- a/usr.bin/make/lst.lib/lstReplace.c +++ b/usr.bin/make/lst.lib/lstReplace.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstReplace.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstReplace.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/lst.lib/lstSucc.c b/usr.bin/make/lst.lib/lstSucc.c index 06b354d..a5875f68 100644 --- a/usr.bin/make/lst.lib/lstSucc.c +++ b/usr.bin/make/lst.lib/lstSucc.c @@ -35,7 +35,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)lstSucc.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lstSucc.c 8.2 (Berkeley) 4/28/95"; #endif /* not lint */ /*- diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c index 7b3f5a5..8607fbb 100644 --- a/usr.bin/make/main.c +++ b/usr.bin/make/main.c @@ -43,7 +43,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 3/19/94"; +static char sccsid[] = "@(#)main.c 8.4 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -79,6 +79,7 @@ static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 3/19/94"; #include <sys/resource.h> #include <sys/signal.h> #include <sys/stat.h> +#include <sys/utsname.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> @@ -148,7 +149,7 @@ MainParseArgs(argc, argv) { extern int optind; extern char *optarg; - char c; + int c; optind = 1; /* since we're called more than once */ #ifdef notyet @@ -156,7 +157,7 @@ MainParseArgs(argc, argv) #else # define OPTFLAGS "D:I:d:ef:ij:knqrst" #endif -rearg: while ((c = getopt(argc, argv, OPTFLAGS)) != EOF) { +rearg: while((c = getopt(argc, argv, OPTFLAGS)) != EOF) { switch(c) { case 'D': Var_Set(optarg, "1", VAR_GLOBAL); @@ -308,7 +309,7 @@ rearg: while ((c = getopt(argc, argv, OPTFLAGS)) != EOF) { optind = 1; /* - */ goto rearg; } - (void)Lst_AtEnd(create, (ClientData)*argv); + (void)Lst_AtEnd(create, (ClientData)strdup(*argv)); } } @@ -341,7 +342,7 @@ Main_ParseArgLine(line) if (!*line) return; - argv = brk_string(line, &argc); + argv = brk_string(line, &argc, TRUE); MainParseArgs(argc, argv); } @@ -370,10 +371,12 @@ main(argc, argv) Lst targs; /* target nodes to create -- passed to Make_Init */ Boolean outOfDate = TRUE; /* FALSE if all targets up to date */ struct stat sb, sa; - char *p, *path, *pwd, *getenv(), *getwd(); + char *p, *p1, *path, *pwd, *getenv(), *getwd(); char mdpath[MAXPATHLEN + 1]; char obpath[MAXPATHLEN + 1]; char cdpath[MAXPATHLEN + 1]; + struct utsname utsname; + char *machine = getenv("MACHINE"); /* * Find where we are and take care of PWD for the automounter... @@ -381,8 +384,8 @@ main(argc, argv) * on a different machine with pmake. */ curdir = cdpath; - if (getwd(curdir) == NULL) { - (void)fprintf(stderr, "make: %s.\n", curdir); + if (getcwd(curdir, MAXPATHLEN) == NULL) { + (void)fprintf(stderr, "make: %s.\n", strerror(errno)); exit(2); } @@ -398,6 +401,21 @@ main(argc, argv) (void) strcpy(curdir, pwd); } + /* + * Get the name of this type of MACHINE from utsname + * so we can share an executable for similar machines. + * (i.e. m68k: amiga hp300, mac68k, sun3, ...) + * + * Note that while MACHINE is decided at run-time, + * MACHINE_ARCH is always known at compile time. + */ + if (!machine) { + if (uname(&utsname)) { + perror("make: uname"); + exit(2); + } + machine = utsname.machine; + } /* * if the MAKEOBJDIR (or by default, the _PATH_OBJDIR) directory @@ -408,7 +426,7 @@ main(argc, argv) */ if (!(path = getenv("MAKEOBJDIR"))) { path = _PATH_OBJDIR; - (void) sprintf(mdpath, "%s.%s", path, MACHINE); + (void) sprintf(mdpath, "%s.%s", path, machine); } else (void) strncpy(mdpath, path, MAXPATHLEN + 1); @@ -487,6 +505,7 @@ main(argc, argv) * directories */ Var_Init(); /* As well as the lists of variables for * parsing arguments */ + str_init(); if (objdir != curdir) Dir_AddDir(dirSearchPath, curdir); Var_Set(".CURDIR", curdir, VAR_GLOBAL); @@ -501,9 +520,7 @@ main(argc, argv) Var_Set("MAKE", argv[0], VAR_GLOBAL); Var_Set(MAKEFLAGS, "", VAR_GLOBAL); Var_Set("MFLAGS", "", VAR_GLOBAL); -#ifdef MACHINE - Var_Set("MACHINE", MACHINE, VAR_GLOBAL); -#endif + Var_Set("MACHINE", machine, VAR_GLOBAL); #ifdef MACHINE_ARCH Var_Set("MACHINE_ARCH", MACHINE_ARCH, VAR_GLOBAL); #endif @@ -568,15 +585,19 @@ main(argc, argv) (void)ReadMakefile(".depend"); - Var_Append("MFLAGS", Var_Value(MAKEFLAGS, VAR_GLOBAL), VAR_GLOBAL); + Var_Append("MFLAGS", Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1), VAR_GLOBAL); + if (p1) + free(p1); /* Install all the flags into the MAKE envariable. */ - if (((p = Var_Value(MAKEFLAGS, VAR_GLOBAL)) != NULL) && *p) + if (((p = Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1)) != NULL) && *p) #ifdef POSIX setenv("MAKEFLAGS", p, 1); #else setenv("MAKE", p, 1); #endif + if (p1) + free(p1); /* * For compatibility, look at the directories in the VPATH variable @@ -657,10 +678,22 @@ main(argc, argv) */ Compat_Run(targs); + Lst_Destroy(targs, NOFREE); + Lst_Destroy(makefiles, NOFREE); + Lst_Destroy(create, (void (*) __P((ClientData))) free); + /* print the graph now it's been processed if the user requested it */ if (DEBUG(GRAPH2)) Targ_PrintGraph(2); + Suff_End(); + Targ_End(); + Arch_End(); + str_end(); + Var_End(); + Parse_End(); + Dir_End(); + if (queryFlag && outOfDate) return(1); else @@ -731,7 +764,7 @@ found: Var_Set("MAKEFILE", fname, VAR_GLOBAL); /* VARARGS */ void #if __STDC__ -Error(const char *fmt, ...) +Error(char *fmt, ...) #else Error(va_alist) va_dcl @@ -766,7 +799,7 @@ Error(va_alist) /* VARARGS */ void #if __STDC__ -Fatal(const char *fmt, ...) +Fatal(char *fmt, ...) #else Fatal(va_alist) va_dcl @@ -808,7 +841,7 @@ Fatal(va_alist) /* VARARGS */ void #if __STDC__ -Punt(const char *fmt, ...) +Punt(char *fmt, ...) #else Punt(va_alist) va_dcl @@ -877,11 +910,11 @@ Finish(errors) */ char * emalloc(len) - u_int len; + size_t len; { char *p; - if (!(p = malloc(len))) + if ((p = (char *) malloc(len)) == NULL) enomem(); return(p); } @@ -909,3 +942,13 @@ usage() [-I directory] [-j max_jobs] [variable=value]\n"); exit(2); } + + +int +PrintAddr(a, b) + ClientData a; + ClientData b; +{ + printf("%lx ", (unsigned long) a); + return b ? 0 : 0; +} diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1 index 9887965..b1392cc 100644 --- a/usr.bin/make/make.1 +++ b/usr.bin/make/make.1 @@ -29,9 +29,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)make.1 8.4 (Berkeley) 3/19/94 +.\" @(#)make.1 8.8 (Berkeley) 6/13/95 .\" -.Dd March 19, 1994 +.Dd June 13, 1995 .Dt MAKE 1 .Os .Sh NAME @@ -74,7 +74,8 @@ and makefiles, please refer to The options are as follows: .Bl -tag -width Ds .It Fl D Ar variable -Define Ar variable +Define +.Ar variable to be 1, in the global context. .It Fl d Ar flags Turn on debugging, and specify which portions of @@ -278,13 +279,13 @@ between the previous contents of the variable and the appended value. Variables are expanded by surrounding the variable name with either curly braces .Pq Ql {} -or parenthesis +or parentheses .Pq Ql () and preceding it with a dollar sign .Pq Ql \&$ . If the variable name contains only a single letter, the surrounding -braces or parenthesis are not required. +braces or parentheses are not required. This shorter form is not recommended. .Pp Variable substitution occurs at two distinct times, depending on where @@ -553,7 +554,7 @@ Test the value of a variable. .Oo \&! Oc Ns Ar target .Op Ar operator target ... .Xc -Test the the target being built. +Test the target being built. .It Xo .Ic .ifnmake .Oo \&! Oc Ar target @@ -628,7 +629,7 @@ As in C, .Nm make will only evaluate a conditional as far as is necessary to determine its value. -Parentheses may be used to change the order of evaluation. +Parenthesis may be used to change the order of evaluation. The boolean operator .Ql Ic \&! may be used to logically negate an entire @@ -759,6 +760,12 @@ If a target is marked with this attribute and .Nm make can't figure out how to create it, it will ignore this fact and assume the file isn't needed or already exists. +.It Ic .PHONY +If this special target is present in a Makefile, all sources for the +target will considered to be `phony' targets. I.e. they don't refer +to real files, and they will always be considered out-of-date. This +is useful in case one wants to create a target called `install', in +a directory where a file `install' already exists. .It Ic .PRECIOUS When .Nm make diff --git a/usr.bin/make/make.c b/usr.bin/make/make.c index 458bc66..6d17b2e 100644 --- a/usr.bin/make/make.c +++ b/usr.bin/make/make.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)make.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)make.c 8.3 (Berkeley) 6/13/95"; #endif /* not lint */ /*- @@ -86,10 +86,12 @@ static int numNodes; /* Number of nodes to be processed. If this * is non-zero when Job_Empty() returns * TRUE, there's a cycle in the graph */ -static int MakeAddChild __P((GNode *, Lst)); -static int MakeAddAllSrc __P((GNode *, GNode *)); +static int MakeAddChild __P((ClientData, ClientData)); +static int MakeAddAllSrc __P((ClientData, ClientData)); +static int MakeTimeStamp __P((ClientData, ClientData)); +static int MakeHandleUse __P((ClientData, ClientData)); static Boolean MakeStartJobs __P((void)); -static int MakePrintStatus __P((GNode *, Boolean)); +static int MakePrintStatus __P((ClientData, ClientData)); /*- *----------------------------------------------------------------------- * Make_TimeStamp -- @@ -106,14 +108,22 @@ static int MakePrintStatus __P((GNode *, Boolean)); */ int Make_TimeStamp (pgn, cgn) - register GNode *pgn; /* the current parent */ - register GNode *cgn; /* the child we've just examined */ + GNode *pgn; /* the current parent */ + GNode *cgn; /* the child we've just examined */ { if (cgn->mtime > pgn->cmtime) { pgn->cmtime = cgn->mtime; } return (0); } + +static int +MakeTimeStamp (pgn, cgn) + ClientData pgn; /* the current parent */ + ClientData cgn; /* the child we've just examined */ +{ + return Make_TimeStamp((GNode *) pgn, (GNode *) cgn); +} /*- *----------------------------------------------------------------------- @@ -143,7 +153,7 @@ Make_OODate (gn) * Certain types of targets needn't even be sought as their datedness * doesn't depend on their modification time... */ - if ((gn->type & (OP_JOIN|OP_USE|OP_EXEC)) == 0) { + if ((gn->type & (OP_JOIN|OP_USE|OP_EXEC|OP_PHONY)) == 0) { (void) Dir_MTime (gn); if (DEBUG(MAKE)) { if (gn->mtime != 0) { @@ -168,7 +178,14 @@ Make_OODate (gn) * These weird rules are brought to you by Backward-Compatability and * the strange people who wrote 'Make'. */ - if (gn->type & OP_USE) { + if (gn->type & OP_PHONY) { + /* + * A PHONY node is always out of date + */ + if (DEBUG(MAKE)) + printf("phony..."); + return TRUE; + } else if (gn->type & OP_USE) { /* * If the node is a USE node it is *never* out of date * no matter *what*. @@ -181,7 +198,13 @@ Make_OODate (gn) if (DEBUG(MAKE)) { printf("library..."); } - oodate = Arch_LibOODate (gn); + + /* + * always out of date if no children and :: target + */ + + oodate = Arch_LibOODate (gn) || + ((gn->cmtime == 0) && (gn->type & OP_DOUBLEDEP)); } else if (gn->type & OP_JOIN) { /* * A target with the .JOIN attribute is only considered @@ -245,7 +268,7 @@ Make_OODate (gn) * thinking they're out-of-date. */ if (!oodate) { - Lst_ForEach (gn->parents, Make_TimeStamp, (ClientData)gn); + Lst_ForEach (gn->parents, MakeTimeStamp, (ClientData)gn); } return (oodate); @@ -265,10 +288,12 @@ Make_OODate (gn) *----------------------------------------------------------------------- */ static int -MakeAddChild (gn, l) - GNode *gn; /* the node to add */ - Lst l; /* the list to which to add it */ +MakeAddChild (gnp, lp) + ClientData gnp; /* the node to add */ + ClientData lp; /* the list to which to add it */ { + GNode *gn = (GNode *) gnp; + Lst l = (Lst) lp; if (!gn->make && !(gn->type & OP_USE)) { (void)Lst_EnQueue (l, (ClientData)gn); } @@ -343,6 +368,13 @@ Make_HandleUse (cgn, pgn) } return (0); } +static int +MakeHandleUse (pgn, cgn) + ClientData pgn; /* the current parent */ + ClientData cgn; /* the child we've just examined */ +{ + return Make_HandleUse((GNode *) pgn, (GNode *) cgn); +} /*- *----------------------------------------------------------------------- @@ -376,8 +408,11 @@ Make_Update (cgn) register GNode *pgn; /* the parent node */ register char *cname; /* the child's name */ register LstNode ln; /* Element in parents and iParents lists */ + char *p1; - cname = Var_Value (TARGET, cgn); + cname = Var_Value (TARGET, cgn, &p1); + if (p1) + free(p1); /* * If the child was actually made, see what its modification time is @@ -496,7 +531,8 @@ Make_Update (cgn) * of this node. */ if (Lst_Open (cgn->iParents) == SUCCESS) { - char *cpref = Var_Value(PREFIX, cgn); + char *p1; + char *cpref = Var_Value(PREFIX, cgn, &p1); while ((ln = Lst_Next (cgn->iParents)) != NILLNODE) { pgn = (GNode *)Lst_Datum (ln); @@ -505,6 +541,8 @@ Make_Update (cgn) Var_Set (PREFIX, cpref, pgn); } } + if (p1) + free(p1); Lst_Close (cgn->iParents); } } @@ -530,15 +568,18 @@ Make_Update (cgn) *----------------------------------------------------------------------- */ static int -MakeAddAllSrc (cgn, pgn) - GNode *cgn; /* The child to add */ - GNode *pgn; /* The parent to whose ALLSRC variable it should be */ +MakeAddAllSrc (cgnp, pgnp) + ClientData cgnp; /* The child to add */ + ClientData pgnp; /* The parent to whose ALLSRC variable it should be */ /* added */ { + GNode *cgn = (GNode *) cgnp; + GNode *pgn = (GNode *) pgnp; if ((cgn->type & (OP_EXEC|OP_USE|OP_INVISIBLE)) == 0) { - register char *child; + char *child; + char *p1; - child = Var_Value(TARGET, cgn); + child = Var_Value(TARGET, cgn, &p1); Var_Append (ALLSRC, child, pgn); if (pgn->type & OP_JOIN) { if (cgn->made == MADE) { @@ -565,6 +606,8 @@ MakeAddAllSrc (cgn, pgn) */ Var_Append(OODATE, child, pgn); } + if (p1) + free(p1); } return (0); } @@ -595,7 +638,7 @@ void Make_DoAllVar (gn) GNode *gn; { - Lst_ForEach (gn->children, MakeAddAllSrc, gn); + Lst_ForEach (gn->children, MakeAddAllSrc, (ClientData) gn); if (!Var_Exists (OODATE, gn)) { Var_Set (OODATE, "", gn); @@ -605,7 +648,10 @@ Make_DoAllVar (gn) } if (gn->type & OP_JOIN) { - Var_Set (TARGET, Var_Value (ALLSRC, gn), gn); + char *p1; + Var_Set (TARGET, Var_Value (ALLSRC, gn, &p1), gn); + if (p1) + free(p1); } } @@ -710,16 +756,19 @@ MakeStartJobs () *----------------------------------------------------------------------- */ static int -MakePrintStatus(gn, cycle) - GNode *gn; /* Node to examine */ - Boolean cycle; /* True if gn->unmade being non-zero implies +MakePrintStatus(gnp, cyclep) + ClientData gnp; /* Node to examine */ + ClientData cyclep; /* True if gn->unmade being non-zero implies * a cycle in the graph, not an error in an * inferior */ { + GNode *gn = (GNode *) gnp; + Boolean cycle = *(Boolean *) cyclep; if (gn->made == UPTODATE) { printf ("`%s' is up to date.\n", gn->name); } else if (gn->unmade != 0) { if (cycle) { + Boolean t = TRUE; /* * If printing cycles and came to one that has unmade children, * print out the cycle by recursing on its children. Note a @@ -733,11 +782,11 @@ MakePrintStatus(gn, cycle) if (gn->made == CYCLE) { Error("Graph cycles through `%s'", gn->name); gn->made = ENDCYCLE; - Lst_ForEach(gn->children, MakePrintStatus, (ClientData)TRUE); + Lst_ForEach(gn->children, MakePrintStatus, (ClientData) &t); gn->made = UNMADE; } else if (gn->made != ENDCYCLE) { gn->made = CYCLE; - Lst_ForEach(gn->children, MakePrintStatus, (ClientData)TRUE); + Lst_ForEach(gn->children, MakePrintStatus, (ClientData) &t); } } else { printf ("`%s' not remade because of errors.\n", gn->name); @@ -799,7 +848,7 @@ Make_Run (targs) * Apply any .USE rules before looking for implicit dependencies * to make sure everything has commands that should... */ - Lst_ForEach (gn->children, Make_HandleUse, (ClientData)gn); + Lst_ForEach (gn->children, MakeHandleUse, (ClientData)gn); Suff_FindDeps (gn); if (gn->unmade != 0) { @@ -852,8 +901,8 @@ Make_Run (targs) * Print the final status of each target. E.g. if it wasn't made * because some inferior reported an error. */ - Lst_ForEach(targs, MakePrintStatus, - (ClientData)((errors == 0) && (numNodes != 0))); + errors = ((errors == 0) && (numNodes != 0)); + Lst_ForEach(targs, MakePrintStatus, (ClientData) &errors); return (TRUE); } diff --git a/usr.bin/make/make.h b/usr.bin/make/make.h index 506d98a..3af67f7 100644 --- a/usr.bin/make/make.h +++ b/usr.bin/make/make.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)make.h 8.1 (Berkeley) 6/6/93 + * @(#)make.h 8.3 (Berkeley) 6/13/95 */ /*- @@ -50,7 +50,15 @@ #include <stdio.h> #include <string.h> #include <ctype.h> +#ifndef MAKE_BOOTSTRAP #include <sys/cdefs.h> +#else +#if defined(__STDC__) || defined(__cplusplus) +#define __P(protos) protos /* full-blown ANSI C */ +#else +#define __P(protos) () /* traditional C preprocessor */ +#endif +#endif #if __STDC__ #include <stdlib.h> #include <unistd.h> @@ -184,6 +192,7 @@ typedef struct GNode { * local variables. */ #define OP_NOTMAIN 0x00008000 /* The node is exempt from normal 'main * target' processing in parse.c */ +#define OP_PHONY 0x00010000 /* Not a file target; run always */ /* Attributes applied by PMake */ #define OP_TRANSFORM 0x80000000 /* The node is a transformation rule */ #define OP_MEMBER 0x40000000 /* Target is a member of an archive */ @@ -347,11 +356,11 @@ extern int debug; */ #include "nonints.h" -void Make_DoAllVar __P((GNode *)); -int Make_HandleUse __P((GNode *, GNode *)); -Boolean Make_OODate __P((GNode *)); -Boolean Make_Run __P((Lst)); -int Make_TimeStamp __P((GNode *, GNode *)); -void Make_Update __P((GNode *)); +int Make_TimeStamp __P((GNode *, GNode *)); +Boolean Make_OODate __P((GNode *)); +int Make_HandleUse __P((GNode *, GNode *)); +void Make_Update __P((GNode *)); +void Make_DoAllVar __P((GNode *)); +Boolean Make_Run __P((Lst)); #endif /* _MAKE_H_ */ diff --git a/usr.bin/make/nonints.h b/usr.bin/make/nonints.h index c3a17ee..039d4b9 100644 --- a/usr.bin/make/nonints.h +++ b/usr.bin/make/nonints.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)nonints.h 8.3 (Berkeley) 3/19/94 + * @(#)nonints.h 8.4 (Berkeley) 4/28/95 */ /* arch.c */ @@ -47,7 +47,8 @@ int Arch_MemMTime __P((GNode *)); void Arch_FindLib __P((GNode *, Lst)); Boolean Arch_LibOODate __P((GNode *)); void Arch_Init __P((void)); - +void Arch_End __P((void)); + /* compat.c */ void Compat_Run __P((Lst)); @@ -62,28 +63,32 @@ void For_Run __P((void)); /* main.c */ void Main_ParseArgLine __P((char *)); int main __P((int, char **)); -void Error __P((const char *, ...)); -void Fatal __P((const char *, ...)); -void Punt __P((const char *, ...)); +void Error __P((char *, ...)); +void Fatal __P((char *, ...)); +void Punt __P((char *, ...)); void DieHorribly __P((void)); +int PrintAddr __P((ClientData, ClientData)); void Finish __P((int)); -char *emalloc __P((u_int)); +char *emalloc __P((size_t)); void enomem __P((void)); /* parse.c */ -void Parse_Error __P((int, const char *, ...)); +void Parse_Error __P((int, char *, ...)); Boolean Parse_AnyExport __P((void)); Boolean Parse_IsVar __P((char *)); void Parse_DoVar __P((char *, GNode *)); void Parse_AddIncludeDir __P((char *)); void Parse_File __P((char *, FILE *)); void Parse_Init __P((void)); +void Parse_End __P((void)); void Parse_FromString __P((char *)); Lst Parse_MainName __P((void)); /* str.c */ +void str_init __P((void)); +void str_end __P((void)); char *str_concat __P((char *, char *, int)); -char **brk_string __P((char *, int *)); +char **brk_string __P((char *, int *, Boolean)); char *Str_FindSubstring __P((char *, char *)); int Str_Match __P((char *, char *)); char *Str_SYSVMatch __P((char *, char *, int *len)); @@ -93,7 +98,7 @@ void Str_SYSVSubst __P((Buffer, char *, char *, int)); void Suff_ClearSuffixes __P((void)); Boolean Suff_IsTransform __P((char *)); GNode *Suff_AddTransform __P((char *)); -int Suff_EndTransform __P((GNode *)); +int Suff_EndTransform __P((ClientData, ClientData)); void Suff_AddSuffix __P((char *)); Lst Suff_GetPath __P((char *)); void Suff_DoPaths __P((void)); @@ -102,10 +107,12 @@ void Suff_AddLib __P((char *)); void Suff_FindDeps __P((GNode *)); void Suff_SetNull __P((char *)); void Suff_Init __P((void)); +void Suff_End __P((void)); void Suff_PrintAll __P((void)); /* targ.c */ void Targ_Init __P((void)); +void Targ_End __P((void)); GNode *Targ_NewGN __P((char *)); GNode *Targ_FindNode __P((char *, int)); Lst Targ_FindList __P((Lst, int)); @@ -113,7 +120,7 @@ Boolean Targ_Ignore __P((GNode *)); Boolean Targ_Silent __P((GNode *)); Boolean Targ_Precious __P((GNode *)); void Targ_SetMain __P((GNode *)); -int Targ_PrintCmd __P((char *)); +int Targ_PrintCmd __P((ClientData, ClientData)); char *Targ_FmtTime __P((time_t)); void Targ_PrintType __P((int)); void Targ_PrintGraph __P((int)); @@ -123,10 +130,11 @@ void Var_Delete __P((char *, GNode *)); void Var_Set __P((char *, char *, GNode *)); void Var_Append __P((char *, char *, GNode *)); Boolean Var_Exists __P((char *, GNode *)); -char *Var_Value __P((char *, GNode *)); +char *Var_Value __P((char *, GNode *, char **)); char *Var_Parse __P((char *, GNode *, Boolean, int *, Boolean *)); char *Var_Subst __P((char *, char *, GNode *, Boolean)); char *Var_GetTail __P((char *)); char *Var_GetHead __P((char *)); void Var_Init __P((void)); +void Var_End __P((void)); void Var_Dump __P((GNode *)); diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index a6a085a..e4d8446 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94"; +static char sccsid[] = "@(#)parse.c 8.6 (Berkeley) 6/13/95"; #endif /* not lint */ /*- @@ -63,6 +63,8 @@ static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94"; * called before anything else in this module * is used. * + * Parse_End Cleanup the module + * * Parse_File Function used to parse a makefile. It must * be given the name of the file, which should * already have been opened, and a function @@ -104,6 +106,7 @@ static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94"; #define CONTINUE 1 #define DONE 0 static Lst targets; /* targets we're working on */ +static Lst targCmds; /* command lines for targets */ static Boolean inLine; /* true if currently in a dependency * line or its commands */ typedef struct { @@ -161,6 +164,7 @@ typedef enum { Order, /* .ORDER */ ExPath, /* .PATH */ Precious, /* .PRECIOUS */ + Reserved, /* .RESERVED or .[A-Z]* */ ExShell, /* .SHELL */ Silent, /* .SILENT */ SingleShell, /* .SINGLESHELL */ @@ -188,47 +192,78 @@ static struct { ParseSpecial spec; /* Type when used as a target */ int op; /* Operator when used as a source */ } parseKeywords[] = { +#define DOT_BEGIN 0 { ".BEGIN", Begin, 0 }, +#define DOT_DEFAULT 1 { ".DEFAULT", Default, 0 }, -{ ".OPTIONAL", Attribute, OP_OPTIONAL }, +#define DOT_END 2 { ".END", End, 0 }, +#define DOT_EXEC 3 { ".EXEC", Attribute, OP_EXEC }, +#define DOT_IGNORE 4 { ".IGNORE", Ignore, OP_IGNORE }, +#define DOT_INCLUDES 5 { ".INCLUDES", Includes, 0 }, +#define DOT_INTERRUPT 6 { ".INTERRUPT", Interrupt, 0 }, +#define DOT_INVISIBLE 7 { ".INVISIBLE", Attribute, OP_INVISIBLE }, +#define DOT_JOIN 8 { ".JOIN", Attribute, OP_JOIN }, +#define DOT_LIBS 9 { ".LIBS", Libs, 0 }, +#define DOT_MAIN 10 { ".MAIN", Main, 0 }, +#define DOT_MAKE 11 { ".MAKE", Attribute, OP_MAKE }, +#define DOT_MAKEFLAGS 12 { ".MAKEFLAGS", MFlags, 0 }, +#define DOT_MFLAGS 13 { ".MFLAGS", MFlags, 0 }, +#define DOT_NOTMAIN 14 { ".NOTMAIN", Attribute, OP_NOTMAIN }, +#define DOT_NOTPARALLEL 15 { ".NOTPARALLEL", NotParallel, 0 }, +#define DOT_NULL 16 { ".NULL", Null, 0 }, +#define DOT_OPTIONAL 17 +{ ".OPTIONAL", Attribute, OP_OPTIONAL }, +#define DOT_ORDER 18 { ".ORDER", Order, 0 }, +#define DOT_PATH 19 { ".PATH", ExPath, 0 }, +#define DOT_PHONY 20 +{ ".PHONY", Attribute, OP_PHONY }, +#define DOT_PRECIOUS 21 { ".PRECIOUS", Precious, OP_PRECIOUS }, +#define DOT_RECURSIVE 22 { ".RECURSIVE", Attribute, OP_MAKE }, +#define DOT_RESERVED 23 +{ ".RESERVED", Reserved, 0 }, +#define DOT_SHELL 24 { ".SHELL", ExShell, 0 }, +#define DOT_SILENT 25 { ".SILENT", Silent, OP_SILENT }, +#define DOT_SINGLESHELL 26 { ".SINGLESHELL", SingleShell, 0 }, +#define DOT_SUFFIXES 27 { ".SUFFIXES", Suffixes, 0 }, +#define DOT_USE 28 { ".USE", Attribute, OP_USE }, }; static int ParseFindKeyword __P((char *)); -static int ParseLinkSrc __P((GNode *, GNode *)); -static int ParseDoOp __P((GNode *, int)); +static int ParseLinkSrc __P((ClientData, ClientData)); +static int ParseDoOp __P((ClientData, ClientData)); static void ParseDoSrc __P((int, char *)); -static int ParseFindMain __P((GNode *)); -static int ParseAddDir __P((Lst, char *)); -static int ParseClearPath __P((Lst)); +static int ParseFindMain __P((ClientData, ClientData)); +static int ParseAddDir __P((ClientData, ClientData)); +static int ParseClearPath __P((ClientData, ClientData)); static void ParseDoDependency __P((char *)); -static int ParseAddCmd __P((GNode *, char *)); +static int ParseAddCmd __P((ClientData, ClientData)); static int ParseReadc __P((void)); static void ParseUnreadc __P((int)); -static int ParseHasCommands __P((GNode *)); +static void ParseHasCommands __P((ClientData)); static void ParseDoInclude __P((char *)); #ifdef SYSVINCLUDE static void ParseTraditionalInclude __P((char *)); @@ -274,7 +309,12 @@ ParseFindKeyword (str) start = cur + 1; } } while (start <= end); - return (-1); + + cur = 0; + for (++str; *str; str++) + if (!isupper((unsigned char) *str)) + break; + return *str ? -1 : DOT_RESERVED; } /*- @@ -292,7 +332,7 @@ ParseFindKeyword (str) /* VARARGS */ void #if __STDC__ -Parse_Error(int type, const char *fmt, ...) +Parse_Error(int type, char *fmt, ...) #else Parse_Error(va_alist) va_dcl @@ -338,10 +378,12 @@ Parse_Error(va_alist) *--------------------------------------------------------------------- */ static int -ParseLinkSrc (pgn, cgn) - GNode *pgn; /* The parent node */ - GNode *cgn; /* The child node */ +ParseLinkSrc (pgnp, cgnp) + ClientData pgnp; /* The parent node */ + ClientData cgnp; /* The child node */ { + GNode *pgn = (GNode *) pgnp; + GNode *cgn = (GNode *) cgnp; if (Lst_Member (pgn->children, (ClientData)cgn) == NILLNODE) { (void)Lst_AtEnd (pgn->children, (ClientData)cgn); if (specType == Not) { @@ -369,11 +411,13 @@ ParseLinkSrc (pgn, cgn) *--------------------------------------------------------------------- */ static int -ParseDoOp (gn, op) - GNode *gn; /* The node to which the operator is to be +ParseDoOp (gnp, opp) + ClientData gnp; /* The node to which the operator is to be * applied */ - int op; /* The operator to apply */ + ClientData opp; /* The operator to apply */ { + GNode *gn = (GNode *) gnp; + int op = *(int *) opp; /* * If the dependency mask of the operator and the node don't match and * the node has actually had an operator applied to it before, and @@ -461,7 +505,7 @@ ParseDoSrc (tOp, src) } } if (op != 0) { - Lst_ForEach (targets, ParseDoOp, (ClientData)op); + Lst_ForEach (targets, ParseDoOp, (ClientData)&op); } else if (specType == Main) { /* * If we have noted the existence of a .MAIN, it means we need @@ -541,15 +585,17 @@ ParseDoSrc (tOp, src) *----------------------------------------------------------------------- */ static int -ParseFindMain(gn) - GNode *gn; /* Node to examine */ +ParseFindMain(gnp, dummy) + ClientData gnp; /* Node to examine */ + ClientData dummy; { + GNode *gn = (GNode *) gnp; if ((gn->type & (OP_NOTMAIN|OP_USE|OP_EXEC|OP_TRANSFORM)) == 0) { mainNode = gn; Targ_SetMain(gn); - return (1); + return (dummy ? 1 : 1); } else { - return (0); + return (dummy ? 0 : 0); } } @@ -568,10 +614,10 @@ ParseFindMain(gn) */ static int ParseAddDir(path, name) - Lst path; - char *name; + ClientData path; + ClientData name; { - Dir_AddDir(path, name); + Dir_AddDir((Lst) path, (char *) name); return(0); } @@ -589,11 +635,12 @@ ParseAddDir(path, name) *----------------------------------------------------------------------- */ static int -ParseClearPath(path) - Lst path; +ParseClearPath(path, dummy) + ClientData path; + ClientData dummy; { - Dir_ClearPath(path); - return(0); + Dir_ClearPath((Lst) path); + return(dummy ? 0 : 0); } /*- @@ -634,9 +681,9 @@ static void ParseDoDependency (line) char *line; /* the line to parse */ { - register char *cp; /* our current position */ - register GNode *gn; /* a general purpose temporary node */ - register int op; /* the operator on the line */ + char *cp; /* our current position */ + GNode *gn; /* a general purpose temporary node */ + int op; /* the operator on the line */ char savec; /* a place to save a character */ Lst paths; /* List of search paths to alter when parsing * a list of .PATH targets */ @@ -793,6 +840,12 @@ ParseDoDependency (line) case Order: predecessor = NILGNODE; break; + case Reserved: + /* + * A posix reserved target that we don't know + * how to deal with. + */ + return; default: break; } @@ -931,7 +984,7 @@ ParseDoDependency (line) cp++; /* Advance beyond operator */ - Lst_ForEach (targets, ParseDoOp, (ClientData)op); + Lst_ForEach (targets, ParseDoOp, (ClientData)&op); /* * Get to the first source @@ -1225,20 +1278,20 @@ Parse_DoVar (line, ctxt) * assignment. This reduces error checks */ GNode *ctxt; /* Context in which to do the assignment */ { - char *cp; /* pointer into line */ + char *cp; /* pointer into line */ enum { VAR_SUBST, VAR_APPEND, VAR_SHELL, VAR_NORMAL } type; /* Type of assignment */ char *opc; /* ptr to operator character to * null-terminate the variable name */ - /* + /* * Avoid clobbered variable warnings by forcing the compiler * to ``unregister'' variables - */ + */ #if __GNUC__ - (void) &cp; - (void) &line; -#endif + (void) &cp; + (void) &line; +#endif /* * Skip to variable name @@ -1328,13 +1381,14 @@ Parse_DoVar (line, ctxt) Boolean freeCmd; /* TRUE if the command needs to be freed, i.e. * if any variable expansion was performed */ - /* + /* * Avoid clobbered variable warnings by forcing the compiler * to ``unregister'' variables - */ + */ #if __GNUC__ (void) &freeCmd; -#endif +#endif + /* * Set up arguments for shell */ @@ -1402,7 +1456,7 @@ Parse_DoVar (line, ctxt) char result[BUFSIZ]; cc = read(fds[0], result, sizeof(result)); if (cc > 0) - Buf_AddBytes(buf, cc, (unsigned char *) result); + Buf_AddBytes(buf, cc, (Byte *) result); } while (cc > 0 || (cc == -1 && errno == EINTR)); @@ -1481,14 +1535,15 @@ Parse_DoVar (line, ctxt) * A new element is added to the commands list of the node. */ static int -ParseAddCmd(gn, cmd) - GNode *gn; /* the node to which the command is to be added */ - char *cmd; /* the command to add */ +ParseAddCmd(gnp, cmd) + ClientData gnp; /* the node to which the command is to be added */ + ClientData cmd; /* the command to add */ { - /* if target already supplied, ignore commands */ - if (!(gn->type & OP_HAS_COMMANDS)) - (void)Lst_AtEnd(gn->commands, (ClientData)cmd); - return(0); + GNode *gn = (GNode *) gnp; + /* if target already supplied, ignore commands */ + if (!(gn->type & OP_HAS_COMMANDS)) + (void)Lst_AtEnd(gn->commands, cmd); + return(0); } /*- @@ -1500,21 +1555,21 @@ ParseAddCmd(gn, cmd) * on multiple dependency lines. * * Results: - * Always 0. + * None * * Side Effects: * OP_HAS_COMMANDS may be set for the target. * *----------------------------------------------------------------------- */ -static int -ParseHasCommands(gn) - GNode *gn; /* Node to examine */ +static void +ParseHasCommands(gnp) + ClientData gnp; /* Node to examine */ { + GNode *gn = (GNode *) gnp; if (!Lst_IsEmpty(gn->commands)) { gn->type |= OP_HAS_COMMANDS; } - return(0); } /*- @@ -1633,7 +1688,10 @@ ParseDoInclude (file) char *newName; *prefEnd = '\0'; - newName = str_concat (fname, file, STR_ADDSLASH); + if (file[0] == '/') + newName = strdup(file); + else + newName = str_concat (fname, file, STR_ADDSLASH); fullname = Dir_FindFile (newName, parseIncPath); if (fullname == (char *)NULL) { fullname = Dir_FindFile(newName, dirSearchPath); @@ -1674,6 +1732,8 @@ ParseDoInclude (file) return; } + free(file); + /* * Once we find the absolute path to the file, we get to save all the * state from the current file before we can start reading this @@ -2071,7 +2131,8 @@ ParseReadLine () * for the purposes of setting semiNL */ Boolean ignComment; /* TRUE if should ignore comments (in a * shell command */ - char *line; /* Result */ + char *line; /* Result */ + char *ep; /* to strip trailing blanks */ int lineLength; /* Length of result */ semiNL = FALSE; @@ -2181,7 +2242,7 @@ test_char: break; case '#': if (!ignComment) { - if (compatMake || (lastc != '\\')) { + if (compatMake && (lastc != '\\')) { /* * If the character is a hash mark and it isn't escaped * (or we're being compatible), the thing is a comment. @@ -2229,6 +2290,21 @@ test_char: Buf_AddByte (buf, (Byte)'\0'); line = (char *)Buf_GetAll (buf, &lineLength); Buf_Destroy (buf, FALSE); + + /* + * Strip trailing blanks and tabs from the line. + * Do not strip a blank or tab that is preceeded by + * a '\' + */ + ep = line; + while (*ep) + ++ep; + while (ep > line && (ep[-1] == ' ' || ep[-1] == '\t')) { + if (ep > line + 1 && ep[-2] == '\\') + break; + --ep; + } + *ep = 0; if (line[0] == '.') { /* @@ -2302,11 +2378,10 @@ test_char: static void ParseFinishLine() { - extern int Suff_EndTransform(); - if (inLine) { Lst_ForEach(targets, Suff_EndTransform, (ClientData)NULL); Lst_Destroy (targets, ParseHasCommands); + targets = NULL; inLine = FALSE; } } @@ -2356,11 +2431,12 @@ Parse_File(name, stream) goto nextLine; } else if (strncmp(cp, "undef", 5) == 0) { char *cp2; - for (cp += 5; isspace(*cp); cp++) { + for (cp += 5; isspace((unsigned char) *cp); cp++) { continue; } - for (cp2 = cp; !isspace(*cp2) && (*cp2 != '\0'); cp2++) { + for (cp2 = cp; !isspace((unsigned char) *cp2) && + (*cp2 != '\0'); cp2++) { continue; } @@ -2370,22 +2446,20 @@ Parse_File(name, stream) goto nextLine; } } - if (*line == '#') { - /* If we're this far, the line must be a comment. */ + if (*line == '#' || *line == '\0') { + /* If we're this far, the line must be a comment. + (Empty lines are ignored as well) */ goto nextLine; } - if (*line == '\t' -#ifdef POSIX - || *line == ' ' -#endif - ) - { + if (*line == '\t') { /* - * If a line starts with a tab (or space in POSIX-land), it - * can only hope to be a creation command. + * If a line starts with a tab, it can only hope to be + * a creation command. */ +#ifndef POSIX shellCommand: +#endif for (cp = line + 1; isspace (*cp); cp++) { continue; } @@ -2396,7 +2470,8 @@ Parse_File(name, stream) * in a dependency spec, add the command to the list of * commands of all targets in the dependency spec */ - Lst_ForEach (targets, ParseAddCmd, (ClientData)cp); + Lst_ForEach (targets, ParseAddCmd, cp); + Lst_AtEnd(targCmds, (ClientData) line); continue; } else { Parse_Error (PARSE_FATAL, @@ -2426,24 +2501,28 @@ Parse_File(name, stream) * If it doesn't have an operator and we're in a dependency * line's script, we assume it's actually a shell command * and add it to the current list of targets. - * - * Note that POSIX declares all lines that start with - * whitespace are shell commands, so there's no need to check - * here... */ +#ifndef POSIX Boolean nonSpace = FALSE; +#endif cp = line; + if (isspace((unsigned char) line[0])) { + while ((*cp != '\0') && isspace((unsigned char) *cp)) { + cp++; + } + if (*cp == '\0') { + goto nextLine; + } #ifndef POSIX - if (line[0] == ' ') { while ((*cp != ':') && (*cp != '!') && (*cp != '\0')) { - if (!isspace(*cp)) { - nonSpace = TRUE; - } + nonSpace = TRUE; cp++; } +#endif } +#ifndef POSIX if (*cp == '\0') { if (inLine) { Parse_Error (PARSE_WARNING, @@ -2463,6 +2542,9 @@ Parse_File(name, stream) /* * Need a non-circular list for the target nodes */ + if (targets) + Lst_Destroy(targets, NOFREE); + targets = Lst_Init (FALSE); inLine = TRUE; @@ -2515,6 +2597,7 @@ Parse_Init () parseIncPath = Lst_Init (FALSE); sysIncPath = Lst_Init (FALSE); includes = Lst_Init (FALSE); + targCmds = Lst_Init (FALSE); /* * Add the directories from the DEFSYSPATH (more than one may be given @@ -2532,6 +2615,18 @@ Parse_Init () } } +void +Parse_End() +{ + Lst_Destroy(targCmds, (void (*) __P((ClientData))) free); + if (targets) + Lst_Destroy(targets, NOFREE); + Lst_Destroy(sysIncPath, Dir_Destroy); + Lst_Destroy(parseIncPath, Dir_Destroy); + Lst_Destroy(includes, NOFREE); /* Should be empty now */ +} + + /*- *----------------------------------------------------------------------- * Parse_MainName -- diff --git a/usr.bin/make/pathnames.h b/usr.bin/make/pathnames.h index 19f29ef..8cb0661 100644 --- a/usr.bin/make/pathnames.h +++ b/usr.bin/make/pathnames.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)pathnames.h 8.1 (Berkeley) 6/6/93 + * @(#)pathnames.h 8.2 (Berkeley) 4/28/95 */ #define _PATH_OBJDIR "obj" diff --git a/usr.bin/make/sprite.h b/usr.bin/make/sprite.h index 797e453..0da22f1 100644 --- a/usr.bin/make/sprite.h +++ b/usr.bin/make/sprite.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)sprite.h 8.1 (Berkeley) 6/6/93 + * @(#)sprite.h 8.2 (Berkeley) 4/28/95 */ /* @@ -86,7 +86,7 @@ typedef int ReturnStatus; * by user processes. */ -#define NIL (~0) +#define NIL ~0 #define USER_NIL 0 #ifndef NULL #define NULL 0 @@ -103,12 +103,9 @@ typedef char *Address; * ClientData is an uninterpreted word. It is defined as an int so that * kdbx will not interpret client data as a string. Unlike an "Address", * client data will generally not be used in arithmetic. + * But we don't have kdbx anymore so we define it as void (christos) */ -typedef int *ClientData; +typedef void *ClientData; -#ifdef notdef -#include "status.h" -#endif - -#endif _SPRITE +#endif /* _SPRITE */ diff --git a/usr.bin/make/str.c b/usr.bin/make/str.c index 84e95eb..7df8e8d 100644 --- a/usr.bin/make/str.c +++ b/usr.bin/make/str.c @@ -37,11 +37,45 @@ */ #ifndef lint -static char sccsid[] = "@(#)str.c 8.4 (Berkeley) 3/21/94"; +static char sccsid[] = "@(#)str.c 8.6 (Berkeley) 4/28/95"; #endif /* not lint */ #include "make.h" +static char **argv, *buffer; +static int argmax, curlen; + +/* + * str_init -- + * Initialize the strings package + * + */ +void +str_init() +{ + char *p1; + argv = (char **)emalloc((argmax = 50) * sizeof(char *)); + argv[0] = Var_Value(".MAKE", VAR_GLOBAL, &p1); +} + + +/* + * str_end -- + * Cleanup the strings package + * + */ +void +str_end() +{ + if (argv[0]) { + free(argv[0]); + free((Address) argv); + } + if (buffer) + free(buffer); +} + + /*- * str_concat -- * concatenate the two strings, inserting a space or slash between them, @@ -99,29 +133,25 @@ str_concat(s1, s2, flags) * the first word is always the value of the .MAKE variable. */ char ** -brk_string(str, store_argc) +brk_string(str, store_argc, expand) register char *str; int *store_argc; + Boolean expand; { - static int argmax, curlen; - static char **argv, *buf; register int argc, ch; register char inquote, *p, *start, *t; int len; - /* save off pmake variable */ - if (!argv) { - argv = (char **)emalloc((argmax = 50) * sizeof(char *)); - argv[0] = Var_Value(".MAKE", VAR_GLOBAL); - } - /* skip leading space chars. */ for (; *str == ' ' || *str == '\t'; ++str) continue; /* allocate room for a copy of the string */ - if ((len = strlen(str) + 1) > curlen) - buf = emalloc(curlen = len); + if ((len = strlen(str) + 1) > curlen) { + if (buffer) + free(buffer); + buffer = emalloc(curlen = len); + } /* * copy the string; at the same time, parse backslashes, @@ -129,7 +159,7 @@ brk_string(str, store_argc) */ argc = 1; inquote = '\0'; - for (p = str, start = t = buf;; ++p) { + for (p = str, start = t = buffer;; ++p) { switch(ch = *p) { case '"': case '\'': @@ -138,22 +168,36 @@ brk_string(str, store_argc) inquote = '\0'; else break; - else + else { inquote = (char) ch; + /* Don't miss "" or '' */ + if (start == NULL && p[1] == inquote) { + start = t + 1; + break; + } + } + if (!expand) { + if (!start) + start = t; + *t++ = ch; + } continue; case ' ': case '\t': + case '\n': if (inquote) break; if (!start) continue; /* FALLTHROUGH */ - case '\n': case '\0': /* * end of a token -- make sure there's enough argv * space and save off a pointer. */ + if (!start) + goto done; + *t++ = '\0'; if (argc == argmax) { argmax *= 2; /* ramp up fast */ @@ -167,6 +211,14 @@ brk_string(str, store_argc) goto done; continue; case '\\': + if (!expand) { + if (!start) + start = t; + *t++ = '\\'; + ch = *++p; + break; + } + switch (ch = *++p) { case '\0': case '\n': diff --git a/usr.bin/make/suff.c b/usr.bin/make/suff.c index b8eaa5a..1b344d4 100644 --- a/usr.bin/make/suff.c +++ b/usr.bin/make/suff.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)suff.c 8.4 (Berkeley) 3/21/94"; +static char sccsid[] = "@(#)suff.c 8.5 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -48,6 +48,8 @@ static char sccsid[] = "@(#)suff.c 8.4 (Berkeley) 3/21/94"; * Interface: * Suff_Init Initialize all things to do with suffixes. * + * Suff_End Cleanup the module + * * Suff_DoPaths This function is used to make life easier * when searching for a file according to its * suffix. It takes the global search path, @@ -96,6 +98,8 @@ static char sccsid[] = "@(#)suff.c 8.4 (Berkeley) 3/21/94"; #include "bit.h" static Lst sufflist; /* Lst of suffixes */ +static Lst suffClean; /* Lst of suffixes to be cleaned */ +static Lst srclist; /* Lst of sources */ static Lst transforms; /* Lst of transformation rules */ static int sNum = 0; /* Counter for assigning suffix numbers */ @@ -113,8 +117,10 @@ typedef struct _Suff { Lst searchPath; /* The path along which files of this suffix * may be found */ int sNum; /* The suffix number */ + int refCount; /* Reference count of list membership */ Lst parents; /* Suffixes we have a transformation to */ Lst children; /* Suffixes we have a transformation from */ + Lst ref; /* List of lists this suffix is referenced */ } Suff; /* @@ -128,6 +134,9 @@ typedef struct _Src { GNode *node; /* The node describing the file */ int children; /* Count of existing children (so we don't free * this thing too early or never nuke it) */ +#ifdef DEBUG_SRC + Lst cp; /* Debug; children list */ +#endif } Src; /* @@ -146,27 +155,28 @@ static Suff *emptySuff; /* The empty suffix required for POSIX static char *SuffStrIsPrefix __P((char *, char *)); static char *SuffSuffIsSuffix __P((Suff *, char *)); -static int SuffSuffIsSuffixP __P((Suff *, char *)); -static int SuffSuffHasNameP __P((Suff *, char *)); -static int SuffSuffIsPrefix __P((Suff *, char *)); -static int SuffGNHasNameP __P((GNode *, char *)); -static void SuffFree __P((Suff *)); -static Suff* SuffCopy __P((Suff *)); +static int SuffSuffIsSuffixP __P((ClientData, ClientData)); +static int SuffSuffHasNameP __P((ClientData, ClientData)); +static int SuffSuffIsPrefix __P((ClientData, ClientData)); +static int SuffGNHasNameP __P((ClientData, ClientData)); +static void SuffFree __P((ClientData)); static void SuffInsert __P((Lst, Suff *)); +static void SuffRemove __P((Lst, Suff *)); static Boolean SuffParseTransform __P((char *, Suff **, Suff **)); -static int SuffRebuildGraph __P((GNode *, Suff *)); -static int SuffAddSrc __P((Suff *, LstSrc *)); +static int SuffRebuildGraph __P((ClientData, ClientData)); +static int SuffAddSrc __P((ClientData, ClientData)); +static int SuffRemoveSrc __P((Lst)); static void SuffAddLevel __P((Lst, Src *)); -static void SuffFreeSrc __P((Src *)); -static Src *SuffFindThem __P((Lst)); -static Src *SuffFindCmds __P((Src *)); -static int SuffExpandChildren __P((GNode *, GNode *)); +static Src *SuffFindThem __P((Lst, Lst)); +static Src *SuffFindCmds __P((Src *, Lst)); +static int SuffExpandChildren __P((ClientData, ClientData)); static Boolean SuffApplyTransform __P((GNode *, GNode *, Suff *, Suff *)); -static void SuffFindArchiveDeps __P((GNode *)); -static void SuffFindNormalDeps __P((GNode *)); -static int SuffPrintName __P((Suff *)); -static int SuffPrintSuff __P((Suff *)); -static int SuffPrintTrans __P((GNode *)); +static void SuffFindDeps __P((GNode *, Lst)); +static void SuffFindArchiveDeps __P((GNode *, Lst)); +static void SuffFindNormalDeps __P((GNode *, Lst)); +static int SuffPrintName __P((ClientData, ClientData)); +static int SuffPrintSuff __P((ClientData, ClientData)); +static int SuffPrintTrans __P((ClientData, ClientData)); /*************** Lst Predicates ****************/ /*- @@ -243,10 +253,10 @@ SuffSuffIsSuffix (s, str) */ static int SuffSuffIsSuffixP(s, str) - Suff *s; - char *str; + ClientData s; + ClientData str; { - return(!SuffSuffIsSuffix(s, str)); + return(!SuffSuffIsSuffix((Suff *) s, (char *) str)); } /*- @@ -264,10 +274,10 @@ SuffSuffIsSuffixP(s, str) */ static int SuffSuffHasNameP (s, sname) - Suff *s; /* Suffix to check */ - char *sname; /* Desired name */ + ClientData s; /* Suffix to check */ + ClientData sname; /* Desired name */ { - return (strcmp (sname, s->name)); + return (strcmp ((char *) sname, ((Suff *) s)->name)); } /*- @@ -287,10 +297,10 @@ SuffSuffHasNameP (s, sname) */ static int SuffSuffIsPrefix (s, str) - Suff *s; /* suffix to compare */ - char *str; /* string to examine */ + ClientData s; /* suffix to compare */ + ClientData str; /* string to examine */ { - return (SuffStrIsPrefix (s->name, str) == NULL ? 1 : 0); + return (SuffStrIsPrefix (((Suff *) s)->name, (char *) str) == NULL ? 1 : 0); } /*- @@ -307,13 +317,28 @@ SuffSuffIsPrefix (s, str) */ static int SuffGNHasNameP (gn, name) - GNode *gn; /* current node we're looking at */ - char *name; /* name we're looking for */ + ClientData gn; /* current node we're looking at */ + ClientData name; /* name we're looking for */ { - return (strcmp (name, gn->name)); + return (strcmp ((char *) name, ((GNode *) gn)->name)); } /*********** Maintenance Functions ************/ + +static void +SuffUnRef(lp, sp) + ClientData lp; + ClientData sp; +{ + Lst l = (Lst) lp; + + LstNode ln = Lst_Member(l, sp); + if (ln != NILLNODE) { + Lst_Remove(l, ln); + ((Suff *) sp)->refCount--; + } +} + /*- *----------------------------------------------------------------------- * SuffFree -- @@ -327,18 +352,51 @@ SuffGNHasNameP (gn, name) *----------------------------------------------------------------------- */ static void -SuffFree (s) - Suff *s; +SuffFree (sp) + ClientData sp; { + Suff *s = (Suff *) sp; + + if (s == suffNull) + suffNull = NULL; + + if (s == emptySuff) + emptySuff = NULL; + + Lst_Destroy (s->ref, NOFREE); Lst_Destroy (s->children, NOFREE); Lst_Destroy (s->parents, NOFREE); Lst_Destroy (s->searchPath, Dir_Destroy); + free ((Address)s->name); free ((Address)s); } /*- *----------------------------------------------------------------------- + * SuffRemove -- + * Remove the suffix into the list + * + * Results: + * None + * + * Side Effects: + * The reference count for the suffix is decremented and the + * suffix is possibly freed + *----------------------------------------------------------------------- + */ +static void +SuffRemove(l, s) + Lst l; + Suff *s; +{ + SuffUnRef((ClientData) l, (ClientData) s); + if (s->refCount == 0) + SuffFree((ClientData) s); +} + +/*- + *----------------------------------------------------------------------- * SuffInsert -- * Insert the suffix into the list keeping the list ordered by suffix * numbers. @@ -347,7 +405,7 @@ SuffFree (s) * None * * Side Effects: - * Not really + * The reference count of the suffix is incremented *----------------------------------------------------------------------- */ static void @@ -377,11 +435,15 @@ SuffInsert (l, s) printf("at end of list\n"); } (void)Lst_AtEnd (l, (ClientData)s); + s->refCount++; + (void)Lst_AtEnd(s->ref, (ClientData) l); } else if (s2->sNum != s->sNum) { if (DEBUG(SUFF)) { printf("before %s(%d)\n", s2->name, s2->sNum); } (void)Lst_Insert (l, ln, (ClientData)s); + s->refCount++; + (void)Lst_AtEnd(s->ref, (ClientData) l); } else if (DEBUG(SUFF)) { printf("already there\n"); } @@ -407,8 +469,7 @@ SuffInsert (l, s) void Suff_ClearSuffixes () { - Lst_Destroy (sufflist, SuffFree); - + Lst_Concat (suffClean, sufflist, LST_CONCLINK); sufflist = Lst_Init(FALSE); sNum = 0; suffNull = emptySuff; @@ -473,7 +534,7 @@ SuffParseTransform(str, srcPtr, targPtr) * XXX: Use emptySuff over suffNull? */ *srcPtr = single; - *targPtr = SuffCopy(suffNull); + *targPtr = suffNull; return(TRUE); } return (FALSE); @@ -597,14 +658,16 @@ Suff_AddTransform (line) *----------------------------------------------------------------------- */ int -Suff_EndTransform(gn) - GNode *gn; /* Node for transformation */ +Suff_EndTransform(gnp, dummy) + ClientData gnp; /* Node for transformation */ + ClientData dummy; /* Node for transformation */ { + GNode *gn = (GNode *) gnp; + if ((gn->type & OP_TRANSFORM) && Lst_IsEmpty(gn->commands) && Lst_IsEmpty(gn->children)) { Suff *s, *t; - LstNode ln; (void)SuffParseTransform(gn->name, &s, &t); @@ -621,23 +684,17 @@ Suff_EndTransform(gn) * We'll be called twice when the next target is seen, but .c and .o * are only linked once... */ - ln = Lst_Member(t->children, (ClientData)s); - if (ln != NILLNODE) { - (void)Lst_Remove(t->children, ln); - } + SuffRemove(t->children, s); /* * Remove the target from the source's parents list */ - ln = Lst_Member(s->parents, (ClientData)t); - if (ln != NILLNODE) { - (void)Lst_Remove(s->parents, ln); - } + SuffRemove(s->parents, t); } else if ((gn->type & OP_TRANSFORM) && DEBUG(SUFF)) { printf("transformation %s complete\n", gn->name); } - return(0); + return(dummy ? 0 : 0); } /*- @@ -660,13 +717,15 @@ Suff_EndTransform(gn) *----------------------------------------------------------------------- */ static int -SuffRebuildGraph(transform, s) - GNode *transform; /* Transformation to test */ - Suff *s; /* Suffix to rebuild */ +SuffRebuildGraph(transformp, sp) + ClientData transformp; /* Transformation to test */ + ClientData sp; /* Suffix to rebuild */ { - register char *cp; - register LstNode ln; - register Suff *s2; + GNode *transform = (GNode *) transformp; + Suff *s = (Suff *) sp; + char *cp; + LstNode ln; + Suff *s2; /* * First see if it is a transformation from this suffix. @@ -742,8 +801,10 @@ Suff_AddSuffix (str) s->searchPath = Lst_Init (FALSE); s->children = Lst_Init (FALSE); s->parents = Lst_Init (FALSE); + s->ref = Lst_Init (FALSE); s->sNum = sNum++; s->flags = 0; + s->refCount = 0; (void)Lst_AtEnd (sufflist, (ClientData)s); /* @@ -806,6 +867,7 @@ Suff_DoPaths() { register Suff *s; register LstNode ln; + char *ptr; Lst inIncludes; /* Cumulative .INCLUDES path */ Lst inLibs; /* Cumulative .LIBS path */ @@ -836,8 +898,10 @@ Suff_DoPaths() } } - Var_Set(".INCLUDES", Dir_MakeFlags("-I", inIncludes), VAR_GLOBAL); - Var_Set(".LIBS", Dir_MakeFlags("-L", inLibs), VAR_GLOBAL); + Var_Set(".INCLUDES", ptr = Dir_MakeFlags("-I", inIncludes), VAR_GLOBAL); + free(ptr); + Var_Set(".LIBS", ptr = Dir_MakeFlags("-L", inLibs), VAR_GLOBAL); + free(ptr); Lst_Destroy(inIncludes, Dir_Destroy); Lst_Destroy(inLibs, Dir_Destroy); @@ -921,10 +985,12 @@ Suff_AddLib (sname) *----------------------------------------------------------------------- */ static int -SuffAddSrc (s, ls) - Suff *s; /* suffix for which to create a Src structure */ - LstSrc *ls; /* list and parent for the new Src */ +SuffAddSrc (sp, lsp) + ClientData sp; /* suffix for which to create a Src structure */ + ClientData lsp; /* list and parent for the new Src */ { + Suff *s = (Suff *) sp; + LstSrc *ls = (LstSrc *) lsp; Src *s2; /* new Src structure */ Src *targ; /* Target structure */ @@ -942,9 +1008,17 @@ SuffAddSrc (s, ls) s2->parent = targ; s2->node = NILGNODE; s2->suff = s; + s->refCount++; s2->children = 0; targ->children += 1; (void)Lst_AtEnd (ls->l, (ClientData)s2); +#ifdef DEBUG_SRC + s2->cp = Lst_Init(FALSE); + Lst_AtEnd(targ->cp, (ClientData) s2); + printf("1 add %x %x to %x:", targ, s2, ls->l); + Lst_ForEach(ls->l, PrintAddr, (ClientData) 0); + printf("\n"); +#endif } s2 = (Src *) emalloc (sizeof (Src)); s2->file = str_concat (targ->pref, s->name, 0); @@ -952,9 +1026,17 @@ SuffAddSrc (s, ls) s2->parent = targ; s2->node = NILGNODE; s2->suff = s; + s->refCount++; s2->children = 0; targ->children += 1; (void)Lst_AtEnd (ls->l, (ClientData)s2); +#ifdef DEBUG_SRC + s2->cp = Lst_Init(FALSE); + Lst_AtEnd(targ->cp, (ClientData) s2); + printf("2 add %x %x to %x:", targ, s2, ls->l); + Lst_ForEach(ls->l, PrintAddr, (ClientData) 0); + printf("\n"); +#endif return(0); } @@ -986,31 +1068,70 @@ SuffAddLevel (l, targ) /*- *---------------------------------------------------------------------- - * SuffFreeSrc -- - * Free all memory associated with a Src structure + * SuffRemoveSrc -- + * Free all src structures in list that don't have a reference count * * Results: - * None + * Ture if an src was removed * * Side Effects: * The memory is free'd. *---------------------------------------------------------------------- */ -static void -SuffFreeSrc (s) - Src *s; +static int +SuffRemoveSrc (l) + Lst l; { - free ((Address)s->file); - if (!s->parent) { - free((Address)s->pref); - } else if (--s->parent->children == 0 && s->parent->parent) { - /* - * Parent has no more children, now we're gone, and it's not - * at the top of the tree, so blow it away too. - */ - SuffFreeSrc(s->parent); + LstNode ln; + Src *s; + int t = 0; + + if (Lst_Open (l) == FAILURE) { + return 0; } - free ((Address)s); +#ifdef DEBUG_SRC + printf("cleaning %lx: ", (unsigned long) l); + Lst_ForEach(l, PrintAddr, (ClientData) 0); + printf("\n"); +#endif + + + while ((ln = Lst_Next (l)) != NILLNODE) { + s = (Src *) Lst_Datum (ln); + if (s->children == 0) { + free ((Address)s->file); + if (!s->parent) + free((Address)s->pref); + else { +#ifdef DEBUG_SRC + LstNode ln = Lst_Member(s->parent->cp, (ClientData)s); + if (ln != NILLNODE) + Lst_Remove(s->parent->cp, ln); +#endif + --s->parent->children; + } +#ifdef DEBUG_SRC + printf("free: [l=%x] p=%x %d\n", l, s, s->children); + Lst_Destroy(s->cp, NOFREE); +#endif + Lst_Remove(l, ln); + free ((Address)s); + t |= 1; + Lst_Close(l); + return TRUE; + } +#ifdef DEBUG_SRC + else { + printf("keep: [l=%x] p=%x %d: ", l, s, s->children); + Lst_ForEach(s->cp, PrintAddr, (ClientData) 0); + printf("\n"); + } +#endif + } + + Lst_Close(l); + + return t; } /*- @@ -1026,11 +1147,13 @@ SuffFreeSrc (s) *----------------------------------------------------------------------- */ static Src * -SuffFindThem (srcs) +SuffFindThem (srcs, slst) Lst srcs; /* list of Src structures to search through */ + Lst slst; { Src *s; /* current Src */ Src *rs; /* returned Src */ + char *ptr; rs = (Src *) NULL; @@ -1040,24 +1163,38 @@ SuffFindThem (srcs) if (DEBUG(SUFF)) { printf ("\ttrying %s...", s->file); } + /* * A file is considered to exist if either a node exists in the * graph for it or the file actually exists. */ - if ((Targ_FindNode(s->file, TARG_NOCREATE) != NILGNODE) || - (Dir_FindFile (s->file, s->suff->searchPath) != (char *) NULL)) - { - if (DEBUG(SUFF)) { - printf ("got it\n"); - } + if (Targ_FindNode(s->file, TARG_NOCREATE) != NILGNODE) { +#ifdef DEBUG_SRC + printf("remove %x from %x\n", s, srcs); +#endif rs = s; break; - } else { - if (DEBUG(SUFF)) { - printf ("not there\n"); - } - SuffAddLevel (srcs, s); } + + if ((ptr = Dir_FindFile (s->file, s->suff->searchPath)) != NULL) { + rs = s; +#ifdef DEBUG_SRC + printf("remove %x from %x\n", s, srcs); +#endif + free(ptr); + break; + } + + if (DEBUG(SUFF)) { + printf ("not there\n"); + } + + SuffAddLevel (srcs, s); + Lst_AtEnd(slst, (ClientData) s); + } + + if (DEBUG(SUFF) && rs) { + printf ("got it\n"); } return (rs); } @@ -1078,8 +1215,9 @@ SuffFindThem (srcs) *----------------------------------------------------------------------- */ static Src * -SuffFindCmds (targ) - Src *targ; /* Src structure to play with */ +SuffFindCmds (targ, slst) + Src *targ; /* Src structure to play with */ + Lst slst; { LstNode ln; /* General-purpose list node */ register GNode *t, /* Target GNode */ @@ -1127,14 +1265,21 @@ SuffFindCmds (targ) * source node's name so Suff_FindDeps can free it * again (ick)), and return the new structure. */ - ret = (Src *)emalloc (sizeof(Src)); + ret = (Src *)emalloc (sizeof (Src)); ret->file = strdup(s->name); ret->pref = targ->pref; ret->suff = suff; + suff->refCount++; ret->parent = targ; ret->node = s; ret->children = 0; targ->children += 1; +#ifdef DEBUG_SRC + ret->cp = Lst_Init(FALSE); + printf("3 add %x %x\n", targ, ret); + Lst_AtEnd(targ->cp, (ClientData) ret); +#endif + Lst_AtEnd(slst, (ClientData) ret); if (DEBUG(SUFF)) { printf ("\tusing existing source %s\n", s->name); } @@ -1164,10 +1309,12 @@ SuffFindCmds (targ) *----------------------------------------------------------------------- */ static int -SuffExpandChildren(cgn, pgn) - GNode *cgn; /* Child to examine */ - GNode *pgn; /* Parent node being processed */ +SuffExpandChildren(cgnp, pgnp) + ClientData cgnp; /* Child to examine */ + ClientData pgnp; /* Parent node being processed */ { + GNode *cgn = (GNode *) cgnp; + GNode *pgn = (GNode *) pgnp; GNode *gn; /* New source 8) */ LstNode prevLN; /* Node after which new source should be put */ LstNode ln; /* List element for old source */ @@ -1510,8 +1657,9 @@ SuffApplyTransform(tGn, sGn, t, s) *----------------------------------------------------------------------- */ static void -SuffFindArchiveDeps(gn) +SuffFindArchiveDeps(gn, slst) GNode *gn; /* Node for which to locate dependencies */ + Lst slst; { char *eoarch; /* End of archive portion */ char *eoname; /* End of member portion */ @@ -1520,7 +1668,6 @@ SuffFindArchiveDeps(gn) TARGET, /* Must be first */ PREFIX, /* Must be second */ }; - char *vals[sizeof(copy)/sizeof(copy[0])]; int i; /* Index into copy and vals */ Suff *ms; /* Suffix descriptor for member */ char *name; /* Start of member's name */ @@ -1545,7 +1692,7 @@ SuffFindArchiveDeps(gn) * suffix list, backtracking for each one... */ mem = Targ_FindNode(name, TARG_CREATE); - Suff_FindDeps(mem); + SuffFindDeps(mem, slst); /* * Create the link between the two nodes right off @@ -1560,8 +1707,11 @@ SuffFindArchiveDeps(gn) * Copy in the variables from the member node to this one. */ for (i = (sizeof(copy)/sizeof(copy[0]))-1; i >= 0; i--) { - vals[i] = Var_Value(copy[i], mem); - Var_Set(copy[i], vals[i], gn); + char *p1; + Var_Set(copy[i], Var_Value(copy[i], mem, &p1), gn); + if (p1) + free(p1); + } ms = mem->suffix; @@ -1645,8 +1795,9 @@ SuffFindArchiveDeps(gn) *----------------------------------------------------------------------- */ static void -SuffFindNormalDeps(gn) +SuffFindNormalDeps(gn, slst) GNode *gn; /* Node for which to find sources */ + Lst slst; { char *eoname; /* End of name */ char *sopref; /* Start of prefix */ @@ -1703,12 +1854,16 @@ SuffFindNormalDeps(gn) /* * Allocate a Src structure to which things can be transformed */ - targ = (Src *)emalloc(sizeof(Src)); + targ = (Src *)emalloc(sizeof (Src)); targ->file = strdup(gn->name); targ->suff = (Suff *)Lst_Datum(ln); + targ->suff->refCount++; targ->node = gn; targ->parent = (Src *)NULL; targ->children = 0; +#ifdef DEBUG_SRC + targ->cp = Lst_Init(FALSE); +#endif /* * Allocate room for the prefix, whose end is found by subtracting @@ -1741,18 +1896,35 @@ SuffFindNormalDeps(gn) */ if (Lst_IsEmpty(targs) && suffNull != NULL) { if (DEBUG(SUFF)) { - printf("\tNo known suffix on %s. Using .NULL suffix\n", gn->name); + printf("\tNo known suffix on %s. Using .NULL suffix: ", gn->name); } - targ = (Src *)emalloc(sizeof(Src)); + targ = (Src *)emalloc(sizeof (Src)); targ->file = strdup(gn->name); targ->suff = suffNull; + targ->suff->refCount++; targ->node = gn; targ->parent = (Src *)NULL; targ->children = 0; targ->pref = strdup(sopref); +#ifdef DEBUG_SRC + targ->cp = Lst_Init(FALSE); +#endif + + /* + * Only use the default suffix rules if we don't have commands + * or dependencies defined for this gnode + */ + if (Lst_IsEmpty(gn->commands) && Lst_IsEmpty(gn->children)) + SuffAddLevel(srcs, targ); + else { + if (DEBUG(SUFF)) + printf("not "); + } + + if (DEBUG(SUFF)) + printf("adding suffix rules\n"); - SuffAddLevel(srcs, targ); (void)Lst_AtEnd(targs, (ClientData)targ); } @@ -1760,7 +1932,7 @@ SuffFindNormalDeps(gn) * Using the list of possible sources built up from the target suffix(es), * try and find an existing file/target that matches. */ - bottom = SuffFindThem(srcs); + bottom = SuffFindThem(srcs, slst); if (bottom == (Src *)NULL) { /* @@ -1826,7 +1998,10 @@ sfnd_abort: int len = strlen(gn->path); char savec; + if (gn->suffix) + gn->suffix->refCount--; gn->suffix = targ->suff; + gn->suffix->refCount++; savec = gn->path[len-targ->suff->nameLen]; gn->path[len-targ->suff->nameLen] = '\0'; @@ -1839,6 +2014,8 @@ sfnd_abort: * The .PREFIX gets the full path if the target has * no known suffix. */ + if (gn->suffix) + gn->suffix->refCount--; gn->suffix = NULL; Var_Set(PREFIX, gn->path, gn); @@ -1850,8 +2027,14 @@ sfnd_abort: * path to be the name so Dir_MTime won't go grovelling for * it. */ + if (gn->suffix) + gn->suffix->refCount--; gn->suffix = (targ == NULL) ? NULL : targ->suff; - gn->path = gn->name; + if (gn->suffix) + gn->suffix->refCount++; + if (gn->path != NULL) + free(gn->path); + gn->path = strdup(gn->name); } goto sfnd_return; @@ -1869,7 +2052,7 @@ sfnd_abort: * Check for overriding transformation rule implied by sources */ if (!Lst_IsEmpty(gn->children)) { - src = SuffFindCmds(targ); + src = SuffFindCmds(targ, slst); if (src != (Src *)NULL) { /* @@ -1877,10 +2060,10 @@ sfnd_abort: * up to, but not including, the parent node. */ while (bottom && bottom->parent != NULL) { - Src *p = bottom->parent; - - SuffFreeSrc(bottom); - bottom = p; + if (Lst_Member(slst, (ClientData) bottom) == NILLNODE) { + Lst_AtEnd(slst, (ClientData) bottom); + } + bottom = bottom->parent; } bottom = src; } @@ -1912,7 +2095,10 @@ sfnd_abort: for (src = bottom; src->parent != (Src *)NULL; src = src->parent) { targ = src->parent; + if (src->node->suffix) + src->node->suffix->refCount--; src->node->suffix = src->suff; + src->node->suffix->refCount++; if (targ->node == NILGNODE) { targ->node = Targ_FindNode(targ->file, TARG_CREATE); @@ -1939,28 +2125,35 @@ sfnd_abort: } } + if (gn->suffix) + gn->suffix->refCount--; gn->suffix = src->suff; + gn->suffix->refCount++; /* * So Dir_MTime doesn't go questing for it... */ - gn->path = gn->name; + if (gn->path) + free(gn->path); + gn->path = strdup(gn->name); /* * Nuke the transformation path and the Src structures left over in the * two lists. */ - SuffFreeSrc(bottom); - sfnd_return: - Lst_Destroy(srcs, SuffFreeSrc); - Lst_Destroy(targs, SuffFreeSrc); + if (bottom) + if (Lst_Member(slst, (ClientData) bottom) == NILLNODE) + Lst_AtEnd(slst, (ClientData) bottom); + + while (SuffRemoveSrc(srcs) || SuffRemoveSrc(targs)) + continue; + Lst_Concat(slst, srcs, LST_CONCLINK); + Lst_Concat(slst, targs, LST_CONCLINK); } - - /*- *----------------------------------------------------------------------- * Suff_FindDeps -- @@ -1988,9 +2181,22 @@ sfnd_return: * *----------------------------------------------------------------------- */ + void -Suff_FindDeps (gn) +Suff_FindDeps(gn) + GNode *gn; +{ + + SuffFindDeps(gn, srclist); + while (SuffRemoveSrc(srclist)) + continue; +} + + +static void +SuffFindDeps (gn, slst) GNode *gn; /* node we're dealing with */ + Lst slst; { if (gn->type & OP_DEPS_FOUND) { /* @@ -2002,11 +2208,11 @@ Suff_FindDeps (gn) } if (DEBUG(SUFF)) { - printf ("Suff_FindDeps (%s)\n", gn->name); + printf ("SuffFindDeps (%s)\n", gn->name); } if (gn->type & OP_ARCHV) { - SuffFindArchiveDeps(gn); + SuffFindArchiveDeps(gn, slst); } else if (gn->type & OP_LIB) { /* * If the node is a library, it is the arch module's job to find it @@ -2020,8 +2226,11 @@ Suff_FindDeps (gn) Suff *s; ln = Lst_Find (sufflist, (ClientData)LIBSUFF, SuffSuffHasNameP); + if (gn->suffix) + gn->suffix->refCount--; if (ln != NILLNODE) { gn->suffix = s = (Suff *) Lst_Datum (ln); + gn->suffix->refCount++; Arch_FindLib (gn, s->searchPath); } else { gn->suffix = NULL; @@ -2034,7 +2243,7 @@ Suff_FindDeps (gn) */ Var_Set(PREFIX, "", gn); } else { - SuffFindNormalDeps(gn); + SuffFindNormalDeps(gn, slst); } } @@ -2095,6 +2304,8 @@ void Suff_Init () { sufflist = Lst_Init (FALSE); + suffClean = Lst_Init(FALSE); + srclist = Lst_Init (FALSE); transforms = Lst_Init (FALSE); sNum = 0; @@ -2111,54 +2322,59 @@ Suff_Init () Dir_Concat(suffNull->searchPath, dirSearchPath); suffNull->children = Lst_Init (FALSE); suffNull->parents = Lst_Init (FALSE); + suffNull->ref = Lst_Init (FALSE); suffNull->sNum = sNum++; suffNull->flags = SUFF_NULL; + suffNull->refCount = 1; } /*- - *----------------------------------------------------------------------- - * SuffCopy -- - * Create a copy of the source suffix. - * Currently does not copy children or parents + *---------------------------------------------------------------------- + * Suff_End -- + * Cleanup the this module * * Results: - * a new suffix is returned + * None * * Side Effects: - * none - *----------------------------------------------------------------------- + * The memory is free'd. + *---------------------------------------------------------------------- */ -static Suff * -SuffCopy(s) - Suff *s; + +void +Suff_End() { - Suff *n = (Suff *) emalloc (sizeof (Suff)); - n->name = strdup (s->name); - n->nameLen = s->nameLen; - n->searchPath = Lst_Init (FALSE); - Dir_Concat(suffNull->searchPath, s->searchPath); - n->children = Lst_Init (FALSE); - n->parents = Lst_Init (FALSE); - n->sNum = s->sNum; - n->flags = s->flags; - return n; + Lst_Destroy(sufflist, SuffFree); + Lst_Destroy(suffClean, SuffFree); + if (suffNull) + SuffFree(suffNull); + Lst_Destroy(srclist, NOFREE); + Lst_Destroy(transforms, NOFREE); } /********************* DEBUGGING FUNCTIONS **********************/ -static int SuffPrintName(s) Suff *s; {printf ("%s ", s->name); return (0);} +static int SuffPrintName(s, dummy) + ClientData s; + ClientData dummy; +{ + printf ("%s ", ((Suff *) s)->name); + return (dummy ? 0 : 0); +} static int -SuffPrintSuff (s) - Suff *s; +SuffPrintSuff (sp, dummy) + ClientData sp; + ClientData dummy; { + Suff *s = (Suff *) sp; int flags; int flag; - printf ("# `%s'", s->name); + printf ("# `%s' [%d] ", s->name, s->refCount); flags = s->flags; if (flags) { @@ -2190,21 +2406,22 @@ SuffPrintSuff (s) printf ("#\tSearch Path: "); Dir_PrintPath (s->searchPath); fputc ('\n', stdout); - return (0); + return (dummy ? 0 : 0); } static int -SuffPrintTrans (t) - GNode *t; +SuffPrintTrans (tp, dummy) + ClientData tp; + ClientData dummy; { - extern int Targ_PrintCmd(); + GNode *t = (GNode *) tp; printf ("%-16s: ", t->name); Targ_PrintType (t->type); fputc ('\n', stdout); Lst_ForEach (t->commands, Targ_PrintCmd, (ClientData)0); fputc ('\n', stdout); - return(0); + return(dummy ? 0 : 0); } void diff --git a/usr.bin/make/targ.c b/usr.bin/make/targ.c index 7e1475a..49aedbd 100644 --- a/usr.bin/make/targ.c +++ b/usr.bin/make/targ.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)targ.c 8.2 (Berkeley) 3/19/94"; +static char sccsid[] = "@(#)targ.c 8.3 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -49,6 +49,8 @@ static char sccsid[] = "@(#)targ.c 8.2 (Berkeley) 3/19/94"; * Interface: * Targ_Init Initialization procedure. * + * Targ_End Cleanup the module + * * 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 @@ -86,10 +88,16 @@ static char sccsid[] = "@(#)targ.c 8.2 (Berkeley) 3/19/94"; #include "dir.h" static Lst allTargets; /* the list of all targets found so far */ +static Lst allGNs; /* List of all the GNodes */ static Hash_Table targets; /* a hash table of same */ #define HTSIZE 191 /* initial size of hash table */ +static int TargPrintOnlySrc __P((ClientData, ClientData)); +static int TargPrintName __P((ClientData, ClientData)); +static int TargPrintNode __P((ClientData, ClientData)); +static void TargFreeGN __P((ClientData)); + /*- *----------------------------------------------------------------------- * Targ_Init -- @@ -111,6 +119,27 @@ Targ_Init () /*- *----------------------------------------------------------------------- + * Targ_End -- + * Finalize this module + * + * Results: + * None + * + * Side Effects: + * All lists and gnodes are cleared + *----------------------------------------------------------------------- + */ +void +Targ_End () +{ + Lst_Destroy(allTargets, NOFREE); + if (allGNs) + Lst_Destroy(allGNs, TargFreeGN); + Hash_DeleteTable(&targets); +} + +/*- + *----------------------------------------------------------------------- * Targ_NewGN -- * Create and initialize a new graph node * @@ -119,7 +148,7 @@ Targ_Init () * of the passed name * * Side Effects: - * None. + * The gnode is added to the list of all gnodes. *----------------------------------------------------------------------- */ GNode * @@ -145,17 +174,56 @@ Targ_NewGN (name) 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->successors = Lst_Init (FALSE); + gn->preds = Lst_Init (FALSE); gn->context = Lst_Init (FALSE); gn->commands = Lst_Init (FALSE); gn->suffix = NULL; + if (allGNs == NULL) + allGNs = Lst_Init(FALSE); + Lst_AtEnd(allGNs, (ClientData) gn); + return (gn); } /*- *----------------------------------------------------------------------- + * TargFreeGN -- + * Destroy a GNode + * + * Results: + * None. + * + * Side Effects: + * None. + *----------------------------------------------------------------------- + */ +static void +TargFreeGN (gnp) + ClientData gnp; +{ + GNode *gn = (GNode *) gnp; + + + free(gn->name); + if (gn->path) + free(gn->path); + + Lst_Destroy(gn->iParents, NOFREE); + Lst_Destroy(gn->cohorts, NOFREE); + Lst_Destroy(gn->parents, NOFREE); + Lst_Destroy(gn->children, NOFREE); + Lst_Destroy(gn->successors, NOFREE); + Lst_Destroy(gn->preds, NOFREE); + Lst_Destroy(gn->context, NOFREE); + Lst_Destroy(gn->commands, NOFREE); + free((Address)gn); +} + + +/*- + *----------------------------------------------------------------------- * Targ_FindNode -- * Find a node in the list using the given name for matching * @@ -343,11 +411,11 @@ Targ_SetMain (gn) } static int -/*ARGSUSED*/ -TargPrintName (gn, ppath) - GNode *gn; - int ppath; +TargPrintName (gnp, ppath) + ClientData gnp; + ClientData ppath; { + GNode *gn = (GNode *) gnp; printf ("%s ", gn->name); #ifdef notdef if (ppath) { @@ -359,16 +427,17 @@ TargPrintName (gn, ppath) } } #endif /* notdef */ - return (0); + return (ppath ? 0 : 0); } int -Targ_PrintCmd (cmd) - char *cmd; +Targ_PrintCmd (cmd, dummy) + ClientData cmd; + ClientData dummy; { - printf ("\t%s\n", cmd); - return (0); + printf ("\t%s\n", (char *) cmd); + return (dummy ? 0 : 0); } /*- @@ -462,10 +531,12 @@ Targ_PrintType (type) *----------------------------------------------------------------------- */ static int -TargPrintNode (gn, pass) - GNode *gn; - int pass; +TargPrintNode (gnp, passp) + ClientData gnp; + ClientData passp; { + GNode *gn = (GNode *) gnp; + int pass = *(int *) passp; if (!OP_NOP(gn->type)) { printf("#\n"); if (gn == mainTarg) { @@ -522,7 +593,7 @@ TargPrintNode (gn, pass) Lst_ForEach (gn->commands, Targ_PrintCmd, (ClientData)0); printf("\n\n"); if (gn->type & OP_DOUBLEDEP) { - Lst_ForEach (gn->cohorts, TargPrintNode, (ClientData)pass); + Lst_ForEach (gn->cohorts, TargPrintNode, (ClientData)&pass); } } return (0); @@ -542,14 +613,15 @@ TargPrintNode (gn, pass) *----------------------------------------------------------------------- */ static int -TargPrintOnlySrc(gn) - GNode *gn; +TargPrintOnlySrc(gnp, dummy) + ClientData gnp; + ClientData dummy; { - if (OP_NOP(gn->type)) { - printf("#\t%s [%s]\n", gn->name, - gn->path ? gn->path : gn->name); - } - return (0); + GNode *gn = (GNode *) gnp; + if (OP_NOP(gn->type)) + printf("#\t%s [%s]\n", gn->name, gn->path ? gn->path : gn->name); + + return (dummy ? 0 : 0); } /*- @@ -570,10 +642,10 @@ Targ_PrintGraph (pass) * 2 => processing done */ { printf("#*** Input graph:\n"); - Lst_ForEach (allTargets, TargPrintNode, (ClientData)pass); + Lst_ForEach (allTargets, TargPrintNode, (ClientData)&pass); printf("\n\n"); printf("#\n# Files that are only sources:\n"); - Lst_ForEach (allTargets, TargPrintOnlySrc); + Lst_ForEach (allTargets, TargPrintOnlySrc, (ClientData) 0); printf("#*** Global Variables:\n"); Var_Dump (VAR_GLOBAL); printf("#*** Command-line Variables:\n"); diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index fc50a0f..4d7b2e9 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -37,7 +37,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; +static char sccsid[] = "@(#)var.c 8.4 (Berkeley) 4/28/95"; #endif /* not lint */ /*- @@ -119,6 +119,8 @@ static char varNoError[] = ""; GNode *VAR_GLOBAL; /* variables from the makefile */ GNode *VAR_CMD; /* variables defined on the command-line */ +static Lst allVars; /* List of all variables */ + #define FIND_CMD 0x1 /* look in VAR_CMD when searching */ #define FIND_GLOBAL 0x2 /* look in VAR_GLOBAL as well */ #define FIND_ENV 0x4 /* look in the environment also */ @@ -148,19 +150,22 @@ typedef struct { #define VAR_NO_SUB 8 /* Substitution is non-global and already done */ } VarPattern; -static int VarCmp __P((Var *, char *)); +static int VarCmp __P((ClientData, ClientData)); static Var *VarFind __P((char *, GNode *, int)); static void VarAdd __P((char *, char *, GNode *)); -static Boolean VarHead __P((char *, Boolean, Buffer)); -static Boolean VarTail __P((char *, Boolean, Buffer)); -static Boolean VarSuffix __P((char *, Boolean, Buffer)); -static Boolean VarRoot __P((char *, Boolean, Buffer)); -static Boolean VarMatch __P((char *, Boolean, Buffer, char *)); -static Boolean VarSYSVMatch __P((char *, Boolean, Buffer, VarPattern *)); -static Boolean VarNoMatch __P((char *, Boolean, Buffer, char *)); -static Boolean VarSubstitute __P((char *, Boolean, Buffer, VarPattern *)); -static char *VarModify __P((char *, Boolean (*modProc )(), ClientData)); -static int VarPrintVar __P((Var *)); +static void VarDelete __P((ClientData)); +static Boolean VarHead __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarTail __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarSuffix __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarRoot __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarMatch __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarSYSVMatch __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarNoMatch __P((char *, Boolean, Buffer, ClientData)); +static Boolean VarSubstitute __P((char *, Boolean, Buffer, ClientData)); +static char *VarModify __P((char *, Boolean (*)(char *, Boolean, Buffer, + ClientData), + ClientData)); +static int VarPrintVar __P((ClientData, ClientData)); /*- *----------------------------------------------------------------------- @@ -177,10 +182,10 @@ static int VarPrintVar __P((Var *)); */ static int VarCmp (v, name) - Var *v; /* VAR structure to compare */ - char *name; /* name to look for */ + ClientData v; /* VAR structure to compare */ + ClientData name; /* name to look for */ { - return (strcmp (name, v->name)); + return (strcmp ((char *) name, ((Var *) v)->name)); } /*- @@ -217,7 +222,7 @@ VarFind (name, ctxt, flags) * and substitute the short version in for 'name' if it matches one of * them. */ - if (*name == '.' && isupper(name[1])) + if (*name == '.' && isupper((unsigned char) name[1])) switch (name[1]) { case 'A': if (!strcmp(name, ".ALLSRC")) @@ -265,15 +270,10 @@ VarFind (name, ctxt, flags) char *env; if ((env = getenv (name)) != NULL) { - /* - * If the variable is found in the environment, we only duplicate - * its value (since eVarVal was allocated on the stack). The name - * doesn't need duplication since it's always in the environment - */ int len; v = (Var *) emalloc(sizeof(Var)); - v->name = name; + v->name = strdup(name); len = strlen(env); @@ -335,11 +335,37 @@ VarAdd (name, val, ctxt) v->flags = 0; (void) Lst_AtFront (ctxt->context, (ClientData)v); + (void) Lst_AtEnd (allVars, (ClientData) v); if (DEBUG(VAR)) { printf("%s:%s = %s\n", ctxt->name, name, val); } } + +/*- + *----------------------------------------------------------------------- + * VarDelete -- + * Delete a variable and all the space associated with it. + * + * Results: + * None + * + * Side Effects: + * None + *----------------------------------------------------------------------- + */ +static void +VarDelete(vp) + ClientData vp; +{ + Var *v = (Var *) vp; + free(v->name); + Buf_Destroy(v->val, TRUE); + free((Address) v); +} + + + /*- *----------------------------------------------------------------------- * Var_Delete -- @@ -369,9 +395,9 @@ Var_Delete(name, ctxt) v = (Var *)Lst_Datum(ln); Lst_Remove(ctxt->context, ln); - Buf_Destroy(v->val, TRUE); - free(v->name); - free((char *)v); + ln = Lst_Member(allVars, v); + Lst_Remove(allVars, ln); + VarDelete((ClientData) v); } } @@ -510,6 +536,7 @@ Var_Exists(name, ctxt) if (v == (Var *)NIL) { return(FALSE); } else if (v->flags & VAR_FROM_ENV) { + free(v->name); Buf_Destroy(v->val, TRUE); free((char *)v); } @@ -529,15 +556,23 @@ Var_Exists(name, ctxt) *----------------------------------------------------------------------- */ char * -Var_Value (name, ctxt) +Var_Value (name, ctxt, frp) char *name; /* name to find */ GNode *ctxt; /* context in which to search for it */ + char **frp; { Var *v; v = VarFind (name, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); + *frp = NULL; if (v != (Var *) NIL) { - return ((char *)Buf_GetAll(v->val, (int *)NULL)); + char *p = ((char *)Buf_GetAll(v->val, (int *)NULL)); + if (v->flags & VAR_FROM_ENV) { + Buf_Destroy(v->val, FALSE); + free((Address) v); + *frp = p; + } + return p; } else { return ((char *) NULL); } @@ -559,11 +594,12 @@ Var_Value (name, ctxt) *----------------------------------------------------------------------- */ static Boolean -VarHead (word, addSpace, buf) +VarHead (word, addSpace, buf, dummy) char *word; /* Word to trim */ Boolean addSpace; /* True if need to add a space to the buffer * before sticking in the head */ Buffer buf; /* Buffer in which to store it */ + ClientData dummy; { register char *slash; @@ -585,8 +621,8 @@ VarHead (word, addSpace, buf) } else { Buf_AddByte(buf, (Byte)'.'); } - return(TRUE); } + return(dummy ? TRUE : TRUE); } /*- @@ -605,11 +641,12 @@ VarHead (word, addSpace, buf) *----------------------------------------------------------------------- */ static Boolean -VarTail (word, addSpace, buf) +VarTail (word, addSpace, buf, dummy) char *word; /* Word to trim */ Boolean addSpace; /* TRUE if need to stick a space in the * buffer before adding the tail */ Buffer buf; /* Buffer in which to store it */ + ClientData dummy; { register char *slash; @@ -625,7 +662,7 @@ VarTail (word, addSpace, buf) } else { Buf_AddBytes (buf, strlen(word), (Byte *)word); } - return (TRUE); + return (dummy ? TRUE : TRUE); } /*- @@ -643,11 +680,12 @@ VarTail (word, addSpace, buf) *----------------------------------------------------------------------- */ static Boolean -VarSuffix (word, addSpace, buf) +VarSuffix (word, addSpace, buf, dummy) char *word; /* Word to trim */ Boolean addSpace; /* TRUE if need to add a space before placing * the suffix in the buffer */ Buffer buf; /* Buffer in which to store it */ + ClientData dummy; { register char *dot; @@ -659,10 +697,9 @@ VarSuffix (word, addSpace, buf) *dot++ = '\0'; Buf_AddBytes (buf, strlen (dot), (Byte *)dot); dot[-1] = '.'; - return (TRUE); - } else { - return (addSpace); + addSpace = TRUE; } + return (dummy ? addSpace : addSpace); } /*- @@ -681,11 +718,12 @@ VarSuffix (word, addSpace, buf) *----------------------------------------------------------------------- */ static Boolean -VarRoot (word, addSpace, buf) +VarRoot (word, addSpace, buf, dummy) char *word; /* Word to trim */ Boolean addSpace; /* TRUE if need to add a space to the buffer * before placing the root in it */ Buffer buf; /* Buffer in which to store it */ + ClientData dummy; { register char *dot; @@ -701,7 +739,7 @@ VarRoot (word, addSpace, buf) } else { Buf_AddBytes (buf, strlen(word), (Byte *)word); } - return (TRUE); + return (dummy ? TRUE : TRUE); } /*- @@ -726,9 +764,9 @@ VarMatch (word, addSpace, buf, pattern) * buffer before adding the word, if it * matches */ Buffer buf; /* Buffer in which to store it */ - char *pattern; /* Pattern the word must match */ + ClientData pattern; /* Pattern the word must match */ { - if (Str_Match(word, pattern)) { + if (Str_Match(word, (char *) pattern)) { if (addSpace) { Buf_AddByte(buf, (Byte)' '); } @@ -757,16 +795,17 @@ VarMatch (word, addSpace, buf, pattern) *----------------------------------------------------------------------- */ static Boolean -VarSYSVMatch (word, addSpace, buf, pat) +VarSYSVMatch (word, addSpace, buf, patp) char *word; /* Word to examine */ Boolean addSpace; /* TRUE if need to add a space to the * buffer before adding the word, if it * matches */ Buffer buf; /* Buffer in which to store it */ - VarPattern *pat; /* Pattern the word must match */ + ClientData patp; /* Pattern the word must match */ { int len; char *ptr; + VarPattern *pat = (VarPattern *) patp; if (addSpace) Buf_AddByte(buf, (Byte)' '); @@ -804,9 +843,9 @@ VarNoMatch (word, addSpace, buf, pattern) * buffer before adding the word, if it * matches */ Buffer buf; /* Buffer in which to store it */ - char *pattern; /* Pattern the word must match */ + ClientData pattern; /* Pattern the word must match */ { - if (!Str_Match(word, pattern)) { + if (!Str_Match(word, (char *) pattern)) { if (addSpace) { Buf_AddByte(buf, (Byte)' '); } @@ -832,15 +871,16 @@ VarNoMatch (word, addSpace, buf, pattern) *----------------------------------------------------------------------- */ static Boolean -VarSubstitute (word, addSpace, buf, pattern) +VarSubstitute (word, addSpace, buf, patternp) char *word; /* Word to modify */ Boolean addSpace; /* True if space should be added before * other characters */ Buffer buf; /* Buffer for result */ - register VarPattern *pattern; /* Pattern for substitution */ + ClientData patternp; /* Pattern for substitution */ { register int wordLen; /* Length of word */ register char *cp; /* General pointer */ + VarPattern *pattern = (VarPattern *) patternp; wordLen = strlen(word); if ((pattern->flags & VAR_NO_SUB) == 0) { @@ -1010,53 +1050,29 @@ VarSubstitute (word, addSpace, buf, pattern) static char * VarModify (str, modProc, datum) char *str; /* String whose words should be trimmed */ - Boolean (*modProc)(); /* Function to use to modify them */ + /* Function to use to modify them */ + Boolean (*modProc) __P((char *, Boolean, Buffer, ClientData)); ClientData datum; /* Datum to pass it */ { Buffer buf; /* Buffer for the new string */ - register char *cp; /* Pointer to end of current word */ - char endc; /* Character that ended the word */ Boolean addSpace; /* TRUE if need to add a space to the * buffer before adding the trimmed * word */ - + char **av; /* word list [first word does not count] */ + int ac, i; + buf = Buf_Init (0); - cp = str; addSpace = FALSE; - - for (;;) { - /* - * Skip to next word and place cp at its end. - */ - while (isspace (*str)) { - str++; - } - for (cp = str; *cp != '\0' && !isspace (*cp); cp++) - continue; - if (cp == str) { - /* - * If we didn't go anywhere, we must be done! - */ - Buf_AddByte (buf, '\0'); - str = (char *)Buf_GetAll (buf, (int *)NULL); - Buf_Destroy (buf, FALSE); - return (str); - } - /* - * Nuke terminating character, but save it in endc b/c if str was - * some variable's value, it would not be good to screw it - * over... - */ - endc = *cp; - *cp = '\0'; - addSpace = (* modProc) (str, addSpace, buf, datum); + av = brk_string(str, &ac, FALSE); - if (endc) { - *cp++ = endc; - } - str = cp; - } + for (i = 1; i < ac; i++) + addSpace = (*modProc)(av[i], addSpace, buf, datum); + + Buf_AddByte (buf, '\0'); + str = (char *)Buf_GetAll (buf, (int *)NULL); + Buf_Destroy (buf, FALSE); + return (str); } /*- @@ -1094,6 +1110,10 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) Boolean haveModifier;/* TRUE if have modifiers for the variable */ register char endc; /* Ending character when variable in parens * or braces */ + register char startc; /* Starting character when variable in parens + * or braces */ + int cnt; /* Used to count brace pairs when variable in + * in parens or braces */ char *start; Boolean dynamic; /* TRUE if the variable is local and we're * expanding it in a non-local context. This @@ -1150,7 +1170,8 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) endc = str[1]; } } else { - endc = str[1] == '(' ? ')' : '}'; + startc = str[1]; + endc = startc == '(' ? ')' : '}'; /* * Skip to the end character or a colon, whichever comes first. @@ -1253,7 +1274,7 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) break; } } else if (((tstr-str) > 4) && (str[2] == '.') && - isupper(str[3]) && + isupper((unsigned char) str[3]) && ((ctxt == VAR_CMD) || (ctxt == VAR_GLOBAL))) { int len; @@ -1621,11 +1642,19 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) * to verify it is a SYSV-make-style translation: * it must be: <string1>=<string2>) */ - for (cp = tstr; *cp != '\0' && *cp != endc; cp++) { + cp = tstr; + cnt = 1; + while (*cp != '\0' && cnt) { if (*cp == '=') { eqFound = TRUE; /* continue looking for endc */ } + else if (*cp == endc) + cnt--; + else if (*cp == startc) + cnt++; + if (cnt) + cp++; } if (*cp == endc && eqFound) { @@ -1640,8 +1669,14 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) *cp++ = '\0'; pattern.rhs = cp; - while (*cp != endc) { - cp++; + cnt = 1; + while (cnt) { + if (*cp == endc) + cnt--; + else if (*cp == startc) + cnt++; + if (cnt) + cp++; } pattern.rightLen = cp - pattern.rhs; *cp = '\0'; @@ -1721,6 +1756,7 @@ Var_Parse (str, ctxt, err, lengthPtr, freePtr) free(str); } *freePtr = FALSE; + Buf_Destroy(v->val, TRUE); free((Address)v); if (dynamic) { str = emalloc(*lengthPtr + 1); @@ -1960,16 +1996,27 @@ Var_Init () { VAR_GLOBAL = Targ_NewGN ("Global"); VAR_CMD = Targ_NewGN ("Command"); + allVars = Lst_Init(FALSE); } + +void +Var_End () +{ + Lst_Destroy(allVars, VarDelete); +} + + /****************** PRINT DEBUGGING INFO *****************/ static int -VarPrintVar (v) - Var *v; +VarPrintVar (vp, dummy) + ClientData vp; + ClientData dummy; { + Var *v = (Var *) vp; printf ("%-16s = %s\n", v->name, (char *) Buf_GetAll(v->val, (int *)NULL)); - return (0); + return (dummy ? 0 : 0); } /*- @@ -1982,5 +2029,5 @@ void Var_Dump (ctxt) GNode *ctxt; { - Lst_ForEach (ctxt->context, VarPrintVar); + Lst_ForEach (ctxt->context, VarPrintVar, (ClientData) 0); } |