main files.c
  1/* UNIX DEPENDENT PROCEDURES */
  2
  3#include <sys/stat.h>
  4#include <dirent.h>
  5#include <stdlib.h>
  6
  7/* DEFAULT RULES FOR UNIX */
  8
  9char *builtin[] =
 10	{
 11	".SUFFIXES : .o .c .e .r .f .y .yr .ye .l .s .w .t .h .z .x",
 12	"YACC=yacc",
 13	"YACCR=yacc -r",
 14	"YACCE=yacc -e",
 15	"YFLAGS=",
 16	"LEX=lex",
 17	"LFLAGS=",
 18	"CC=cc",
 19	"AS=as -",
 20	"CFLAGS=",
 21	"RC=ec",
 22	"RFLAGS=",
 23	"EC=ec",
 24	"EFLAGS=",
 25	"FFLAGS=",
 26	"CAWK=awk -c -f",
 27	"SCOMP=scomp",
 28	"SCFLAGS=",
 29	"CMDICT=cmdict",
 30	"CMFLAGS=",
 31	".c.o :",
 32	"\t$(CC) $(CFLAGS) -c $<",
 33	".e.o .r.o .f.o :",
 34	"\t$(EC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
 35	".s.o :",
 36	"\t$(AS) -o $@ $<",
 37	".y.o :",
 38	"\t$(YACC) $(YFLAGS) $<",
 39	"\t$(CC) $(CFLAGS) -c y.tab.c",
 40	"\trm y.tab.c",
 41	"\tmv y.tab.o $@",
 42	".yr.o:",
 43	"\t$(YACCR) $(YFLAGS) $<",
 44	"\t$(RC) $(RFLAGS) -c -2 y.tab.r",
 45	"\trm y.tab.r",
 46	"\tmv y.tab.o $@",
 47	".ye.o :",
 48	"\t$(YACCE) $(YFLAGS) $<",
 49	"\t$(EC) $(RFLAGS) -c -2 y.tab.e",
 50	"\trm y.tab.e",
 51	"\tmv y.tab.o $@",
 52	".l.o :",
 53	"\t$(LEX) $(LFLAGS) $<",
 54	"\t$(CC) $(CFLAGS) -c lex.yy.c",
 55	"\trm lex.yy.c",
 56	"\tmv lex.yy.o $@",
 57	".y.c :",
 58	"\t$(YACC) $(YFLAGS) $<",
 59	"\tmv y.tab.c $@",
 60	".l.c :",
 61	"\t$(LEX) $<",
 62	"\tmv lex.yy.c $@",
 63	".yr.r:",
 64	"\t$(YACCR) $(YFLAGS) $<",
 65	"\tmv y.tab.r $@",
 66	".ye.e :",
 67	"\t$(YACCE) $(YFLAGS) $<",
 68	"\tmv y.tab.e $@",
 69	".w.c:",
 70	"\t$(CAWK) $<",
 71	"\tmv yy.awk.c $@",
 72	".w.o:",
 73	"\t$(CAWK) $<",
 74	"\t$(CC) $(CFLAGS) -c yy.awk.c",
 75	"\trm yy.awk.c",
 76	"\tmv yy.awk.o $@",
 77	".t.o:",
 78	"\t$(SCOMP) $(SCFLAGS) -c $<",
 79	".t.c:",
 80	"\t$(SCOMP) $(SCFLAGS) -t $<",
 81	".h.z .t.z:",
 82	"\t$(CMDICT) $(CMFLAGS) $<",
 83	".h.x .t.x:",
 84	"\t$(CMDICT) $(CMFLAGS) -x $<",
 85	0 };
 86
 87#include "defs"
 88
 89
 90TIMETYPE exists(filename)
 91char *filename;
 92{
 93struct stat buf;
 94
 95if(stat(filename,&buf) < 0)
 96	return(0);
 97else	return(buf.st_mtime);
 98}
 99
100
101TIMETYPE prestime()
102{
103return time(0);
104}
105
106
107
108struct depblock *srchdir(pat, mkchain, nextdbl)
109
110char *pat; /* pattern to be matched in directory */
111int mkchain;  /* nonzero if results to be remembered */
112struct depblock *nextdbl;  /* final value for chain */
113{
114DIR *dirf;
115struct dirent *entry;
116char *dirname, *dirpref, *endir, *filepat, *p, temp[100];
117char fullname[100], *copys();
118struct nameblock *q, *srchname(), *makename();
119struct depblock *thisdbl;
120struct pattern *patp;
121
122thisdbl = 0;
123
124if(mkchain == 0)
125	for(patp=firstpat ; patp!=0 ; patp = patp->nextp)
126		if(equals(pat, patp->patval)) return(0);
127
128patp = intalloc(sizeof(*patp));
129patp->nextp = firstpat;
130firstpat = patp;
131patp->patval = copys(pat);
132
133endir = 0;
134
135for(p=pat; *p!='\0'; ++p)
136	if(*p=='/') endir = p;
137
138if(endir==0)
139	{
140	dirname = ".";
141	dirpref = "";
142	filepat = pat;
143	}
144else	{
145	dirname = pat;
146	*endir = '\0';
147	dirpref = concat(dirname, "/", temp);
148	filepat = endir+1;
149	}
150
151dirf = opendir(dirname);
152
153if(dirf == NULL)
154	{
155	fprintf(stderr, "Directory %s: ", dirname);
156	fatal("Cannot open");
157	}
158
159while( (entry = readdir(dirf)) != NULL )
160	{
161	if(entry->d_ino == 0) continue;
162	if( amatch(entry->d_name, filepat) )
163		{
164		concat(dirpref, entry->d_name, fullname);
165		if( (q=srchname(fullname)) == 0)
166			q = makename(copys(fullname));
167		if(mkchain)
168			{
169			thisdbl = intalloc(sizeof(*thisdbl));
170			thisdbl->nextp = nextdbl;
171			thisdbl->depname = q;
172			nextdbl = thisdbl;
173			}
174		}
175	}
176
177closedir(dirf);
178
179if(endir != 0)  *endir = '/';
180
181return(thisdbl);
182}
183
184/* stolen from glob through find */
185
186amatch(s, p)
187char *s, *p;
188{
189	register int cc, scc, k;
190	int c, lc;
191
192	scc = *s;
193	lc = 077777;
194	switch (c = *p) {
195
196	case '[':
197		k = 0;
198		while (cc = *++p) {
199			switch (cc) {
200
201			case ']':
202				if (k)
203					return(amatch(++s, ++p));
204				else
205					return(0);
206
207			case '-':
208				k |= lc <= scc & scc <= (cc=p[1]);
209			}
210			if (scc==(lc=cc)) k++;
211		}
212		return(0);
213
214	case '?':
215	caseq:
216		if(scc) return(amatch(++s, ++p));
217		return(0);
218	case '*':
219		return(umatch(s, ++p));
220	case 0:
221		return(!scc);
222	}
223	if (c==scc) goto caseq;
224	return(0);
225}
226
227umatch(s, p)
228char *s, *p;
229{
230	if(*p==0) return(1);
231	while(*s)
232		if (amatch(s++,p)) return(1);
233	return(0);
234}