/* 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); }