xref: /plan9-contrib/sys/src/cmd/mk/match.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include	"mk.h"
23e12c5d1SDavid du Colombier 
37dd7cddfSDavid du Colombier int
match(char * name,char * template,char * stem)43e12c5d1SDavid du Colombier match(char *name, char *template, char *stem)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 	Rune r;
73e12c5d1SDavid du Colombier 	int n;
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier 	while(*name && *template){
103e12c5d1SDavid du Colombier 		n = chartorune(&r, template);
113e12c5d1SDavid du Colombier 		if (PERCENT(r))
123e12c5d1SDavid du Colombier 			break;
133e12c5d1SDavid du Colombier 		while (n--)
143e12c5d1SDavid du Colombier 			if(*name++ != *template++)
153e12c5d1SDavid du Colombier 				return 0;
163e12c5d1SDavid du Colombier 	}
173e12c5d1SDavid du Colombier 	if(!PERCENT(*template))
183e12c5d1SDavid du Colombier 		return 0;
193e12c5d1SDavid du Colombier 	n = strlen(name)-strlen(template+1);
20*9a747e4fSDavid du Colombier 	if (n < 0)
21*9a747e4fSDavid du Colombier 		return 0;
227dd7cddfSDavid du Colombier 	if (strcmp(template+1, name+n))
233e12c5d1SDavid du Colombier 		return 0;
243e12c5d1SDavid du Colombier 	strncpy(stem, name, n);
253e12c5d1SDavid du Colombier 	stem[n] = 0;
263e12c5d1SDavid du Colombier 	if(*template == '&')
277dd7cddfSDavid du Colombier 		return !charin(stem, "./");
287dd7cddfSDavid du Colombier 	return 1;
293e12c5d1SDavid du Colombier }
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier void
subst(char * stem,char * template,char * dest,int dlen)32*9a747e4fSDavid du Colombier subst(char *stem, char *template, char *dest, int dlen)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	Rune r;
35*9a747e4fSDavid du Colombier 	char *s, *e;
363e12c5d1SDavid du Colombier 	int n;
373e12c5d1SDavid du Colombier 
38*9a747e4fSDavid du Colombier 	e = dest+dlen-1;
393e12c5d1SDavid du Colombier 	while(*template){
403e12c5d1SDavid du Colombier 		n = chartorune(&r, template);
413e12c5d1SDavid du Colombier 		if (PERCENT(r)) {
423e12c5d1SDavid du Colombier 			template += n;
43219b2ee8SDavid du Colombier 			for (s = stem; *s; s++)
44*9a747e4fSDavid du Colombier 				if(dest < e)
45219b2ee8SDavid du Colombier 					*dest++ = *s;
463e12c5d1SDavid du Colombier 		} else
47*9a747e4fSDavid du Colombier 			while (n--){
48*9a747e4fSDavid du Colombier 				if(dest < e)
49*9a747e4fSDavid du Colombier 					*dest++ = *template;
50*9a747e4fSDavid du Colombier 				template++;
51*9a747e4fSDavid du Colombier 			}
523e12c5d1SDavid du Colombier 	}
533e12c5d1SDavid du Colombier 	*dest = 0;
543e12c5d1SDavid du Colombier }
55