--- /dev/null
+
+@r@
+/* Matching a declaration, ie rewriting site candidate
+ Disqualify the candidate
+ ----------------- */
+type T;
+position p1;
+identifier id;
+@@
+
+T id@p1;
+
+
+
+
+@funcdecl@
+# Matching a /function/ declaration.
+# Disqualify the candidate
+#-----------------
+type T;
+position r.p1;
+identifier id;
+@@
+ T id@p1(...) {...}
+
+
+
+
+@funcproto@
+# Matching a function prototype w/o body.
+# Disqualify the candidate
+#-----------------
+type T;
+position r.p1;
+identifier id;
+@@
+ T id@p1(...);
+
+@localdeclaration@
+# Matching a declaration at the top level of a function.
+# Disqualify the candidate
+#-----------------
+type T1,T2;
+position r.p1;
+identifier id1,id2;
+@@
+
+T1 id1(...) {
+ ...
+ T2 id2@p1;
+ ...
+}
+
+@localinnerdeclaration@
+# The next rule is there to make sure that we are not speaking of a
+# local variable declared in an inner block. I don't like it at all:
+# It is redundent and gives false negative on the foreach macros that
+# get often declared in the code. Example in examples/gras/spawn.c:
+#
+# int server() {
+# ...
+# xbt_dynar_foreach(chunk->primes,cursor,data) {
+# char number[100];
+# ...
+# }
+# ...
+# }
+#
+# Do I really need to complicate this rule further to add every macro
+# that we use in our C, or can it be merged with the previous one by
+# saying something like "in a function, at whatever level of nesting"?
+
+type T1,T2;
+position r.p1;
+identifier id1,id2;
+expression e1,e2,e3;
+@@
+
+T1 id1(...) {
+ ...
+(
+ for (e1;e2;e3) { ... T2 id2@p1; ... }
+|
+ for (;e2;e3) { ... T2 id2@p1; ... }
+|
+ for (e1;;e3) { ... T2 id2@p1; ... }
+|
+ for (e1;e2;) { ... T2 id2@p1; ... }
+|
+ for (e1;;) { ... T2 id2@p1; ... }
+|
+ for (;e2;) { ... T2 id2@p1; ... }
+|
+ for (;;e3) { ... T2 id2@p1; ... }
+|
+ for (;;) { ... T2 id2@p1; ... }
+|
+ while (e1) { ... T2 id2@p1; ... }
+|
+ do { ... T2 id2@p1; ... } while (e1);
+)
+ ...
+}
+
+
+
+@script:python depends on r
+ && !funcdecl
+ && !funcproto
+ && !localdeclaration
+ && !localinnerdeclaration@
+
+# This rule is only a debugging rule, to print the sites where the
+# change must be applied
+
+p1 << r.p1;
+T << r.T;
+id << r.id;
+@@
+
+c1 = cocci.combine(id,p1)
+print "1. symbol %s of type \"%s\" at %s:%s" % (id,T,c1.location.line,c1.location.column)