On Sat, Jun 24 2017, Junio C. Hamano jotted: > Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > >> +struct wildmatch_compiled *wildmatch_compile(const char *pattern, unsigned int flags) >> +{ >> + struct wildmatch_compiled *code = xmalloc(sizeof(struct wildmatch_compiled)); >> + code->pattern = xstrdup(pattern); >> + code->flags = flags; >> + >> + return code; >> +} >> + >> +int wildmatch_match(struct wildmatch_compiled *code, const char *text) >> +{ >> + return wildmatch(code->pattern, text, code->flags); >> +} > > Is the far-in-the-future vision to make this the other way around? > That is, this being scaffolding, wildmatch_match() which is supposed > to be precompiled match actually uses wildmatch() as its underlying > engine, but when a viable compilation machinery is plugged in, the > wildmatch_match() that takes a precompiled pattern will call into > the machinery to execute the compiled pattern, and wildmatch() will > be reimplemented as "compile, call wildmatch_match() once and > discard" sequence? Exactly there would be no functional difference in the results, only fixed overhead. wildmatch() would be the one-off lazy interface and wildmatch_{compile,match,free}(), just like how you can have a wrapper function that calls regcomp() followed by regexec() & regfree(), but it's better to structure your code so you're not compiling & freeing the pattern all the time. Right now of course there's no difference in the behavior, and a trivially more overhead with the extra xstrdup() & free(), but I wanted to split up the discussion of the semantics of the interface from any actual behavior change in wildmatch() which would make use of it further down the line. > Otherwise I'd be worried about wildmatch() vs wildmatch_match() > introducing subtle behaviour differences that leads to hard to debug > problems.