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