BSD 4_3_Reno release
[unix-history] / usr / src / old / make / files.c
index 40f4c16..cb1d6a8 100644 (file)
@@ -1,4 +1,6 @@
-static char *sccsid = "@(#)files.c     4.6 (Berkeley) 83/02/09";
+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",
-#if defined(vax) || defined(sun)
+       "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,18 +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/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,7 +181,16 @@ if(*s == '(')
        return(lookarch(filename));
 
 if (stat(filename, &buf) < 0)
        return(lookarch(filename));
 
 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);
 }
 
@@ -175,14 +217,15 @@ struct depblock *nextdbl;  /* final value for chain */
 DIR *dirf;
 register int i;
 int nread, cldir;
 DIR *dirf;
 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 dirhdr *od;
 struct pattern *patp;
 struct nameblock *q;
 struct depblock *thisdbl;
 struct dirhdr *od;
 struct pattern *patp;
-
-struct direct *dptr;
+struct varblock *cp, *varptr();
+char *path, pth[BUFSIZ], *strcpy();
+struct dirent *dptr;
 
 
 thisdbl = 0;
 
 
 thisdbl = 0;
@@ -203,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;
 
@@ -238,6 +296,7 @@ if(dirf == NULL)
                firstod = od;
                od->dirfc = dirf;
                od->dirn = copys(dirname);
                firstod = od;
                od->dirfc = dirf;
                od->dirn = copys(dirname);
+               fcntl(dirfd(dirf), F_SETFD, 1);
                }
        }
 
                }
        }
 
@@ -274,6 +333,7 @@ if(cldir) {
        closedir(dirf);
        dirf = NULL;
 }
        closedir(dirf);
        dirf = NULL;
 }
+} /* End of VPATH loop */
 return(thisdbl);
 }
 \f
 return(thisdbl);
 }
 \f
@@ -513,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;
-#if defined(vax) || defined(sun)
+#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 )
@@ -533,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';
+}