On 10/05/2016 06:09 PM, Nikolaus Rath wrote: > On Oct 05 2016, Julia Lawall <[email protected]> wrote: >> On Tue, 4 Oct 2016, Nikolaus Rath wrote: >> >>> Hello, >>> >>> In a set of C files, I would like to replace each instance of one type >>> (struct fasel_foo) with another type (struct fasel_bar). For instance, >>> >>> char* fasel_foo_print(struct fasel_foo *ptr) { >>> // ... >>> return "this struct fasel_foo string should not change"; >>> } >>> >>> should become >>> >>> char* fasel_foo_print(struct fasel_bar *ptr) { >>> // ... >>> return "this struct fasel_foo string should not change"; >>> } >>> >>> >>> Based on the LWN articles that I've read, this seems like the perfect >>> use-case for coccinelle. However, somehow I'm struggling to write a >>> patch for this. All the documentation that I could get my hands on seems >>> to describe more abstract changes that require the use of variables - >>> but as far as I can tell, I need something much simpler: >>> >>> @@ >>> "struct fasel_foo must be a type name!" >>> @@ >>> - struct fasel_foo >>> + struct fasel_bar >>> >>> >>> ...if only I knew what to put between the @@. >> >> Put nothing :) From the word struct it should figure out that it is >> working on a type. > > Oh, great! Thanks! > > > This solves my problem, but it makes me wonder how this generalizes to > other problems. For example, > > 1. What would I need to do if I don't want to replace a struct but > something typedef'd? (my_type *ptr --> new_type *ptr). Easy
@@ typedef my_type, new_type; @@ - my_type + new_type > 2. ..and how would I go about if instead of the type, I want to replace > a variable name? (my_type *ptr --> my_type *pointer). Depends on the exact circumstance. But that's easy to figure out. I recommend the workshop papers and tutorials from http://coccinelle.lip6.fr/papers.php; I wish I would have had those when I started with coccinelle. bye michael _______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
