Research V7 development
authorS. I. Feldman <sif@research.uucp>
Fri, 23 Feb 1979 18:50:12 +0000 (13:50 -0500)
committerS. I. Feldman <sif@research.uucp>
Fri, 23 Feb 1979 18:50:12 +0000 (13:50 -0500)
Work on file usr/src/cmd/make/files.c

Synthesized-from: v7

usr/src/cmd/make/files.c [new file with mode: 0644]

diff --git a/usr/src/cmd/make/files.c b/usr/src/cmd/make/files.c
new file mode 100644 (file)
index 0000000..97db54a
--- /dev/null
@@ -0,0 +1,463 @@
+/* UNIX DEPENDENT PROCEDURES */
+
+
+/* DEFAULT RULES FOR UNIX */
+
+char *builtin[] =
+       {
+       ".SUFFIXES : .out .o .c .f .e .r .y .yr .ye .l .s",
+       "YACC=yacc",
+       "YACCR=yacc -r",
+       "YACCE=yacc -e",
+       "YFLAGS=",
+       "LEX=lex",
+       "LFLAGS=",
+       "CC=cc",
+#ifdef vax
+       "AS=as".
+#else
+       "AS=as -",
+#endif
+       "CFLAGS=",
+       "RC=f77",
+       "RFLAGS=",
+       "EC=f77",
+       "EFLAGS=",
+       "FFLAGS=",
+       "LOADLIBES=",
+
+       ".c.o :",
+       "\t$(CC) $(CFLAGS) -c $<",
+
+       ".e.o .r.o .f.o :",
+       "\t$(EC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
+
+       ".s.o :",
+       "\t$(AS) -o $@ $<",
+
+       ".y.o :",
+       "\t$(YACC) $(YFLAGS) $<",
+       "\t$(CC) $(CFLAGS) -c y.tab.c",
+       "\trm y.tab.c",
+       "\tmv y.tab.o $@",
+
+       ".yr.o:",
+       "\t$(YACCR) $(YFLAGS) $<",
+       "\t$(RC) $(RFLAGS) -c y.tab.r",
+       "\trm y.tab.r",
+       "\tmv y.tab.o $@",
+
+       ".ye.o :",
+       "\t$(YACCE) $(YFLAGS) $<",
+       "\t$(EC) $(RFLAGS) -c y.tab.e",
+       "\trm y.tab.e",
+       "\tmv y.tab.o $@",
+
+       ".l.o :",
+       "\t$(LEX) $(LFLAGS) $<",
+       "\t$(CC) $(CFLAGS) -c lex.yy.c",
+       "\trm lex.yy.c",
+       "\tmv lex.yy.o $@",
+
+       ".y.c :",
+       "\t$(YACC) $(YFLAGS) $<",
+       "\tmv y.tab.c $@",
+
+       ".l.c :",
+       "\t$(LEX) $<",
+       "\tmv lex.yy.c $@",
+
+       ".yr.r:",
+       "\t$(YACCR) $(YFLAGS) $<",
+       "\tmv y.tab.r $@",
+
+       ".ye.e :",
+       "\t$(YACCE) $(YFLAGS) $<",
+       "\tmv y.tab.e $@",
+
+       ".s.out .c.out .o.out :",
+       "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",
+
+       ".f.out .r.out .e.out :",
+       "\t$(EC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",
+       "\t-rm $*.o",
+
+       ".y.out :",
+       "\t$(YACC) $(YFLAGS) $<",
+       "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@",
+       "\trm y.tab.c",
+
+       ".l.out :",
+       "\t$(LEX) $<",
+       "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",
+       "\trm lex.yy.c",
+
+       0 };
+\f
+#include "defs"
+#include <sys/types.h>
+
+
+TIMETYPE exists(filename)
+char *filename;
+{
+#include <sys/stat.h>
+struct stat buf;
+register char *s;
+TIMETYPE lookarch();
+
+for(s = filename ; *s!='\0' && *s!='(' ; ++s)
+       ;
+
+if(*s == '(')
+       return(lookarch(filename));
+
+if(stat(filename,&buf) < 0) 
+       return(0);
+else   return(buf.st_mtime);
+}
+
+
+TIMETYPE prestime()
+{
+TIMETYPE t;
+time(&t);
+return(t);
+}
+
+\f
+
+#include <sys/dir.h>
+FSTATIC char n15[15];
+FSTATIC char *n15end   = &n15[14];
+
+
+
+struct depblock *srchdir(pat, mkchain, nextdbl)
+register char *pat; /* pattern to be matched in directory */
+int mkchain;  /* nonzero if results to be remembered */
+struct depblock *nextdbl;  /* final value for chain */
+{
+FILE * dirf;
+int i, nread;
+char *dirname, *dirpref, *endir, *filepat, *p, temp[100];
+char fullname[100], *p1, *p2;
+struct nameblock *q;
+struct depblock *thisdbl;
+struct opendir *od;
+struct pattern *patp;
+
+struct direct entry[32];
+
+
+thisdbl = 0;
+
+if(mkchain == NO)
+       for(patp=firstpat ; patp ; patp = patp->nxtpattern)
+               if(! unequal(pat, patp->patval)) return(0);
+
+patp = ALLOC(pattern);
+patp->nxtpattern = firstpat;
+firstpat = patp;
+patp->patval = copys(pat);
+
+endir = 0;
+
+for(p=pat; *p!='\0'; ++p)
+       if(*p=='/') endir = p;
+
+if(endir==0)
+       {
+       dirname = ".";
+       dirpref = "";
+       filepat = pat;
+       }
+else   {
+       dirname = pat;
+       *endir = '\0';
+       dirpref = concat(dirname, "/", temp);
+       filepat = endir+1;
+       }
+
+dirf = NULL;
+
+for(od = firstod ; od; od = od->nxtopendir)
+       if(! unequal(dirname, od->dirn) )
+               {
+               dirf = od->dirfc;
+               fseek(dirf,0L,0); /* start over at the beginning  */
+               break;
+               }
+
+if(dirf == NULL)
+       {
+       dirf = fopen(dirname, "r");
+       od = ALLOC(opendir);
+       od->nxtopendir = firstod;
+       firstod = od;
+       od->dirfc = dirf;
+       od->dirn = copys(dirname);
+       }
+
+if(dirf == NULL)
+       {
+       fprintf(stderr, "Directory %s: ", dirname);
+       fatal("Cannot open");
+       }
+
+else do
+       {
+       nread = fread( (char *) &entry[0], sizeof(struct direct), 32, dirf) ;
+       for(i=0; i<nread; ++i)
+               if(entry[i].d_ino!= 0)
+                       {
+                       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;
+                                       }
+                               }
+                       }
+
+       } while(nread==32);
+
+if(endir != 0)  *endir = '/';
+
+return(thisdbl);
+}
+\f
+/* stolen from glob through find */
+
+static amatch(s, p)
+char *s, *p;
+{
+       register int cc, scc, k;
+       int c, lc;
+
+       scc = *s;
+       lc = 077777;
+       switch (c = *p) {
+
+       case '[':
+               k = 0;
+               while (cc = *++p) {
+                       switch (cc) {
+
+                       case ']':
+                               if (k)
+                                       return(amatch(++s, ++p));
+                               else
+                                       return(0);
+
+                       case '-':
+                               k |= (lc <= scc)  & (scc <= (cc=p[1]) ) ;
+                       }
+                       if (scc==(lc=cc)) k++;
+               }
+               return(0);
+
+       case '?':
+       caseq:
+               if(scc) return(amatch(++s, ++p));
+               return(0);
+       case '*':
+               return(umatch(s, ++p));
+       case 0:
+               return(!scc);
+       }
+       if (c==scc) goto caseq;
+       return(0);
+}
+
+static umatch(s, p)
+char *s, *p;
+{
+       if(*p==0) return(1);
+       while(*s)
+               if (amatch(s++,p)) return(1);
+       return(0);
+}
+\f
+#ifdef METERFILE
+#include <pwd.h>
+int meteron    = 0;    /* default: metering off */
+
+meter(file)
+char *file;
+{
+TIMETYPE tvec;
+char *p, *ctime();
+FILE * mout;
+struct passwd *pwd, *getpwuid();
+
+if(file==0 || meteron==0) return;
+
+pwd = getpwuid(getuid());
+
+time(&tvec);
+
+if( (mout=fopen(file,"a")) != NULL )
+       {
+       p = ctime(&tvec);
+       p[16] = '\0';
+       fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);
+       fclose(mout);
+       }
+}
+#endif
+\f
+
+/* look inside archives for notations a(b) and a((b))
+       a(b)    is file member   b   in archive a
+       a((b))  is entry point  _b  in object archive a
+*/
+#include <ar.h>
+#include <a.out.h>
+
+static struct ar_hdr arhead;
+FILE *arfd;
+long int arpos, arlen;
+
+static struct exec objhead;
+
+static struct nlist objentry;
+
+
+TIMETYPE lookarch(filename)
+char *filename;
+{
+char *p, *q, *send, s[15];
+int i, nc, nsym, objarch;
+
+for(p = filename; *p!= '(' ; ++p)
+       ;
+*p = '\0';
+openarch(filename);
+*p++ = '(';
+
+if(*p == '(')
+       {
+       objarch = YES;
+       nc = 8;
+       ++p;
+       }
+else
+       {
+       objarch = NO;
+       nc = 14;
+       }
+send = s + nc;
+
+for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )
+       ;
+while(q < send)
+       *q++ = '\0';
+while(getarch())
+       {
+       if(objarch)
+               {
+               getobj();
+               nsym = objhead.a_syms / sizeof(objentry);
+               for(i = 0; i<nsym ; ++i)
+                       {
+                       fread( (char *) &objentry, sizeof(objentry),1,arfd);
+                       if( (objentry.n_type & N_EXT)
+                          && ((objentry.n_type & ~N_EXT) || objentry.n_value)
+                          && eqstr(objentry.n_name,s,nc))
+                               {
+                               clarch();
+                               return(arhead.ar_date);
+                               }
+                       }
+               }
+
+       else if( eqstr(arhead.ar_name, s, nc))
+               {
+               clarch();
+               return( arhead.ar_date);
+               }
+       }
+
+clarch();
+return( 0L);
+}
+
+
+clarch()
+{
+fclose( arfd );
+}
+
+
+openarch(f)
+register char *f;
+{
+int word;
+#include <sys/stat.h>
+struct stat buf;
+
+stat(f, &buf);
+arlen = buf.st_size;
+
+arfd = fopen(f, "r");
+if(arfd == NULL)
+       fatal1("cannot open %s", f);
+fread( (char *) &word, sizeof(word), 1, arfd);
+if(word != ARMAG)
+       fatal1("%s is not an archive", f);
+arpos = 0;
+arhead.ar_size = 2 - sizeof(arhead);
+}
+
+
+
+getarch()
+{
+arpos += sizeof(arhead);
+arpos += (arhead.ar_size + 1 ) & ~1L;
+if(arpos >= arlen)
+       return(0);
+fseek(arfd, arpos, 0);
+fread( (char *) &arhead, sizeof(arhead), 1, arfd);
+return(1);
+}
+
+
+getobj()
+{
+long int skip;
+
+fread( (char *) &objhead, sizeof(objhead), 1, arfd);
+if( objhead.a_magic != A_MAGIC1 &&
+    objhead.a_magic != A_MAGIC2 &&
+    objhead.a_magic != A_MAGIC3 &&
+    objhead.a_magic != A_MAGIC4 )
+               fatal1("%s is not an object module", arhead.ar_name);
+skip = objhead.a_text + objhead.a_data;
+if(! objhead.a_flag )
+       skip *= 2;
+fseek(arfd, skip, 1);
+}
+
+
+eqstr(a,b,n)
+register char *a, *b;
+int n;
+{
+register int i;
+for(i = 0 ; i < n ; ++i)
+       if(*a++ != *b++)
+               return(NO);
+return(YES);
+}