//kinda works now ..kinda
@initialize:python@
@@
coccinelle.pd={}
@r@
typedef int8_t,int16_t,int32_t,int64_t,uint8_t,uint16_t,uint32_t,uint64_t;
{int8_t,int16_t,int32_t,int64_t,
uint8_t,uint16_t,uint32_t,uint64_t} x;
type T;
T y;
expression list[n] es;
constant char[] c;
identifier f =~ ".*printf$";
position p;
@@
f(...,c@p,es,x@y,...)
@script:python collect@
p << r.p; // position
f << r.f; // func name
T << r.T; // the type of the argument of interest
c << r.c; // the format string
n << r.n; // the offset of the argument of interest, counted from 0
@@
import re
trex = re.compile("((uint\\S*_t)|(int\\S*_t))")//to match only typename(no
qualifiers)
m=trex.search(T)
t=m.group(1)
ps=("%s:(%s,%s),(%s,%s)::" %
(p[0].file,p[0].line,p[0].column,p[0].line_end,p[0].column_end))
if (ps in coccinelle.pd):
coccinelle.pd[ps][1][n]=t
else:
coccinelle.pd[ps]=[c,{n:t}]
@script:python fmt@
p << r.p; // position
c2;
@@
ps=("%s:(%s,%s),(%s,%s)::" %
(p[0].file,p[0].line,p[0].column,p[0].line_end,p[0].column_end))
in_str=False//inside string lit
in_pesc=False//seen a %
in_besc=False//seen a \
tps=coccinelle.pd[ps][1]//the types
import re
prex = re.compile("\s*(PRI([diouxX])(8|16|32|64))\s*")//to match existing
ones...
pmap= {
"int8_t" :{"c":"\"c\"","d":"PRId8", "i":"PRIi8", "o":"PRIo8", "u":"PRIu8",
"x":"PRIx8", "X":"PRIX8"},
"int16_t" :{"d":"PRId16", "i":"PRIi16", "o":"PRIo16", "u":"PRIu16",
"x":"PRIx16", "X":"PRIX16"},
"int32_t" :{"d":"PRId32", "i":"PRIi32", "o":"PRIo32", "u":"PRIu32",
"x":"PRIx32", "X":"PRIX32"},
"int64_t" :{"d":"PRId64", "i":"PRIi64", "o":"PRIo64", "u":"PRIu64",
"x":"PRIx64", "X":"PRIX64"},
"uint8_t" :{"c":"\"c\"","d":"PRIu8", "i":"PRIu8", "o":"PRIo8", "u":"PRIu8",
"x":"PRIx8", "X":"PRIX8"},
"uint16_t":{"d":"PRIu16", "i":"PRIu16", "o":"PRIo16", "u":"PRIu16",
"x":"PRIx16", "X":"PRIX16"},
"uint32_t":{"d":"PRIu32", "i":"PRIu32", "o":"PRIo32", "u":"PRIu32",
"x":"PRIx32", "X":"PRIX32"},
"uint64_t":{"d":"PRIu64", "i":"PRIu64", "o":"PRIo64", "u":"PRIu64",
"x":"PRIx64", "X":"PRIX64"},
}
fmt_ctr=0//some index
str_a=coccinelle.pd[ps][0]
coccinelle.c2=""
i=0
a=-1
while True:
if i>=len(str_a):
break
c=str_a[i]
if in_str==True:
if in_pesc==True:
if c=="%":
in_pesc=False
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1
else:
if c in "hlLqjzt"://size modifiers. mem index
of first one
if a==-1:
a=i
i+=1
elif c in "diouxXEeFfGgAacsCSP":
in_pesc=False
if a==-1:
a=i
fs="%s" % (fmt_ctr)
if fs in tps:
coccinelle.c2="%s\"%s\"" %
(coccinelle.c2,pmap[tps[fs]][c])
else:
coccinelle.c2="%s%s" %
(coccinelle.c2,str_a[a:(i+1)])
fmt_ctr+=1
i+=1
else://just append the prec stuff...
if c=="\"":
in_str=False
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1
elif in_besc==True:
in_besc=False
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1
else:
if c=="\\":
in_besc=True
elif c=="%":
in_pesc=True
a=-1
elif c=="\"":
in_str=False
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1
else:
if c=="\"":
in_str=True
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1;
else:
if in_pesc==True:
m=prex.match(str_a[i:])
fs="%s" % (fmt_ctr)
if m and (fs in tps):
i+=m.end();
coccinelle.c2="%s%s" %
(coccinelle.c2,pmap[tps[fs]][m.group(2)])
fmt_ctr+=1
in_pesc=False
else:
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1
else:
coccinelle.c2="%s%s" % (coccinelle.c2,c)
i+=1;
@q@
expression e;
position r.p;
identifier fmt.c2;
@@
- e@p
+ c2
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci