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