#include <stdio.h>

int matchstar(int c, char *regexp, char*text);
int matchhere(char *regexp, char *text);

int match(char *regexp, char *text)
{
        if (regexp[0] == '^')
                return matchhere(regexp+1, text);
        do {
                if (matchhere(regexp, text))
                        return 1;
        } while (*text++ != '\0');
        return 0;
}

int matchstar(int c, char *regexp, char*text)
{
        do {
                if (matchhere(regexp, text))
                        return 1;
        } while (*text != '\0' && (*text++ == c || c == '.'));
        return 0;
}

int matchhere(char *regexp, char *text)
{
        if (regexp[0] == '\0')
                return 1;
        if (regexp[1] == '*')
                return matchstar(regexp[0], regexp+2, text);
        if (regexp[0] == '$' && regexp[1] == '\0')
                return *text == '\0';
        if (*text != '\0' && (regexp[0] == '.' || regexp[0] == *text))
                return matchhere(regexp+1, text+1);
        return 0;
}

void test(char *regexp, char *text, int expected)
{
        int res = match(regexp, text);
        if (res == expected)
                printf("[ OK ]");
        else
                printf("[FAIL]");
        printf("\t/%s ~ %s\t", regexp, text);
        if (res)
                printf("matching");
        else
                printf("not matching");
        printf("\n");
}

int main()
{
        test("a..*bb.*cd", "aababbcd", 1);
        test("a..*bb.*cd", "abcd", 0);
        test("a..*bb.*cd", "aa.bxcxd", 0);

        test("a.*.b.*c.*d", "abcd", 0);
        test("a.*.b.*c.*d", "aabcd", 1);
        test("a.*.b.*c.*d", "a.bcd", 1);
        test("a.*.b.*c.*d", "aa.bxcxd", 1);
        test("a.*.b.*c.*d", "aa.bxcd", 1);

        return 0;
}
