Research V7 development
[unix-history] / usr / src / cmd / make / misc.c
CommitLineData
af3c1387
F
1#include "defs"
2
3FSTATIC struct nameblock *hashtab[HASHSIZE];
4FSTATIC int nhashed = 0;
5
6
7/* simple linear hash. hash function is sum of
8 characters mod hash table size.
9*/
10hashloc(s)
11char *s;
12{
13register int i;
14register int hashval;
15register char *t;
16
17hashval = 0;
18
19for(t=s; *t!='\0' ; ++t)
20 hashval += *t;
21
22hashval %= HASHSIZE;
23
24for(i=hashval;
25 hashtab[i]!=0 && unequal(s,hashtab[i]->namep);
26 i = (i+1)%HASHSIZE ) ;
27
28return(i);
29}
30
31
32struct nameblock *srchname(s)
33char *s;
34{
35return( hashtab[hashloc(s)] );
36}
37
38
39
40struct nameblock *makename(s)
41char *s;
42{
43/* make a fresh copy of the string s */
44
45char *copys();
46register struct nameblock *p;
47
48if(nhashed++ > HASHSIZE-3)
49 fatal("Hash table overflow");
50
51p = ALLOC(nameblock);
52p->nxtnameblock = firstname;
53p->namep = copys(s);
54p->linep = 0;
55p->done = 0;
56p->septype = 0;
57p->modtime = 0;
58
59firstname = p;
60if(mainname == NULL)
61 if(s[0]!='.' || hasslash(s) )
62 mainname = p;
63
64hashtab[hashloc(s)] = p;
65
66return(p);
67}
68
69
70
71hasslash(s)
72char *s;
73{
74for( ; *s ; ++s)
75 if(*s == '/')
76 return(YES);
77return(NO);
78}
79\f
80
81
82char *copys(s)
83register char *s;
84{
85char *calloc();
86register char *t, *t0;
87
88if( (t = t0 = calloc( strlen(s)+1 , sizeof(char)) ) == NULL)
89 fatal("out of memory");
90while(*t++ = *s++)
91 ;
92return(t0);
93}
94
95
96
97char *concat(a,b,c) /* c = concatenation of a and b */
98register char *a,*b;
99char *c;
100{
101register char *t;
102t = c;
103
104while(*t = *a++) t++;
105while(*t++ = *b++);
106return(c);
107}
108
109
110
111suffix(a,b,p) /* is b the suffix of a? if so, set p = prefix */
112register char *a,*b,*p;
113{
114char *a0,*b0;
115a0 = a;
116b0 = b;
117
118while(*a++);
119while(*b++);
120
121if( (a-a0) < (b-b0) ) return(0);
122
123while(b>b0)
124 if(*--a != *--b) return(0);
125
126while(a0<a) *p++ = *a0++;
127*p = '\0';
128
129return(1);
130}
131
132
133
134
135
136
137int *ckalloc(n)
138register int n;
139{
140register int *p;
141
142if( p = (int *) calloc(1,n) )
143 return(p);
144
145fatal("out of memory");
146/* NOTREACHED */
147}
148\f
149/* copy string a into b, substituting for arguments */
150char *subst(a,b)
151register char *a,*b;
152{
153static depth = 0;
154register char *s;
155char vname[100];
156struct varblock *varptr(), *vbp;
157char closer;
158
159if(++depth > 100)
160 fatal("infinitely recursive macro?");
161if(a!=0) while(*a)
162 {
163 if(*a != '$') *b++ = *a++;
164 else if(*++a=='\0' || *a=='$')
165 *b++ = *a++;
166 else {
167 s = vname;
168 if( *a=='(' || *a=='{' )
169 {
170 closer = ( *a=='(' ? ')' : '}');
171 ++a;
172 while(*a == ' ') ++a;
173 while(*a!=' ' && *a!=closer && *a!='\0') *s++ = *a++;
174 while(*a!=closer && *a!='\0') ++a;
175 if(*a == closer) ++a;
176 }
177 else *s++ = *a++;
178
179 *s = '\0';
180 if( (vbp = varptr(vname)) ->varval != 0)
181 {
182 b = subst(vbp->varval, b);
183 vbp->used = YES;
184 }
185 }
186 }
187
188*b = '\0';
189--depth;
190return(b);
191}
192
193
194setvar(v,s)
195char *v, *s;
196{
197struct varblock *varptr(), *p;
198
199p = varptr(v);
200if(p->noreset == 0)
201 {
202 p->varval = s;
203 p->noreset = inarglist;
204 if(p->used && unequal(v,"@") && unequal(v,"*")
205 && unequal(v,"<") && unequal(v,"?") )
206 fprintf(stderr, "Warning: %s changed after being used\n",v);
207 }
208}
209
210
211eqsign(a) /*look for arguments with equal signs but not colons */
212char *a;
213{
214register char *s, *t;
215
216while(*a == ' ') ++a;
217for(s=a ; *s!='\0' && *s!=':' ; ++s)
218 if(*s == '=')
219 {
220 for(t = a ; *t!='=' && *t!=' ' && *t!='\t' ; ++t );
221 *t = '\0';
222
223 for(++s; *s==' ' || *s=='\t' ; ++s);
224 setvar(a, copys(s));
225 return(YES);
226 }
227
228return(NO);
229}
230
231
232struct varblock *varptr(v)
233char *v;
234{
235register struct varblock *vp;
236
237for(vp = firstvar; vp ; vp = vp->nxtvarblock)
238 if(! unequal(v , vp->varname))
239 return(vp);
240
241vp = ALLOC(varblock);
242vp->nxtvarblock = firstvar;
243firstvar = vp;
244vp->varname = copys(v);
245vp->varval = 0;
246return(vp);
247}
248
249
250fatal1(s, t)
251char *s, *t;
252{
253char buf[100];
254fatal( sprintf(buf, s, t) );
255}
256
257
258
259fatal(s)
260char *s;
261{
262if(s) fprintf(stderr, "Make: %s. Stop.\n", s);
263else fprintf(stderr, "\nStop.\n");
264#ifdef unix
265exit(1);
266#endif
267#ifdef gcos
268exit(0);
269#endif
270}
271
272
273
274yyerror(s)
275char *s;
276{
277char buf[50];
278extern int yylineno;
279
280fatal( sprintf(buf, "line %d: %s", yylineno, s) );
281}
282
283
284
285struct chain *appendq(head, tail)
286struct chain *head;
287char *tail;
288{
289register struct chain *p, *q;
290
291p = ALLOC(chain);
292p->datap = tail;
293
294if(head)
295 {
296 for(q = head ; q->nextp ; q = q->nextp)
297 ;
298 q->nextp = p;
299 return(head);
300 }
301else
302 return(p);
303}
304
305
306
307
308
309char *mkqlist(p)
310struct chain *p;
311{
312register char *qbufp, *s;
313static char qbuf[QBUFMAX];
314
315if(p == NULL)
316 {
317 qbuf[0] = '\0';
318 return;
319 }
320
321qbufp = qbuf;
322
323for( ; p ; p = p->nextp)
324 {
325 s = p->datap;
326 if(qbufp+strlen(s) > &qbuf[QBUFMAX-3])
327 {
328 fprintf(stderr, "$? list too long\n");
329 break;
330 }
331 while (*s)
332 *qbufp++ = *s++;
333 *qbufp++ = ' ';
334 }
335*--qbufp = '\0';
336return(qbuf);
337}