int match(char r, char t) { return r == '.' || r == t; } int matchstr(const char *r, const char *t) { int state = 0, i = (r[0] == '^' ? 1 : 0), j = 0; while (1) { if (r[i] == '\0') return 1; if (r[i] == '$' && r[i + 1] == '\0') return t[j] == '\0'; if (t[j] == '\0') return 0; if (state == 0) // base case { if (r[i + 1] == '*') state = 1; else if (match(r[i], t[j])) i++, j++; else if (r[0] == '^') return 0; else i = 0; } if (state == 1) // star { if (!match(r[i], t[j]) || match(r[i + 2], t[j])) state = 0, i += 2; else j++; } } return 0; } #include int main(int argc, char **argv) { if (argc != 3) { printf("Usage: %s \n", argv[0]); return 2; } return !matchstr(argv[1], argv[2]); }