BSD 4_3_Reno release
[unix-history] / usr / src / old / make / files.c
index d520042..cb1d6a8 100644 (file)
@@ -1,4 +1,6 @@
-static char *sccsid = "@(#)files.c     4.2 (Berkeley) 81/02/28";
+static char *sccsid = "@(#)files.c     4.20 (Berkeley) 90/02/20";
+#include <fcntl.h>
+
 /* UNIX DEPENDENT PROCEDURES */
 
 
 /* UNIX DEPENDENT PROCEDURES */
 
 
@@ -9,7 +11,7 @@ char *builtin[] =
 #ifdef pwb
        ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl",
 #else
 #ifdef pwb
        ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl",
 #else
-       ".SUFFIXES : .out .o .c .f .e .r .y .yr .ye .l .s .cl .p",
+       ".SUFFIXES : .out .o .c .F .f .e .r .y .yr .ye .l .s .cl .p .8 .7 .6 .5 .4 .3 .2 .1 .0",
 #endif
        "YACC=yacc",
        "YACCR=yacc -r",
 #endif
        "YACC=yacc",
        "YACCR=yacc -r",
@@ -18,7 +20,8 @@ char *builtin[] =
        "LEX=lex",
        "LFLAGS=",
        "CC=cc",
        "LEX=lex",
        "LFLAGS=",
        "CC=cc",
-#ifdef vax
+       "CPP=cpp",
+#if defined(vax) || defined(sun) || defined(tahoe)
        "AS=as",
 #else
        "AS=as -",
        "AS=as",
 #else
        "AS=as -",
@@ -32,6 +35,7 @@ char *builtin[] =
        "EFLAGS=",
        "FFLAGS=",
        "LOADLIBES=",
        "EFLAGS=",
        "FFLAGS=",
        "LOADLIBES=",
+       "NROFF=nroff",
 #ifdef pwb
        "SCOMP=scomp",
        "SCFLAGS=",
 #ifdef pwb
        "SCOMP=scomp",
        "SCFLAGS=",
@@ -48,7 +52,7 @@ char *builtin[] =
        ".cl.o :",
        "\tclass -c $<",
 
        ".cl.o :",
        "\tclass -c $<",
 
-       ".e.o .r.o .f.o :",
+       ".e.o .r.o .F.o .f.o :",
        "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
 
        ".s.o :",
        "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
 
        ".s.o :",
@@ -114,7 +118,7 @@ char *builtin[] =
        ".s.out .c.out .o.out :",
        "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",
 
        ".s.out .c.out .o.out :",
        "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",
 
-       ".f.out .r.out .e.out :",
+       ".f.out .F.out .r.out .e.out :",
        "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",
        "\t-rm $*.o",
 
        "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",
        "\t-rm $*.o",
 
@@ -128,19 +132,47 @@ char *builtin[] =
        "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",
        "\trm lex.yy.c",
 
        "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",
        "\trm lex.yy.c",
 
+       ".8.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".7.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".6.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".5.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".4.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".3.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".2.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
+       ".1.0 :",
+       "\t$(NROFF) -man -h $< > $@",
+
        0 };
 \f
 #include "defs"
        0 };
 \f
 #include "defs"
-#include <sys/types.h>
+#include <sys/stat.h>
 
 
 
 
-TIMETYPE exists(filename)
-char *filename;
+
+TIMETYPE 
+exists(pname)
+struct nameblock *pname;
 {
 {
-#include <sys/stat.h>
 struct stat buf;
 struct stat buf;
-register char *s;
+register char *s, *filename;
 TIMETYPE lookarch();
 TIMETYPE lookarch();
+extern char *findfl();
+
+filename = pname->namep;
 
 for(s = filename ; *s!='\0' && *s!='(' ; ++s)
        ;
 
 for(s = filename ; *s!='\0' && *s!='(' ; ++s)
        ;
@@ -148,8 +180,17 @@ for(s = filename ; *s!='\0' && *s!='(' ; ++s)
 if(*s == '(')
        return(lookarch(filename));
 
 if(*s == '(')
        return(lookarch(filename));
 
-if(stat(filename,&buf) < 0) 
+if (stat(filename, &buf) < 0)
+{
+       s = findfl(filename);
+       if(s != (char *)-1)
+       {
+               pname->alias = copys(s);
+               if(stat(pname->alias, &buf) == 0)
+                       return(buf.st_mtime);
+       }
        return(0);
        return(0);
+}
 else   return(buf.st_mtime);
 }
 
 else   return(buf.st_mtime);
 }
 
@@ -163,9 +204,8 @@ return(t);
 
 \f
 
 
 \f
 
