`pathmatch`: a better `fnmatch`
====

This is an experiment to develop an improved alternative to [POSIX `fnmatch` function](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fnmatch.html). It can be used, for example, when implementing `.gitignore`-like functionality.

The module interface is currently a single global function, without extra options:

    pub fn pathmatch(pattern: &str, pathstring: &str) -> bool

Note: this implementation does not exactly match actual `.gitignore` and contains more functionality (e.g. `{}` patterns).

A quick taste of the idea
----

`*.txt` matches file names without path, if they end with ".txt":

    one.txt
    two.txt

`**.txt` matches any path ending with ".txt":

    one.txt
    two.txt
    foo/3.txt
    foo/bar/4.txt

`**/build/**` would match any path containing "build" folder anywhere in it, including the bare string `build` itself.

`**/build/{Debug,Release}` matches paths whose two last folders are either `build/Debug` or `build/Release`:

    build/Debug
    build/Release
    subproject1/build/Debug
    subproject1/build/Release

In other words, `**/` may match start of the path string, `/**` may match end of the path string, and `/**/` may match single path separator (`/`). To disable this behavior, explicitly require something to be present before/after: `*/**/build/{Debug,Release}`, `*/**/build/**/*`.

The `?` wildcard is also supported, matching exactly one character excluding path separator.

`pmfind` command line tool
----

You can use the included `pmfind` tool to test `pathmatch()` in real world:

      $ ./pmfind '{*.rs,Makefile}' '**/{logs,master}'
    pmfind.rs
    pathmatch.rs
    Makefile
    .git/refs/remotes/origin/master
    .git/refs/heads/master
    .git/logs
    .git/logs/refs/remotes/origin/master
    .git/logs/refs/heads/master

Usage:

    Usage:
            ./pmfind [options] [pattern ...]

    Options:
        -C --dir dir        change directory to this before starting
        -h --help           print help and exit

If a pattern starts with `!`, `pmfind` excludes paths matching it from output, otherwise those paths are printed. Patterns are applied in the order they appear on the command line, so the latest match decides whether the path will be printed. Paths that match no patterns are never printed. Example:

      $ ./pmfind '**/master'
    .git/refs/remotes/origin/master
    .git/refs/heads/master
    .git/logs/refs/remotes/origin/master
    .git/logs/refs/heads/master

      $ ./pmfind '**/master' '!**/logs/**'
    .git/refs/remotes/origin/master
    .git/refs/heads/master

      $ ./pmfind '**/master' '!**/logs/**' '**/logs/refs/heads/master'
    .git/refs/remotes/origin/master
    .git/refs/heads/master
    .git/logs/refs/heads/master

