On Mon, Feb 24, 2020 at 08:01:36PM +0100, René Scharfe wrote: > > The changes in the patch obviously look all correct. > > > > I wonder how we can exploit Coccinelle to do this kind of > > transformations, though. Would it be possible to say > > > > * if we see "strchr(S, C1) || strchr(S, C2)", transform it to > > "strpbrk(S, concat(stringify(C1),stringify(C2)))"; and > > * if we see "strpbrk(S, N) || strchr(S, C)", transform it to > > "strpbrk(S, concat(N, stringify(C))"; > > > > and let the tool apply these two rules repeatedly, to catch the > > pattern to find any number of needle character in the same haystack? > > That would be nice. I briefly considered it, but I only can think of a > silly way to convert char literals to strings (by using one rule for > each possible character value), I don't know how to concatenate strings > in Coccinelle (simply putting them next to each other as in C doesn't > seem to work), and I don't know how to apply a rule recursively to allow > transforming an arbitrarily long chain of strchr() calls. :-/ I suspect you could do it with the python scripting interface of coccinelle. We haven't relied on that so far (since it's technically optional), but I think it would be worth doing if it makes impossible things possible (it also would make some existing very slow things much faster). As far as the recursive rules, I thought coccinelle would always re-apply rules to the result. So the two that Junio gave above would work (each application of the second one would suck up another strchr). But I also won't be surprised if I'm totally wrong; it wouldn't be the first time I've been puzzled by coccinelle. :) All that said, I don't plan to spend time on this. And I wouldn't really ask you or anyone to unless they find it fun or interesting. It seems like a lot of poking around for probably not that much benefit. -Peff