-#include <sys/dir.h>
-FSTATIC char n15[15];
-FSTATIC char *n15end   = &n15[14];
+FSTATIC char nbuf[MAXNAMLEN + 1];
+FSTATIC char *nbufend  = &nbuf[MAXNAMLEN];
 
 
 
 
 
 
@@ -174,17 +214,18 @@ register char *pat; /* pattern to be matched in directory */
 int mkchain;  /* nonzero if results to be remembered */
 struct depblock *nextdbl;  /* final value for chain */
 {
 int mkchain;  /* nonzero if results to be remembered */
 struct depblock *nextdbl;  /* final value for chain */
 {
-FILE * dirf;
+DIR *dirf;
 register int i;
 int nread, cldir;
 register int i;
 int nread, cldir;
-char *dirname, *dirpref, *endir, *filepat, *p, temp[100];
-char fullname[100], *p1, *p2;
+char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ];
+char fullname[BUFSIZ], *p1, *p2;
 struct nameblock *q;
 struct depblock *thisdbl;
 struct nameblock *q;
 struct depblock *thisdbl;
-struct opendir *od;
+struct dirhdr *od;
 struct pattern *patp;
 struct pattern *patp;
-
-struct direct entry[32];
+struct varblock *cp, *varptr();
+char *path, pth[BUFSIZ], *strcpy();
+struct dirent *dptr;
 
 
 thisdbl = 0;
 
 
 thisdbl = 0;
@@ -205,17 +246,32 @@ for(p=pat; *p!='\0'; ++p)
 
 if(endir==0)
        {
 
 if(endir==0)
        {
-       dirname = ".";
        dirpref = "";
        filepat = pat;
        dirpref = "";
        filepat = pat;
+       cp = varptr("VPATH");
+       if (cp->varval == NULL) path = ".";
+       else {
+              path = pth; 
+              *path = '\0';
+              if (strncmp(cp->varval, ".:", 2) != 0) strcpy(pth,".:");
+              strcat(pth, cp->varval);
+              }
        }
 else   {
        }
 else   {
-       dirname = pat;
        *endir = '\0';
        *endir = '\0';
-       dirpref = concat(dirname, "/", temp);
+       path = strcpy(pth, pat);
+       dirpref = concat(pat, "/", temp);
        filepat = endir+1;
        }
 
        filepat = endir+1;
        }
 
+while (*path) {                        /* Loop thru each VPATH directory */
+  dirname = path;
+  for (; *path; path++)
+    if (*path == ':') {
+      *path++ = '\0';
+      break;
+      }
+
 dirf = NULL;
 cldir = NO;
 
 dirf = NULL;
 cldir = NO;
 
@@ -223,22 +279,24 @@ for(od = firstod; od; od = od->nxtopendir)
        if(! unequal(dirname, od->dirn) )
                {
                dirf = od->dirfc;
        if(! unequal(dirname, od->dirn) )
                {
                dirf = od->dirfc;
-               fseek(dirf, 0L, 0); /* start over at the beginning  */
+               if (dirf != NULL)
+                       rewinddir(dirf); /* start over at the beginning  */
                break;
                }
 
 if(dirf == NULL)
        {
                break;
                }
 
 if(dirf == NULL)
        {
-       dirf = fopen(dirname, "r");
+       dirf = opendir(dirname);
        if(nopdir >= MAXDIR)
                cldir = YES;
        else    {
                ++nopdir;
        if(nopdir >= MAXDIR)
                cldir = YES;
        else    {
                ++nopdir;
-               od = ALLOC(opendir);
+               od = ALLOC(dirhdr);
                od->nxtopendir = firstod;
                firstod = od;
                od->dirfc = dirf;
                od->dirn = copys(dirname);
                od->nxtopendir = firstod;
                firstod = od;
                od->dirfc = dirf;
                od->dirn = copys(dirname);
+               fcntl(dirfd(dirf), F_SETFD, 1);
                }
        }
 
                }
        }
 
@@ -248,37 +306,34 @@ if(dirf == NULL)
        fatal("Cannot open");
        }
 
        fatal("Cannot open");
        }
 
