smbrep.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "headers.h"
  2. int
  3. smbmatch(char *name, Reprog *rep)
  4. {
  5. Resub sub;
  6. sub.sp = nil;
  7. sub.ep = nil;
  8. if (regexec(rep, name, &sub, 1) && sub.sp == name && *sub.ep == 0)
  9. return 1;
  10. return 0;
  11. }
  12. Reprog *
  13. smbmkrep(char *pattern)
  14. {
  15. Reprog *r;
  16. int l;
  17. char *tmp, *p, *q, *t;
  18. l = strlen(pattern);
  19. tmp = smbemalloc(l * 5 + 1);
  20. t = tmp;
  21. p = pattern;
  22. while (*p) {
  23. if (*p == '*') {
  24. if (p[1] == '.') {
  25. strcpy(t, "[^.]*");
  26. t += 5;
  27. p++;
  28. }
  29. else {
  30. *t++ = '.';
  31. *t++ = '*';
  32. p++;
  33. }
  34. }
  35. else if (*p == '?') {
  36. for (q = p + 1; *q && *q == '?'; q++)
  37. ;
  38. if (*q == 0 || *q == '.') {
  39. /* at most n copies */
  40. strcpy(t, "[^.]?");
  41. t += 5;
  42. p++;
  43. }
  44. else {
  45. /* exactly n copies */
  46. strcpy(t, "[^.]");
  47. t += 4;
  48. p++;
  49. }
  50. }
  51. else if (strchr(".+{}()|\\^$", *p) != 0) {
  52. /* regexp meta */
  53. *t++ = '\\';
  54. *t++ = *p++;
  55. }
  56. else
  57. *t++ = *p++;
  58. }
  59. *t = 0;
  60. smblogprintif(smbglobals.log.rep, "%s => %s\n", pattern, tmp);
  61. r = regcomp(tmp);
  62. free(tmp);
  63. return r;
  64. }