#include <fnmatch.h>
#include "ruby.h"

static mFnMatch;
static eFnMatchError;

static VALUE fnmatch_fnmatch(int argc, VALUE *argv, VALUE self)
{
    VALUE pattern, string, flags;
    int ret, fl;

    if (rb_scan_args(argc, argv, "21", &pattern, &string, &flags) == 3) {
        fl = NUM2INT(flags);
    }
    else {
        fl = 0;
    }
    ret = fnmatch(STR2CSTR(pattern), STR2CSTR(string), fl);
    switch (ret) {
    case 0:
        return Qtrue;
    case FNM_NOMATCH:
        return Qfalse;
    default:
        rb_raise(eFnMatchError, "failed to fnmatch(3)");
    }
}

void Init_fnmatch()
{
    mFnMatch = rb_define_module("FnMatch");
    rb_define_module_function(mFnMatch, "fnmatch", fnmatch_fnmatch, -1);
    rb_define_const(mFnMatch, "NOESCAPE", INT2NUM(FNM_NOESCAPE));
    rb_define_const(mFnMatch, "PATHNAME", INT2NUM(FNM_PATHNAME));
    rb_define_const(mFnMatch, "PERIOD", INT2NUM(FNM_PERIOD));

    eFnMatchError = rb_define_class_under(mFnMatch, "Error", rb_eStandardError);
}