-else do
+else for (dptr = readdir(dirf); dptr != NULL; dptr = readdir(dirf))
        {
        {
-       nread = fread( (char *) &entry[0], sizeof(struct direct), 32, dirf) ;
-       for(i=0; i<nread; ++i)
-               if(entry[i].d_ino!= 0)
+       p1 = dptr->d_name;
+       p2 = nbuf;
+       while( (p2<nbufend) && (*p2++ = *p1++)!='\0' )
+               /* void */;
+       if( amatch(nbuf,filepat) )
+               {
+               concat(dirpref,nbuf,fullname);
+               if( (q=srchname(fullname)) ==0)
+                       q = makename(copys(fullname));
+               if(mkchain)
                        {
                        {
-                       p1 = entry[i].d_name;
-                       p2 = n15;
-                       while( (p2<n15end) &&
-                         (*p2++ = *p1++)!='\0' );
-                       if( amatch(n15,filepat) )
-                               {
-                               concat(dirpref,n15,fullname);
-                               if( (q=srchname(fullname)) ==0)
-                                       q = makename(copys(fullname));
-                               if(mkchain)
-                                       {
-                                       thisdbl = ALLOC(depblock);
-                                       thisdbl->nxtdepblock = nextdbl;
-                                       thisdbl->depname = q;
-                                       nextdbl = thisdbl;
-                                       }
-                               }
+                       thisdbl = ALLOC(depblock);
+                       thisdbl->nxtdepblock = nextdbl;
+                       thisdbl->depname = q;
+                       nextdbl = thisdbl;
                        }
                        }
-
-       } while(nread==32);
+               }
+       }
 
 if(endir != 0)  *endir = '/';
 
 
 if(endir != 0)  *endir = '/';
 
-if(cldir)
-       fclose(dirf);
+if(cldir) {
+       closedir(dirf);
+       dirf = NULL;
+}
+} /* End of VPATH loop */
 return(thisdbl);
 }
 \f
 return(thisdbl);
 }
 \f
@@ -389,7 +444,7 @@ static struct nlist objentry;
 TIMETYPE lookarch(filename)
 char *filename;
 {
 TIMETYPE lookarch(filename)
 char *filename;
 {
-char *p, *q, *send, s[15];
+char *p, *q, *send, s[MAXNAMLEN + 1];
 int i, nc, nsym, objarch;
 
 for(p = filename; *p!= '(' ; ++p)
 int i, nc, nsym, objarch;
 
 for(p = filename; *p!= '(' ; ++p)
@@ -407,7 +462,7 @@ if(*p == '(')
 else
        {
        objarch = NO;
 else
        {
        objarch = NO;
-       nc = 14;
+       nc = MAXNAMLEN;
        }
 send = s + nc;
 
        }
 send = s + nc;
 
@@ -518,7 +573,7 @@ fread( (char *) &objhead, sizeof(objhead), 1, arfd);
 if (N_BADMAG(objhead))
        fatal1("%s is not an object module", arfname);
 skip = objhead.a_text + objhead.a_data;
 if (N_BADMAG(objhead))
        fatal1("%s is not an object module", arfname);
 skip = objhead.a_text + objhead.a_data;
-#ifdef vax
+#ifndef pdp11
 skip += objhead.a_trsize + objhead.a_drsize;
 #else
 if(! objhead.a_flag )
 skip += objhead.a_trsize + objhead.a_drsize;
 #else
 if(! objhead.a_flag )
@@ -538,3 +593,83 @@ for(i = 0 ; i < n ; ++i)
                return(NO);
 return(YES);
 }
                return(NO);
 return(YES);
 }
+
+
+/*
+ *     findfl(name)    (like execvp, but does path search and finds files)
+ */
+static char fname[128];
+
+char *execat();
+
+char *findfl(name)
+register char *name;
+{
+       register char *p;
+       register struct varblock *cp;
+       struct stat buf;
+       struct varblock *varptr();
+
+       for (p = name; *p; p++) 
+               if(*p == '/') return(name);
+
+       cp = varptr("VPATH");
+       if(cp->varval == NULL || *cp->varval == 0)
+               p = ":";
+       else
+               p = cp->varval;
+
+       do
+       {
+               p = execat(p, name, fname);
+               if(stat(fname,&buf) >= 0)
+                       return(fname);
+       } while (p);
+       return((char *)-1);
+}
+
+char *execat(s1, s2, si)
+register char *s1, *s2;
+char *si;
+{
+       register char *s;
+
+       s = si;
+       while (*s1 && *s1 != ':' && *s1 != '-')
+               *s++ = *s1++;
+       if (si != s)
+               *s++ = '/';
+       while (*s2)
+               *s++ = *s2++;
+       *s = '\0';
+       return(*s1? ++s1: 0);
+}
+
+
+/* copy s to d, changing file names to file aliases */
+fixname(s, d)
+char *s, *d;
+{
+       register char *r, *q;
+       struct nameblock *pn;
+       char name[BUFSIZ];
+
+       while (*s) {
+               if (isspace(*s)) *d++ = *s++;
+               else {
+                       r = name;
+                       while (*s) {
+                               if (isspace(*s)) break; 
+                               *r++ = *s++;
+                               }
+                       *r = '\0';
+               
+                       if (((pn = srchname(name)) != 0) && (pn->alias))
+                               q = pn->alias;
+                       else q = name;
+       
+                       while (*q) *d++ = *q++;
+                       }
+               }
+       *d = '\0';
+}