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}