Re: [RFC/PATCH 2/3] wildmatch: add interface for precompiling wildmatch() patterns

2017-06-24 Thread Junio C Hamano
Ævar Arnfjörð Bjarmason  writes:

> On Sat, Jun 24 2017, Junio C. Hamano jotted:
>
>> 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.

OK, good!

Thanks.



Re: [RFC/PATCH 2/3] wildmatch: add interface for precompiling wildmatch() patterns

2017-06-24 Thread Ævar Arnfjörð Bjarmason

On Sat, Jun 24 2017, Junio C. Hamano jotted:

> Ævar Arnfjörð Bjarmason   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.


Re: [RFC/PATCH 2/3] wildmatch: add interface for precompiling wildmatch() patterns

2017-06-23 Thread Junio C Hamano
Ævar Arnfjörð Bjarmason   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?

Otherwise I'd be worried about wildmatch() vs wildmatch_match()
introducing subtle behaviour differences that leads to hard to debug
problems.