On Wed, 30 Jun 2010, Lucas De Marchi wrote:

> Hi, I'm a developer of EFL libraries and recently we changed our API
> in a way that I think could be automated by Coccinelle. So, I started
> looking on this software yesterday.
> 
> What we did is changing the signature of some callback functions to
> return Eina_Bool instead of int. Eina_Bool is a typedef for unsigned
> char that is declared in a header included by Eina.h. I'm making some
> tests with the following snippet:
> 
> --------------
> #include <Eina.h>
> #include <Ecore.h>
> 
> static int test_func(void *data) {
>     if (data == NULL) {
>       ecore_main_loop_quit();
>         return 0;
>     }
> 
>     return 1;
> }
> 
> int main(void) {
>     ecore_init();
>     ecore_timer_add(1, test_func, 1);
>     ecore_main_loop_begin();
>     ecore_shutdown();
>     return 0;
> }
> ------------------------------
> 
> Applying the following semantic patch:
> 
> ------------------------------
> @r1@
> identifier fn;
> @@
> ecore_timer_add(..., fn, ...);
> 
> @r2@
> identifier r1.fn;
> identifier data;
> @@
> - int
> + Eina_Bool
> fn(void *data) {
> ...
> (
> - return 0;
> + return EINA_FALSE;
> |
> - return 1;
> + return EINA_TRUE;
> )
> ...
> }
> ---------------------------------
> 
> However it's not working because of that Eina_Bool. If I change
> Eina_Bool to char, it works as expected. I tried playing with the
> -all_includes and -I options but it doesn't work either. What am I
> doing wrong?

-all_includes and -I are for the .c file, but your problem is for the 
semantic patch.  In a semantic patch, you can declare new type names using 
typedef, among the metavariables.  So you should put:

@r2@
identifier r1.fn;
identifier data;
typedef Eina_bool;
@@

The declaration is taken into account for the entire rest of the semantic 
patch, not just the current rule.

julia

_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to