/* HTS_pattern_match: pattern matching function */ static HTS_Boolean HTS_pattern_match(const char *string, const char *pattern) { int i, j; int buff_length, max = 0, nstar = 0, nquestion = 0; char buff[HTS_MAXBUFLEN]; const int pattern_length = strlen(pattern); for (i = 0; i < pattern_length; i++) { switch (pattern[i]) { case '*': nstar++; break; case '?': nquestion++; max++; break; default: max++; } } if (nstar == 2 && nquestion == 0 && pattern[0] == '*' && pattern[i - 1] == '*') { /* only string matching is required */ buff_length = i - 2; for (i = 0, j = 1; i < buff_length; i++, j++) buff[i] = pattern[j]; buff[buff_length] = '\0'; if (strstr(string, buff) != NULL) return TRUE; else return FALSE; } else return HTS_dp_match(string, pattern, 0, (int) (strlen(string) - max)); }
/* HTS_dp_match: recursive matching */ static HTS_Boolean HTS_dp_match(const char *string, const char *pattern, const int pos, const int max) { if (pos > max) return FALSE; if (string[0] == '\0' && pattern[0] == '\0') return TRUE; if (pattern[0] == '*') { if (HTS_dp_match(string + 1, pattern, pos + 1, max) == 1) return TRUE; else return HTS_dp_match(string, pattern + 1, pos, max); } if (string[0] == pattern[0] || pattern[0] == '?') { if (HTS_dp_match(string + 1, pattern + 1, pos + 1, max + 1) == 1) return TRUE; } return FALSE; }