From: S. I. Feldman Date: Fri, 23 Feb 1979 18:50:12 +0000 (-0500) Subject: Research V7 development X-Git-Tag: Bell-32V^2~136 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/f05fe1d7943658a62dada0d7bc48cf76314bdf2e?ds=inline Research V7 development Work on file usr/src/cmd/make/files.c Synthesized-from: v7 --- diff --git a/usr/src/cmd/make/files.c b/usr/src/cmd/make/files.c new file mode 100644 index 0000000000..97db54a9dc --- /dev/null +++ b/usr/src/cmd/make/files.c @@ -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 }; + +#include "defs" +#include + + +TIMETYPE exists(filename) +char *filename; +{ +#include +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); +} + + + +#include +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; inxtdepblock = nextdbl; + thisdbl->depname = q; + nextdbl = thisdbl; + } + } + } + + } while(nread==32); + +if(endir != 0) *endir = '/'; + +return(thisdbl); +} + +/* 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); +} + +#ifdef METERFILE +#include +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 + + +/* 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 +#include + +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 +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); +}