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