match.c 856 B

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