xref: /plan9-contrib/sys/src/cmd/mk/match.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include	"mk.h"
2 
3 int
match(char * name,char * template,char * stem)4 match(char *name, char *template, char *stem)
5 {
6 	Rune r;
7 	int n;
8 
9 	while(*name && *template){
10 		n = chartorune(&r, template);
11 		if (PERCENT(r))
12 			break;
13 		while (n--)
14 			if(*name++ != *template++)
15 				return 0;
16 	}
17 	if(!PERCENT(*template))
18 		return 0;
19 	n = strlen(name)-strlen(template+1);
20 	if (n < 0)
21 		return 0;
22 	if (strcmp(template+1, name+n))
23 		return 0;
24 	strncpy(stem, name, n);
25 	stem[n] = 0;
26 	if(*template == '&')
27 		return !charin(stem, "./");
28 	return 1;
29 }
30 
31 void
subst(char * stem,char * template,char * dest,int dlen)32 subst(char *stem, char *template, char *dest, int dlen)
33 {
34 	Rune r;
35 	char *s, *e;
36 	int n;
37 
38 	e = dest+dlen-1;
39 	while(*template){
40 		n = chartorune(&r, template);
41 		if (PERCENT(r)) {
42 			template += n;
43 			for (s = stem; *s; s++)
44 				if(dest < e)
45 					*dest++ = *s;
46 		} else
47 			while (n--){
48 				if(dest < e)
49 					*dest++ = *template;
50 				template++;
51 			}
52 	}
53 	*dest = 0;
54 }
55